练习36 内存的动态分配实现雷霆战机小游戏

二级C语言必过教程

共 3221字,需浏览 7分钟

 ·

2021-07-21 05:26

点击蓝字

关注我们

DRAGON BOAT FESTIVAL




练习36



01 要求:

使用内存的动态分配实现雷霆战机小游戏


02 程序示例如下:


所用到的知识点:

1.结构体  struct

2.动态链表

3.条件语句 if

1.循环语句 while

5.指针 *p

6.内存的动态分配


#include <stdio.h>#include <stdlib.h>#include <graphics.h>#include <time.h>#include <conio.h>#pragma comment(lib,"winmm.lib")
//子弹 敌机typedef struct Node{ int x; int y;
struct Node* pnext;}ZiDan,DiJi;
ZiDan* pZidan = NULL; //pZidan 链表DiJi* pDiJi = NULL; //pDiJi 链表int xx = 100;int yy = 500;
//创建链表void CreateList(){ //子弹 pZidan = (ZiDan*)malloc(sizeof(ZiDan)); pZidan->pnext = NULL; //防止野指针
//敌机 pDiJi = (DiJi*)malloc(sizeof(DiJi)); pDiJi->pnext = NULL; //防止野指针}

//增加节点void AddNode(Node* P,int a) //形参 接收实参 a 区分到底是子弹还是敌机{ //定义一个新的节点 Node* pnew = NULL;
//为新的节点开辟空间 pnew = (Node*)malloc(sizeof(Node));
if (a == 1) //子弹 { //填充节点的内容 pnew->x = xx; pnew->y = yy; } else if (a == 2) //敌机 { pnew->x = rand() % 450; pnew->y = 0; }
//把节点连接起来 pnew->pnext =P->pnext; P->pnext = pnew;}
//判断子弹打到敌机void Shoot(){ DiJi* pdr = pDiJi->pnext; //临时的敌人节点用来遍历 DiJi* pdrpre = pDiJi; //pdr前一个节点 删除掉pdr ZiDan* pzd = pZidan->pnext; //临时的子弹节点 用来遍历子弹链表 ZiDan* pzdpre = pZidan;
while (pdr != NULL) //遍历所有的敌机 { pzd = pZidan->pnext; pzdpre = pZidan;
while (pzd != NULL) { if (pzd->x >= pdr->x - 10 && pzd->x <= pdr->x + 50 && pzd->y >= pdr->y - 20 && pzd->y <= pdr->y + 20) { pzdpre->pnext = pzd->pnext; //前一个和后一个连起来 free(pzd);

pdrpre->pnext = pdr->pnext; free(pdr);
pdr = pDiJi->pnext; pdrpre = pDiJi; break; } else { pzd = pzd->pnext; pzdpre = pzdpre->pnext; } }
pdr = pdr->pnext; pdrpre = pdrpre->pnext; }}
int main(){ initgraph(500, 600);
char ch;
PlaySound(L"./res/The Mass.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
srand((unsigned int)time(NULL));
//增加子弹的个数 //初始值位置 100 500
//创建链表 CreateList();
while (1) {//======================敌机================================================ //添加节点 AddNode(pDiJi, 2);

//显示节点的内容(数据用到绘制矩形上面去) Node* ptemp1 = pDiJi->pnext; while (ptemp1 != NULL) { //使用节点中的数据去绘制矩形 rectangle(ptemp1->x, ptemp1->y, ptemp1->x + 50, ptemp1->y + 20);
//控制这个矩形的移动 ptemp1->y += 20;
//指向下一个节点 ptemp1 = ptemp1->pnext; }//=======================子弹================================================ //添加节点 AddNode(pZidan,1);
Sleep(100); cleardevice();
//显示节点的内容(数据用到绘制矩形上面去) Node* ptemp = pZidan->pnext; while (ptemp != NULL) { //使用节点中的数据去绘制矩形 rectangle(ptemp->x, ptemp->y, ptemp->x + 10, ptemp->y + 20);
//控制这个矩形的移动 ptemp->y -= 20;
//指向下一个节点 ptemp = ptemp->pnext; }
Shoot();
if (kbhit()) { ch = getch();
switch (ch) {
case 75: xx -= 10; break;
case 77: xx += 10; break;
}
}
}


return 0;}






03:输出:




球分享

球点赞

球在看


浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报