这是我以前写的一款游戏(主要是用C写的),我已经忘记我是怎么写的逻辑了,在加上都是简单版本的,所以我就不讲解了,大家可以自己借鉴一下,等以后我做完整版的会发讲解的。
学C学的差不多的,可以拿这个练手,感觉逻辑不难,挺简单的。
//定义头文件 #include#include #include #include #include #pragma comment(lib,"winmm.lib") IMAGE bei_jing;//定义背景图像 IMAGE wan_jia[2];//定义玩家生图像 IMAGE wan_jia_si[2];//定义玩家死图像 IMAGE zi_dan[2];//定义子弹图像 IMAGE di_ji[2][2];//定义子弹图像 enum bei_jing//窗口宽度与高度 { kuan = 480,//宽度 gao = 700,//高度 zi_dan_shu = 15,//玩家子弹数 di_ji_shu = 10,//敌机数 da,xiao,//大小敌机 }; //窗口宽度与高度设置 struct Fei_Ji//玩家飞机与子弹与敌机 { double x, y;//坐标 bool sheng_si;//生死 int kuan, gao,hp, lei_xing; }WanJia,ZiDan[zi_dan_shu],DiJi[di_ji_shu]; //玩家飞机与子弹与敌机 bool Timer(int ms,int id)//定时器 { static DWORD t[10]; if (clock() - t[id] > ms)//延时ms毫秒 { t[id] = clock();//重置 return true; } return false; } //定时器 void loadimage()//载入图像 { //载入背景图像 loadimage(&bei_jing, "./images/background.jpg"); //载入玩家图像 loadimage(&wan_jia[0], "./images/planeNormal_1.jpg"); loadimage(&wan_jia[1], "./images/planeNormal_2.jpg"); //载入玩家死图像 loadimage(&wan_jia_si[0], "./images/planeBoom_1.jpg"); loadimage(&wan_jia_si[1], "./images/planeBoom_2.jpg"); //载入子弹图像 loadimage(&zi_dan[0], "./images/bullet1.jpg"); loadimage(&zi_dan[1], "./images/bullet2.jpg"); //载入敌机图像 loadimage(&di_ji[0][0], "./images/enemy_1.jpg"); loadimage(&di_ji[0][1], "./images/enemy_2.jpg"); loadimage(&di_ji[1][0], "./images/enemyPlane1.jpg"); loadimage(&di_ji[1][1], "./images/enemyPlane2.jpg"); } //载入图像 void EnemyHp(int i)//敌机的hp { if (rand() % 5 == 0) { DiJi[i].lei_xing = da; DiJi[i].hp = 3; DiJi[i].kuan = 104; DiJi[i].gao = 148; } else { DiJi[i].lei_xing = xiao; DiJi[i].hp = 1; DiJi[i].kuan = 52; DiJi[i].gao = 39; } } //敌机的hp void GameInit()//初始化 { //载入图像 loadimage(); //初始化玩家 WanJia.x = kuan / 2-60.0; WanJia.y = gao - 120.0; WanJia.hp = 3; WanJia.kuan=117; WanJia.gao=120; WanJia.sheng_si = true; //初始化子弹 for (int i = 0; i < zi_dan_shu; i++) { ZiDan[i].x = 0; ZiDan[i].y = 0; ZiDan[i].sheng_si = false; } //初始化敌机 for (int i = 0; i < di_ji_shu; i++) { DiJi[i].sheng_si = false; EnemyHp(i); } } //初始化 void GameDraw()//显示图像 { //显示背景 putimage(0, 0, &bei_jing); //显示玩家 putimage((int)WanJia.x, (int)WanJia.y, &wan_jia[0],NOTSRCERASE); putimage((int)WanJia.x, (int)WanJia.y, &wan_jia[1],SRCINVERT); //显示子弹 for (int i = 0; i < zi_dan_shu; i++) { if (ZiDan[i].sheng_si) { putimage((int)ZiDan[i].x, (int)ZiDan[i].y, &zi_dan[0], NOTSRCERASE); putimage((int)ZiDan[i].x, (int)ZiDan[i].y, &zi_dan[1], SRCINVERT); break; } } //显示敌机 for (int i = 0; i < di_ji_shu; i++) { if (DiJi[i].sheng_si) { if(DiJi[i].lei_xing == xiao) { putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[0][0], NOTSRCERASE); putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[0][1], SRCINVERT); } else { putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[1][0], NOTSRCERASE); putimage((int)DiJi[i].x, (int)DiJi[i].y, &di_ji[1][1], SRCINVERT); } } } if (WanJia.hp<=0) { putimage((int)WanJia.x, (int)WanJia.y, &wan_jia_si[0], NOTSRCERASE); putimage((int)WanJia.x, (int)WanJia.y, &wan_jia_si[1], SRCINVERT); Timer(1000000000,2); } //显示玩家死亡 } //显示图像 void CreateBullet()//创建一个子弹 { for (int i = 0; i < zi_dan_shu; i++) { if (!ZiDan[i].sheng_si) { //子弹BGM mciSendString("close ZIDANBGM", 0, 0, 0); mciSendString("open ./images/f_gun.mp3 alias ZIDANBGM", 0, 0, 0); mciSendString("play ZIDANBGM", 0, 0, 0); ZiDan[i].x = WanJia.x+45; ZiDan[i].y = WanJia.y; ZiDan[i].sheng_si = true; break; } } } //创建一个子弹 void BulletMove()//子弹移动 { for (int i = 0; i < zi_dan_shu; i++) { if (ZiDan[i].sheng_si) { ZiDan[i].y -= 1; if (ZiDan[i].y < 0) ZiDan[i].sheng_si = false; break; } } } //子弹移动 void PlayerMove(double yi_dong)//玩家操作 { #if 0 if (_kbhit()) { char ming_ling = _getch();//得到命令 switch (ming_ling) { case 'w': case 'w': WanJia.y -= yi_dong;//上 break; case 's': case 's': WanJia.y += yi_dong;//下 break; case 'a': case 'a': WanJia.x -= yi_dong;//左 break; case 'd': case 'd': WanJia.x += yi_dong;//右 break; } } #elif 1 if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W'))//上 { if (WanJia.y > 0)//上边界 WanJia.y -= yi_dong;//上移0.1 } if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S'))//下 { if (WanJia.y < gao - 110.0)//下边界 WanJia.y += yi_dong;//下移0.1 } if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A'))//左 { if (WanJia.x > -30)//左边界 WanJia.x -= yi_dong;//左移0.1 } if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D'))//右 { if (WanJia.x < kuan - 70.0)//右边界 WanJia.x += yi_dong;//右移0.1 } #endif if (GetAsyncKeyState(VK_SPACE)&&Timer(300,1))//延时500毫秒 { //创建一个子弹 CreateBullet(); } } //玩家操作 void CreateEnemy()//产生敌机 { for (int i = 0; i < di_ji_shu; i++) { if (!DiJi[i].sheng_si) { DiJi[i].sheng_si = true; EnemyHp(i); DiJi[i].x = rand() % (kuan-60); DiJi[i].y = 0; break; } } } //产生敌机 void EnemyMove(double sheep)//敌机移动 { for (int i = 0; i < di_ji_shu; i++) { if (DiJi[i].sheng_si) { if (rand() % 2 == 0 && DiJi[i].x > 0) { DiJi[i].x -= 1; } if (rand() % 2 == 0 && DiJi[i].x < (int)(480 - DiJi[i].kuan)) { DiJi[i].x += 1; } else { } DiJi[i].y += sheep; if (DiJi[i].y > gao) { DiJi[i].sheng_si = false; } } } } //敌机移动 void PlayPlance()//打飞机 { for (int i = 0; i < di_ji_shu; i++) { if (!DiJi[i].sheng_si) continue; for (int j = 0; j < zi_dan_shu; j++) { if(!ZiDan[j].sheng_si) continue; if (ZiDan[j].x > DiJi[i].x && ZiDan[j].x< DiJi[i].x + DiJi[i].gao && ZiDan[j].y>DiJi[i].y && ZiDan[j].y < DiJi[i].y + DiJi[i].kuan) { //死亡BGM mciSendString("close SIWANGBGM", 0, 0, 0); mciSendString("open ./images/explode.mp3 alias SIWANGBGM", 0, 0, 0); mciSendString("play SIWANGBGM", 0, 0, 0); ZiDan[j].sheng_si = false; DiJi[i].hp--; } } if (DiJi[i].hp<=0) { DiJi[i].sheng_si = false; } } } //打飞机 void PlayPlayer()//打玩家 { for (int i = 0; i < di_ji_shu; i++) { if (!DiJi[i].sheng_si) continue; if (DiJi[i].x > WanJia.x && DiJi[i].x< WanJia.x + WanJia.gao && DiJi[i].y>WanJia.y && DiJi[i].y < WanJia.y + WanJia.kuan) { //死亡BGM mciSendString("close SIWANGBGM", 0, 0, 0); mciSendString("open ./images/explode.mp3 alias SIWANGBGM", 0, 0, 0); mciSendString("play SIWANGBGM", 0, 0, 0); DiJi[i].sheng_si = false; WanJia.hp--; } } } //打玩家 int Shu()//输 { if (WanJia.hp <= 0) { return true; } return false; } //输 int main() { //游戏BGM mciSendString("open ./images/game_music.mp3 alias GAMEBGM", 0, 0, 0); mciSendString("play GAMEBGM repeat", 0, 0, 0); //创建窗口 initgraph(kuan, gao); //初始化 GameInit(); //双缓存 BeginBatchDraw(); while (1) { //打玩家 PlayPlayer(); //显示图像 GameDraw(); FlushBatchDraw(); //玩家操作 PlayerMove(0.1); //子弹移动 BulletMove(); //产生敌机 if (Timer(500,0)) { CreateEnemy(); } //敌机移动 EnemyMove(0.03); //打飞机 PlayPlance(); //输 if (Shu()) break; } EndBatchDraw(); return 0; } //主函数



