当前位置: 首页 > ai >正文

项目实战-飞机大战【补档】

和项目实战-贪吃蛇大作战【补档】-CSDN博客一样,这也是一个我在大一和网友完成的项目的补档。Don't waste your youth—time flies.

目录

1.工具&环境

2.项目简介

3.需求文档

4.流程图 

5.产品原型图 

6.可行性分析

7.源代码

8.实战效果 ​编辑

9.心得 

(10.AI测评)


1.工具&环境

工具名称         功能

gitee                代码合并

easyx              C++图形绘图

Excel               需求文档

Processon       功能流程图

墨刀                 产品原型图

环境

windows & C++环境

2.项目简介

飞机大战游戏是以太空主题的画面为游戏背景,模拟三体世界观的设定,是一个界面简洁流畅、游戏方式简单的小游戏,由玩家通过鼠标控制我方战机向三体文明发动进攻。战机初始有一定量的血量,屏幕上随机产生敌机,战机产生的数量和当前关卡,关卡越高,产生的敌机越多,游戏难度越大,玩家可通过氪金降低游戏难度。玩家需要操作战机躲避敌方子弹,战机可拾取装备提升战力。我方战机与敌机只要中弹都会减血,直至血槽为空,战机爆炸,关卡内所有敌机爆炸后通关,全部关卡通过后游戏结束。


3.需求文档

4.流程图 

5.产品原型图 

 

 

6.可行性分析

我找不到了ฅ(꒪˙꒳˙꒪ )ฅ ,不过肯定是可行性更大的doge

7.源代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<easyx.h>
#include<stdlib.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <graphics.h>
#pragma comment(lib,"winmm.lib")
#pragma comment( lib, "MSIMG32.LIB")
#include <Windows.h>   // 引入 Windows API 头文件
#define MAX_PLAYERS 20  // 最大玩家数量typedef struct {int score;
} Player;//玩家结构体Player leaderboard[MAX_PLAYERS];void transparentimage3(IMAGE* dstimg, int x, int y, IMAGE* srcimg);
void transparentimage3(IMAGE* dstimg, int x, int y, IMAGE* srcimg) //新版png
{HDC dstDC = GetImageHDC(dstimg);HDC srcDC = GetImageHDC(srcimg);int w = srcimg->getwidth();int h = srcimg->getheight();BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };AlphaBlend(dstDC, x, y, w, h, srcDC, 0, 0, w, h, bf);
}//输出透明贴图函数
#define MAX 100
IMAGE BOSS;
IMAGE ZHANJI;
IMAGE DIJI;
IMAGE JINGYING;
IMAGE ZIDAN;
IMAGE HEDAN;
IMAGE MYZIDAN;
int count = 0;  //得分者的排号
int jiemian_x = 422;    //界面宽度
int jiemian_y = 750;    //界面长度
const clock_t FPS = 1000 / 60;    //每一帧应该花费的时间
int speed = 10;  //定义我方战机移动速度
int zidan_w = 25;   //定义子弹宽度
int zidan_h = 25;   //定义子弹长度
int zidan_sh = 10;  //定义子弹伤害
int hedan_sh = 100; //定义核弹伤害
int w = 70; //定义战机宽度
int h = 70; //定义战机高度
int x = 200;    //定义战机x坐标
int y = 700;    //定义战机y坐标
int hp = 10;
ExMessage   msg;    //定义消息结构体
typedef struct
{int x;int y;int a;  // 是否有出场权int hp; //血量int speed;  //速度
}qwe;   //定义敌机的参数
typedef struct
{int x;int y;int a;int hp;int speed;
}asd;   //定义精英敌机的参数
typedef struct
{int x;int y;int w;int hp;int h;int a;int speed;
}zxc;   //定义boss敌机的参数
typedef struct
{int x;int y;int a;int m;  //标识符,0代表属于敌方,1代表属于我方
}rty;   //定义敌方子弹参数
typedef struct
{int x;int y;int a;
}fgh;   //定义核弹参数
zxc boss[10];
rty zidan[MAX];
fgh hedan[MAX];
asd jingying[MAX] = { 0 };
qwe diji[MAX] = { 0 };
int dan_speed;
struct MenuItem
{int x, y, width, height; // 选项的位置和宽、高COLOR16 bgColor; // 选项的背景色char text[100]; // 选项的文本
};void ishit();void win(int score);
void botton(int x, int y, int w, int h);
void menu();
void gameintroduce();
void finish();
bool shifou(int x, int y, int w, int h);
void shubiao(void);
void nomal_botton(int left, int top, int right, int bottom, const char* text);
void Game_Fighter(void);    //游戏界面函数
void Game_xunhuan(void);  //游戏界面的循环函数
void chushihua_diji(void);  //敌机初始化函数
void gengxin_diji(void);    //敌机参数更新函数
void chuchangquan_diji(void);   //敌机出场权函数
void shifouxiaoshi_diji(void);      //敌机是否消失函数
void yidong_zhanji(void);   //我方战机移动函数
void chuchangquan_jingying(void);//精英敌机出场权函数
void dayinjiemian(int);   //打印界面函数
void hedanchuchangquan(void); //核弹出场权函数
void zidanchuchangquan(void);//子弹出场权函数
void mydanchuchangquan(void);   //我方子弹出场权函数
void hetiao(void);  //boss横跳函数
void kouxue(void);  //扣血机制函数
void suspend(); //暂停界面
int comparePlayers(const void* a, const void* b);
void updateLeaderboard(Player* players, int numPlayers);
void drawLeaderboard();
void Game_xunhuan(void)
{int starttime;int endtime;int k = 1;  //计数器int m = 0;//boss技能启动装置while (true){starttime = clock();BeginBatchDraw();dayinjiemian(k);FlushBatchDraw();peekmessage(&msg, EX_KEY);k %= 1800;k++;//printf("%d\n",k);if (k % 600 == 0 && !m) //每隔10秒发动一次boss技能m = 1;if (m){m++;hetiao();if ((m - 1) % ((jiemian_x) / boss[0].speed) == 0)m = 0;}if (k % 5 == 0)//每隔一秒就自动生成一个敌机{mydanchuchangquan();if (k % 30 == 0 && !m) //每隔0.5秒生成一个核弹,同时boss不处于技能中hedanchuchangquan();if (k % 10 == 0 && m)  //每隔0.1秒生成一个核弹,boss处于技能中hedanchuchangquan();if (k % 30 == 0)zidanchuchangquan();    //每隔0.5秒生成一个敌方的子弹if (k % 300 == 0)    //每隔5秒生成一个精英战机chuchangquan_jingying();if (k % 600 == 0 && diji[0].speed < 3)//到一定速度之后,速度将不再变化{for (int i = 0; i < MAX; i++){diji[i].speed++;jingying[i].speed++;}  //每隔10秒敌机速度加一dan_speed++;}if (k % 60 == 0) //每隔一秒生成一个普通敌机chuchangquan_diji();}yidong_zhanji();gengxin_diji();kouxue();shifouxiaoshi_diji();if (hp <= 0){updateLeaderboard(leaderboard + count, MAX_PLAYERS);win(leaderboard[count].score);//drawLeaderboard();count++;}msg.message = 0;endtime = clock();Sleep(FPS - (endtime - starttime));}
}
void kouxue(void)
{int i = 0;int j;for (i = 0; i < MAX; i++){if (i < MAX){if (hedan[i].a){int m_x = (hedan[i].x * 2 + w) / 2;int m_y = hedan[i].y;if (m_x <= x + w && m_x >= x && m_y <= y + h && m_y >= y){hedan[i].a = 0;hp--;}}}if (zidan[i].a){if (zidan[i].m){int m_x = (zidan[i].x * 2 + zidan_w) / 2;int m_y = zidan[i].y;if (m_x >= boss[0].x && m_x <= boss[0].x + boss[0].w && m_y <= boss[0].y + boss[0].h && m_y >= boss[0].y && boss[0].a){zidan[i].a = 0;zidan[i].m = 0;boss[0].hp--;continue;}for (j = 0; j < MAX; j++){if (diji[j].a || jingying[j].a){if (m_x >= diji[j].x && m_x <= diji[j].x + w && m_y <= diji[j].y + h && m_y >= diji[j].y && diji[i].a){zidan[i].a = 0;zidan[i].m = 0;diji[j].hp--;break;}if (m_x >= jingying[j].x && m_x <= jingying[j].x + w && m_y <= jingying[j].y + h && m_y >= jingying[j].y && jingying[i].a){zidan[i].a = 0;zidan[i].m = 0;jingying[j].hp--;break;}}}}if (!zidan[i].m){int m_x = (zidan[i].x * 2 + zidan_w) / 2;int m_y = zidan[i].y;if (m_x <= x + w && m_x > x && m_y <= y + h && m_y >= y){hp--;zidan[i].a = 0;}}}}
}
void mydanchuchangquan(void)
{for (int j = 0; j < MAX; j++){if (!zidan[j].a && !zidan[j].m){zidan[j].a = 1;zidan[j].m = 1;zidan[j].x = x + (w - zidan_w) / 2;zidan[j].y = y;break;}}
}
void hetiao(void)
{if (boss[0].a){boss[0].x += boss[0].speed;boss[0].x %= jiemian_x - boss[0].w;}
}
void hedanchuchangquan(void)
{if (boss[0].a){for (int i = 0; i < MAX; i++){if (!hedan[i].a){hedan[i].x = boss[0].x + (boss[0].w - w) / 2;hedan[i].y = boss[0].y + boss[0].h;hedan[i].a = 1;break;}}}
}
void zidanchuchangquan(void)
{for (int i = 0; i < MAX; i++){if (diji[i].a){for (int j = 0; j < MAX; j++){if (!zidan[j].a){zidan[j].a = 1;zidan[j].x = diji[i].x + (w - zidan_w) / 2;zidan[j].y = diji[i].y + h;break;}}}if (jingying[i].a){for (int j = 0; j < MAX; j++){if (!zidan[j].a){zidan[j].a = 1;zidan[j].x = jingying[i].x + (w - zidan_w) / 2;zidan[j].y = jingying[i].y + h;break;}}}}
}
void dayinjiemian(int k)
{//static int m = 0;   //标识符cleardevice();if (k % 1800 == 0 && boss[0].a == 0){transparentimage3(NULL, boss[0].x, boss[0].y, &BOSS);boss[0].a = 1;}//30秒生成一个bossif (boss[0].a){transparentimage3(NULL, boss[0].x, boss[0].y, &BOSS);}transparentimage3(NULL, x, y, &ZHANJI);     //打印我方战机for (int i = 0; i < MAX; i++)   //打印敌方战机{if (diji[i].a)transparentimage3(NULL, diji[i].x, diji[i].y, &DIJI);if (jingying[i].a)transparentimage3(NULL, jingying[i].x, jingying[i].y, &JINGYING);if (hedan[i].a)transparentimage3(NULL, hedan[i].x, hedan[i].y, &HEDAN);}for (int i = 0; i < MAX; i++){if (zidan[i].a && !zidan[i].m)transparentimage3(NULL, zidan[i].x, zidan[i].y, &ZIDAN);if (zidan[i].a && zidan[i].m)transparentimage3(NULL, zidan[i].x, zidan[i].y, &MYZIDAN);}
}
void chushihua_diji(void) //敌机初始化函数
{int i;srand(time(NULL));for (i = 0; i < MAX; i++){diji[i].x = rand() % (jiemian_x - w);diji[i].y = rand() % (jiemian_y / 4);diji[i].a = 0;diji[i].hp = 1;diji[i].speed = 1;jingying[i].x = rand() % (jiemian_x - w);jingying[i].y = rand() % (jiemian_y / 4);jingying[i].a = 0;jingying[i].hp = 2;jingying[i].speed = 1;hedan[i].a = 0;}for (int i = 0; i < MAX; i++){zidan[i].a = 0;zidan[i].m = 0;}boss[0].x = ((jiemian_x - w) / 2);boss[0].y = (jiemian_y / 5);boss[0].hp = 1000;boss[0].w = 100;boss[0].h = 100;boss[0].a = 0;boss[0].speed = 5;loadimage(&BOSS, "tupian/boss.png", boss[0].w, boss[0].h);loadimage(&ZHANJI, "tupian/zhanji.png", w, h);loadimage(&DIJI, "tupian/diji.png", w, h);loadimage(&JINGYING, "tupian/jingying.png", w, h);dan_speed = 2 * diji[0].speed;loadimage(&ZIDAN, "tupian/zidan.png", zidan_w, zidan_h);loadimage(&HEDAN, "tupian/hedan.png", w, h);loadimage(&MYZIDAN, "tupian/myzidan.png", zidan_w, zidan_h);
}
void Game_Fighter(void) //游戏界面函数
{chushihua_diji();Game_xunhuan();
}void gengxin_diji(void)//敌机参数更新函数
{for (int i = 0; i < MAX; i++){if (diji[i].a)diji[i].y += diji[i].speed;if (jingying[i].a)jingying[i].y += jingying[i].speed;if (hedan[i].a)hedan[i].y += dan_speed;}for (int i = 0; i < MAX; i++){if (zidan[i].a && !zidan[i].m)zidan[i].y += dan_speed;if (zidan[i].a && zidan[i].m)zidan[i].y -= (dan_speed + 2);}
}void chuchangquan_diji(void)//敌机出场权函数
{for (int i = 0; i < MAX; i++){if (!diji[i].a){diji[i].a = 1;break;}}
}void chuchangquan_jingying(void)//精英敌机出场权函数
{for (int i = 0; i < MAX; i++){if (!jingying[i].a){jingying[i].a = 1;break;}}
}void shifouxiaoshi_diji(void)//敌机是否消失函数
{if (boss[0].hp <= 0){boss[0].a = 0;boss[0].hp = 1000;leaderboard[count].score += 10;}for (int i = 0; i < MAX; i++){if (diji[i].a){if (diji[i].y + h >= jiemian_y || diji[i].hp <= 0){if (diji[i].hp <= 0)leaderboard[count].score++;diji[i].a = 0;diji[i].x = rand() % (jiemian_x - w);diji[i].y = rand() % (jiemian_y / 4);diji[i].hp = 1;}}if (jingying[i].a){if (jingying[i].y + h >= jiemian_y || jingying[i].hp <= 0){if (jingying[i].hp <= 0)leaderboard[count].score++;jingying[i].a = 0;jingying[i].x = rand() % (jiemian_x - w);jingying[i].y = rand() % (jiemian_y / 4);jingying[i].hp = 2;}}if (hedan[i].a){if (hedan[i].y + h >= jiemian_y){hedan[i].a = 0;}}}for (int i = 0; i < MAX; i++){if (zidan[i].a && !zidan[i].m){if (zidan[i].y + zidan_h >= jiemian_y){zidan[i].a = 0;}}if (zidan[i].a && zidan[i].m){if (zidan[i].y <= 0){zidan[i].a = 0;zidan[i].m = 0;}}}
}void yidong_zhanji(void)//我方战机移动函数
{if (msg.message == WM_KEYDOWN){switch (msg.vkcode){case 'W':if (y - speed >= 0)y -= speed;break;case 'S':if (y + h + speed <= jiemian_y)y += speed;break;case 'A':if (x - speed >= 0)x -= speed;break;case 'D':if (x + w + speed <= jiemian_x)x += speed;break;case VK_ESCAPE: //按下esc键时暂停suspend();}}
}void suspend() {//initgraph(422, 750); // 初始化窗口大小为422*750setbkcolor(WHITE); // 设置背景// 设置字体颜色为蓝色settextcolor(BLUE);while (true){BeginBatchDraw();cleardevice(); // 清屏// 绘制暂停界面文字settextstyle(30, 0, _T("宋体"));outtextxy(130, 200, _T("游戏已暂停"));settextstyle(20, 0, _T("宋体"));outtextxy(150, 300, _T("按空格键继续"));FlushBatchDraw();msg.message = 0;peekmessage(&msg, EX_KEY);if (msg.vkcode == VK_SPACE)Game_xunhuan();}// 用sleep暂停等待空格键按下//while (!GetAsyncKeyState(VK_SPACE)) {   //当空格键未按下时//    Sleep(100); // 持续等待100毫秒//}//按下空格键后会跳出等待循环,接着进入游戏就好//closegraph(); // 关闭图形窗口}
void ishit() {while (true){if (peekmessage(&msg, EX_MOUSE)){if (msg.message == WM_LBUTTONDOWN && shifou(100, 300, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{drawLeaderboard();//跳转排行榜页面break;}if (msg.message == WM_LBUTTONDOWN && shifou(100, 400, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{menu();break;}}}
}void win(int score) {cleardevice();IMAGE background;loadimage(&background, "./menu1.jpg", 0, 0);putimage(0, 0, &background);settextstyle(35, 20, "微软雅黑");outtextxy(130, 100, "游戏胜利");botton(100, 200, 233, 40);outtextxy(100, 200, "当前得分:");//显示得分//nomal_botton(100, 300, 333, 340, "排行榜");botton(100, 400, 233, 40);nomal_botton(100, 400, 333, 440, "返回菜单");FlushBatchDraw();ishit();
}int comparePlayers(const void* a, const void* b) {return ((Player*)b)->score - ((Player*)a)->score;
}void updateLeaderboard(Player* players, int numPlayers) {// 复制玩家数据到排行榜数组memcpy(leaderboard, players, numPlayers * sizeof(Player));// 排序排行榜qsort(leaderboard, numPlayers, sizeof(Player), comparePlayers);
}void drawLeaderboard() {// 初始化图形窗口大小settextstyle(20, 0, _T("宋体"));  // 设置字体样式setbkmode(TRANSPARENT);            // 设置背景透明// 绘制标题outtext(_T("飞机大战排行榜"));// 绘制排行榜内容char buffer[50];for (int i = 0; i < MAX_PLAYERS; i++) {sprintf_s(buffer, sizeof(buffer), "%d. Score: %d", i + 1, leaderboard[i].score);outtextxy(100, 50 + i * 30, buffer);}// 等待用户点击关闭按钮while (!GetAsyncKeyState(VK_ESCAPE)) {Sleep(100);}}void botton(int x, int y, int w, int h)
{setlinecolor(BLACK);setfillcolor(RGB(195, 201, 201));fillroundrect(x, y, x + w, y + h, 5, 5);
}void menu()
{IMAGE img_mm;loadimage(&img_mm, "./menu1.jpg");putimage(0, 0, &img_mm);HWND startwindow = GetHWnd();//获取窗口句柄SetWindowText(startwindow, "飞机大战");//设置窗口标题BeginBatchDraw();botton(100, 100, 233, 40);//第一个按钮nomal_botton(100, 100, 333, 140, "开始游戏");botton(100, 200, 233, 40);//第二个按钮nomal_botton(100, 200, 333, 240, "排行榜");botton(100, 300, 233, 40);//第三个按钮nomal_botton(100, 300, 333, 340, "游戏介绍");删除以下按钮部分 botton(100, 400, 233, 40);nomal_botton(100, 400, 333, 440, "退出游戏");FlushBatchDraw();shubiao();
}
void gameintroduce()
{cleardevice();IMAGE background;loadimage(&background, "./menu1.jpg");putimage(0, 0, &background);outtextxy(140, 20, "游戏简介");settextstyle(20, 0, "宋文");outtextxy(0, 60, "飞机大战游戏是以太空主题的画面为游戏背景。");outtextxy(0, 80, "拟三体世界观的设定,是一个简洁流畅,游戏方式");outtextxy(0, 100, "式简单的小游戏,由玩家通过鼠标控制我方战机");outtextxy(0, 120, "通过鼠标控制我方战机向三体文明发动进攻。战");outtextxy(0, 140, "战机初始有一定量的血量,屏幕上随机产生敌机,");outtextxy(0, 160, "战机产生的数量和当前关卡难度有关,关卡越难");outtextxy(0, 180, "产生的敌机越多,游戏难度越大,玩家可通过氪");outtextxy(0, 200, "金降低游戏难度。游戏过程中玩家需要操作战机");outtextxy(0, 220, "躲避敌方子弹,战机可拾取装备提升战力。我方战机与敌机只要");outtextxy(0, 240, "中弹都会减血,直至血槽为空,战机爆炸,关卡");outtextxy(0, 260, "内所有敌机爆炸后通关,全部关卡通过后游戏结");outtextxy(0, 280, "束。");BeginBatchDraw();botton(230, 700, 180, 40);nomal_botton(230, 700, 410, 740, "返回菜单");FlushBatchDraw();while (1){if (peekmessage(&msg, EX_MOUSE)){if (msg.message == WM_LBUTTONDOWN && shifou(230, 700, 180, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{menu();break;}}}
}
void finish()
{exit(0);
}bool shifou(int x, int y, int w, int h)
{if (msg.x >= x && msg.x <= x + w && msg.y >= y && msg.y <= y + h)return true;return false;
}void nomal_botton(int left, int top, int right, int bottom, const char* text)//正常状态按钮
{setbkmode(TRANSPARENT);//设置字体背景透明char lingshi_text[50] = { 0 };//按钮内容strcpy(lingshi_text, text);//获取内容settextstyle(35, 20, "微软雅黑");//设置字体settextcolor(BLACK);int text_x = left + (right - left - textwidth(lingshi_text)) / 2;//内容横坐标int text_y = top + (bottom - top - textheight(lingshi_text)) / 2;//内容纵坐标outtextxy(text_x, text_y, lingshi_text);
}void shubiao(void)
{while (true){//存放矩形相关参数if (peekmessage(&msg, EX_MOUSE)){if (msg.message == WM_LBUTTONDOWN && shifou(100, 100, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{Game_Fighter();   //关卡选择界面break;}if (msg.message == WM_LBUTTONDOWN && shifou(100, 200, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{drawLeaderboard();break;}if (msg.message == WM_LBUTTONDOWN && shifou(100, 300, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{gameintroduce();break;}if (msg.message == WM_LBUTTONDOWN && shifou(100, 400, 233, 40))  //诺鼠标在对应矩形内且按下左键的话,将要跳转当相应界面{finish();break;}}}
}int main()
{initgraph(422, 750, EX_SHOWCONSOLE);//400x600setbkcolor(WHITE);cleardevice();mciSendString("open ./background.WMA alias BGM", 0, 0, 0);mciSendString("play BGM repeat", 0, 0, 0);menu();getchar();closegraph();return 0;
}
//1.定义我方战机参数   hao
//2.用一个结构体来表示敌方战机参数  hao
//3.用结构体数组表示多个战机 hao
//4.用循环来同时打印多个地方战机 hao
//5.用随机函数来生成敌方战机的坐标 hao
//6.用取模函数来规范坐标范围 hao
//7.用更新函数更新敌方战机坐标hao
//8.按照一定频率来生成敌方战机   hao
//9.初始化敌方战机参数函数 hao
//10.给予敌方战机出场权  hao
//11.判断战机是否消失   hao
//12.敌方战机随着时间的增加,速度变得越来越快   hao
//13.隔比较长的时间会生成精英怪  hao
//14.再隔比较长的时间会生成boss,boss不会移动   hao
//15.定义子弹核弹的参数  hao
//16.子弹核弹的出场权函数 hao
//17.子弹核弹的更新函数  hao
//18.子弹核弹的消失函数  hao
//23.子弹核弹打印函数   hao
//19.boss隔一段时间会反复横跳 hao
//20.扣血机制   hao
//22.boss每隔一段时间五连发子弹
//23.飞机不能移动出界面外面    hao
//24.降低核弹的速度 降低子弹的速度   hao
// boss横跳技能时,攻击速度加快 
//25.随着时间增加 血量增加 速度增加 boss数量增加
/*战机函数:打印战机:我方:按血量打印(完美/微瑕/战损/gg)敌方:按不同敌机类型打印(小怪/精英怪/boos)战机参数:血条,移速,攻速,攻击力,攻击类型移动方式:我方:使用wsad自由移动敌方:顶部有规律随机生成(按时间/游戏进程/击杀小怪数量/……),随敌机类型顶部生成后规律移动(缓慢直线下降/缓慢直线追踪下降/缓慢左右移动/……)*/

8.实战效果 

9.心得 

相较于第一次项目项目实战-贪吃蛇大作战【补档】-CSDN博客,大一做第二次项目的我已经能够更加自如地和组员们进行交流协作,也再次感受到了沟通的魅力,最后还是想引用第一次项目的心得来结束:人生每个阶段都有各个阶段你会遇到的人,重要的是一起变得更好,一起向远方

(10.AI测评)

---

### **1. 项目结构**
- **头文件和库依赖**:
  - 包含了 `easyx.h`、`Windows.h` 等头文件,使用了 EasyX 图形库进行图形绘制。
  - 使用了 `mciSendString` 播放背景音乐。
  - 通过 `#pragma comment` 链接了 `winmm.lib` 和 `MSIMG32.LIB`。

- **宏定义**:
  - 定义了多个常量,如 `MAX_PLAYERS`(最大玩家数)、`MAX`(最大敌机数)、`FPS`(帧率控制)等。
  - 使用了 `_CRT_SECURE_NO_WARNINGS` 禁用安全警告。

- **数据结构**:
  - 定义了多个结构体(如 `Player`、`qwe`、`asd`、`zxc` 等)来表示玩家、敌机、子弹、核弹等游戏元素的参数。

---

### **2. 核心功能**
#### **2.1 游戏主循环**
- **`Game_xunhuan` 函数**:
  - 控制游戏的主循环,包括帧率控制、敌机生成、子弹发射、碰撞检测等。
  - 使用 `clock()` 和 `Sleep()` 实现帧率限制。

#### **2.2 游戏初始化**
- **`chushihua_diji` 函数**:
  - 初始化敌机、精英敌机、核弹、子弹等参数。
  - 使用 `rand()` 随机生成敌机的初始位置。

#### **2.3 界面绘制**
- **`dayinjiemian` 函数**:
  - 绘制游戏界面,包括玩家战机、敌机、子弹、核弹等。
  - 使用 `transparentimage3` 实现透明图像绘制。

#### **2.4 玩家操作**
- **`yidong_zhanji` 函数**:
  - 通过键盘输入(`WASD`)控制玩家战机的移动。
  - 按下 `ESC` 键时调用 `suspend` 函数暂停游戏。

#### **2.5 碰撞检测**
- **`kouxue` 函数**:
  - 检测子弹、核弹与玩家战机、敌机、BOSS 的碰撞。
  - 根据碰撞结果更新血量和状态。

#### **2.6 排行榜**
- **`updateLeaderboard` 和 `drawLeaderboard` 函数**:
  - 使用 `qsort` 对玩家分数进行排序。
  - 绘制排行榜界面。

#### **2.7 菜单和其他界面**
- **`menu` 函数**:
  - 绘制主菜单,提供开始游戏、查看排行榜、游戏介绍、开发人员信息等选项。
- **`gameintroduce` 和 `Developer` 函数**:
  - 分别显示游戏介绍和开发人员信息。

---

### **3. 优点**
1. **功能完整**:
   - 包括游戏主循环、敌机生成、子弹发射、碰撞检测、排行榜等核心功能。
   - 提供了暂停、菜单、排行榜等辅助功能。

2. **模块化设计**:
   - 使用了多个函数和结构体,便于代码的维护和扩展。

3. **图形效果**:
   - 使用 EasyX 图形库实现了透明图像绘制和界面美化。

4. **游戏逻辑清晰**:
   - 通过计数器和时间控制实现了敌机生成、BOSS 技能等逻辑。

http://www.xdnf.cn/news/2965.html

相关文章:

  • 【AI面试准备】模型自动化评估
  • C++学习:六个月从基础到就业——异常处理:机制与最佳实践
  • Qt5与现代OpenGL学习(三)纹理
  • 极狐GitLab 如何使用文件导出迁移项目和群组?
  • 机器学习day4-Knn+交叉验证api练习(预测facebook签到位置)
  • QT6链接mysql数据库
  • SQL实战:04之SQL中的分组问题求解
  • 深度学习·经典模型·VisionTransformer
  • 串口通信协议
  • (004)Excel 监视窗口
  • 系统分析师-第十三、十四章
  • 算法设计:分支限界法的基础原理与应用
  • Element:Cheack多选勾选效果逻辑判断
  • 区块链最佳框架:Truffle vs Hardhat vs Brownie
  • partition_pdf 和chunk_by_title 的区别
  • package.json文件中的 ^ 和 ~
  • DOM 事件的处理通常分为三个阶段:捕获、目标、冒泡【前端示例】
  • 京东关键词与商品详情信息数据采集接口指南
  • python jupyter notebook
  • 如何搭建一个简单的文件服务器的方法
  • JavaScript学习教程,从入门到精通,jQuery快速入门指南(30)
  • 建立对人工智能(AI)的信任
  • Oracle11g——空表无法导出的问题
  • 软件分析师-第三遍-章节导图-13/14
  • 基础排序方法
  • 【C++11】新的类功能、lambda
  • SICAR 标准功能块 FB3352 (MODE)工作模式功能块
  • 是否想要一个桌面哆啦A梦的宠物
  • 特征工程四-2:使用GridSearchCV 进行超参数网格搜索(Hyperparameter Tuning)的用途
  • 基于开闭原则优化数据库查询语句拼接方法