当前位置:   article > 正文

C语言写飞机大战小游戏(有音乐背景和图片)_vs上用c语言写飞机大战

vs上用c语言写飞机大战

大家好 , 我是逼哥 , 记得每天好好学习 , 天天向上 , 尤其是大学生 . 不要荒废学业.

首先说明 , 我使用的开发环境是  vs2017  , 有些函数方法可能不通用 ,大家可以百度下其他方法. 向童老师致敬

原归正状 :

第一步 : 放置背景图和战斗机以及敌机和子弹头(静态)

效果图:

  1. #include <graphics.h>
  2. #include <conio.h>
  3. // 引用 Windows Multimedia API
  4. #pragma comment(lib,"Winmm.lib")
  5. #define width 591
  6. #define high 864
  7. //全局变量
  8. IMAGE img_bk; // 背景图片
  9. float air_x, air_y; // 飞机位置
  10. float bullet_x, bullet_y; // 子弹位置
  11. float enemy_x, enemy_y; // 敌机位置
  12. IMAGE img_air1, img_air2; // 正常飞机图片
  13. IMAGE img_airExplode1, img_airExplode2; // 爆炸飞机图片
  14. IMAGE img_bullet1, img_bullet2; // 子弹图片
  15. IMAGE img_enemyPlane1, img_enemyPlane2; // 敌机图片
  16. int isExpolde = 0; // 飞机是否爆炸
  17. int score = 0; // 得分
  18. void startup()
  19. {
  20. initgraph(width, high);
  21. loadimage(&img_bk, _T("D:\\桌面\\fighter\\background.jpg"));
  22. // 战斗机
  23. loadimage(&img_air1, _T("D:\\桌面\\fighter\\planeExplode_1.jpg"));
  24. loadimage(&img_air2, _T("D:\\桌面\\fighter\\planeExplode_2.jpg"));
  25. // 子弹
  26. loadimage(&img_bullet1, _T("D:\\桌面\\fighter\\bullet1.jpg"));
  27. loadimage(&img_bullet2, _T("D:\\桌面\\fighter\\bullet2.jpg"));
  28. // 敌机
  29. loadimage(&img_enemyPlane1, _T("D:\\桌面\\fighter\\enemyPlane1.jpg"));
  30. loadimage(&img_enemyPlane2, _T("D:\\桌面\\fighter\\enemyPlane2.jpg"));
  31. air_x = width / 2;
  32. air_y = high * 2 / 3;
  33. bullet_x = air_x + 118 / 2;
  34. bullet_y = air_y;
  35. enemy_x = width / 2;
  36. enemy_y = 0;
  37. BeginBatchDraw();
  38. //mciSendString(_T("open D:\\桌面\\super_bird\\background.mp3 alias bkmusic"), NULL, 0, NULL);//打开背景音乐
  39. //mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL); // 循环播放
  40. }
  41. void show()
  42. {
  43. putimage(0, 0, &img_bk); // 显示背景
  44. putimage(air_x, air_y, &img_enemyPlane1, NOTSRCERASE); // 遮罩透明处理
  45. putimage(air_x, air_y, &img_enemyPlane2, SRCINVERT);// 显示斗鸡
  46. // 子弹
  47. putimage(bullet_x, bullet_y, &img_bullet1, NOTSRCERASE); // 遮罩透明处理
  48. putimage(bullet_x, bullet_y, &img_bullet2, SRCINVERT);// 显示
  49. // 敌机
  50. putimage(enemy_x, enemy_y, &img_enemyPlane1, NOTSRCERASE); // 遮罩透明处理
  51. putimage(enemy_x, enemy_y, &img_enemyPlane2, SRCINVERT);// 显示
  52. FlushBatchDraw();
  53. Sleep(50);
  54. }
  55. void updateWithoutInput()
  56. {
  57. // 输入空格进行控制小鸟
  58. char input;
  59. if (_kbhit())
  60. {
  61. input = _getch();
  62. }
  63. }
  64. // 图形更新
  65. void updateWithInput()
  66. {
  67. }
  68. void gameover()
  69. {
  70. EndBatchDraw();
  71. _getch();
  72. closegraph();
  73. }
  74. int main()
  75. {
  76. startup(); // 数据初始化
  77. while (1) // 游戏循环执行
  78. {
  79. show(); // 显示画面
  80. updateWithoutInput(); // 界面的更新
  81. updateWithInput(); // 与用户输入有关的更新
  82. }
  83. gameover(); // 游戏结束、后续处理
  84. return 0;
  85. }

 

第二步: 操控

1. 移动战斗机 

2.发射子弹

3. 敌机下落

效果展示:

  1. #include <graphics.h>
  2. #include <conio.h>
  3. // 引用 Windows Multimedia API
  4. #pragma comment(lib,"Winmm.lib")
  5. #define width 591
  6. #define high 864
  7. //全局变量
  8. IMAGE img_bk; // 背景图片
  9. float air_x, air_y; // 飞机位置
  10. float bullet_x, bullet_y; // 子弹位置
  11. float enemy_x, enemy_y; // 敌机位置
  12. IMAGE img_air1, img_air2; // 正常飞机图片
  13. IMAGE img_airExplode1, img_airExplode2; // 爆炸飞机图片
  14. IMAGE img_bullet1, img_bullet2; // 子弹图片
  15. IMAGE img_enemyPlane1, img_enemyPlane2; // 敌机图片
  16. int isExpolde = 0; // 飞机是否爆炸
  17. int score = 0; // 得分
  18. void startup()
  19. {
  20. initgraph(width, high);
  21. loadimage(&img_bk, _T("D:\\桌面\\fighter\\background.jpg"));
  22. // 战斗机
  23. loadimage(&img_air1, _T("D:\\桌面\\fighter\\planeNormal_1.jpg"));
  24. loadimage(&img_air2, _T("D:\\桌面\\fighter\\planeNormal_2.jpg"));
  25. // 子弹
  26. loadimage(&img_bullet1, _T("D:\\桌面\\fighter\\bullet1.jpg"));
  27. loadimage(&img_bullet2, _T("D:\\桌面\\fighter\\bullet2.jpg"));
  28. // 敌机
  29. loadimage(&img_enemyPlane1, _T("D:\\桌面\\fighter\\enemyPlane1.jpg"));
  30. loadimage(&img_enemyPlane2, _T("D:\\桌面\\fighter\\enemyPlane2.jpg"));
  31. air_x = width / 2;
  32. air_y = high * 2 / 3;
  33. bullet_x = air_x + 118 / 2 -15; // 飞机宽度117 , 子弹宽度20
  34. bullet_y = air_y -24 ;
  35. enemy_x = width / 2;
  36. enemy_y = 0;
  37. BeginBatchDraw();
  38. //mciSendString(_T("open D:\\桌面\\super_bird\\background.mp3 alias bkmusic"), NULL, 0, NULL);//打开背景音乐
  39. //mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL); // 循环播放
  40. }
  41. void show()
  42. {
  43. putimage(0, 0, &img_bk); // 显示背景
  44. putimage(air_x, air_y, &img_air1, NOTSRCERASE); // 遮罩透明处理
  45. putimage(air_x, air_y, &img_air2, SRCINVERT);// 显示斗鸡
  46. // 子弹
  47. putimage(bullet_x, bullet_y, &img_bullet1, NOTSRCERASE); // 遮罩透明处理
  48. putimage(bullet_x, bullet_y, &img_bullet2, SRCINVERT);// 显示
  49. // 敌机
  50. putimage(enemy_x, enemy_y, &img_enemyPlane1, NOTSRCERASE); // 遮罩透明处理
  51. putimage(enemy_x, enemy_y, &img_enemyPlane2, SRCINVERT);// 显示
  52. FlushBatchDraw();
  53. Sleep(50);
  54. }
  55. void updateWithoutInput()
  56. {
  57. // 输入空格进行控制小鸟
  58. char input;
  59. if (_kbhit())
  60. {
  61. input = _getch();
  62. if (input == ' ' )
  63. {
  64. bullet_x = air_x + 118 / 2 - 15; // 飞机宽度117 , 子弹宽度20
  65. bullet_y = air_y - 24;
  66. }
  67. else if (input == 'a' && air_x > 0)
  68. air_x -= 20;
  69. else if (input == 'd' && air_x <> width - 117)
  70. air_x += 20;
  71. else if (input == 'w' && air_y > 0)
  72. air_y -= 20;
  73. else if (input == 's' && air_y < high - 120)
  74. air_y += 20;
  75. }
  76. }
  77. // 图形更新
  78. void updateWithInput()
  79. {
  80. if( bullet_y > -20)
  81. bullet_y -= 20;
  82. if (enemy_y < high)
  83. enemy_y ++;
  84. else
  85. {
  86. enemy_x = rand() % width;
  87. enemy_y = -120;
  88. }
  89. }
  90. void gameover()
  91. {
  92. EndBatchDraw();
  93. _getch();
  94. closegraph();
  95. }
  96. int main()
  97. {
  98. startup(); // 数据初始化
  99. while (1) // 游戏循环执行
  100. {
  101. show(); // 显示画面
  102. updateWithoutInput(); // 界面的更新
  103. updateWithInput(); // 与用户输入有关的更新
  104. }
  105. gameover(); // 游戏结束、后续处理
  106. return 0;
  107. }

 

第三步: 子弹射中敌机

1 .  击中敌机

2.  得分

3.撞击爆炸

效果图:

  1. #include <graphics.h>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. // 引用 Windows Multimedia API
  6. #pragma comment(lib,"Winmm.lib")
  7. #define width 591
  8. #define high 864
  9. //全局变量
  10. IMAGE img_bk; // 背景图片
  11. int air_x, air_y; // 飞机位置
  12. int bullet_x, bullet_y; // 子弹位置
  13. int enemy_x, enemy_y; // 敌机位置
  14. IMAGE img_air1, img_air2; // 正常飞机图片
  15. IMAGE img_airExplode1, img_airExplode2; // 爆炸飞机图片
  16. IMAGE img_bullet1, img_bullet2; // 子弹图片
  17. IMAGE img_enemyPlane1, img_enemyPlane2; // 敌机图片
  18. int isExpolde = 0; // 飞机是否爆炸
  19. int score = 0; // 得分
  20. void startup()
  21. {
  22. initgraph(width, high);
  23. loadimage(&img_bk, _T("D:\\桌面\\fighter\\background.jpg"));
  24. // 战斗机
  25. loadimage(&img_air1, _T("D:\\桌面\\fighter\\planeNormal_1.jpg"));
  26. loadimage(&img_air2, _T("D:\\桌面\\fighter\\planeNormal_2.jpg"));
  27. //爆炸
  28. loadimage(&img_airExplode1, _T("D:\\桌面\\fighter\\planeExplode_1.jpg"));
  29. loadimage(&img_airExplode2, _T("D:\\桌面\\fighter\\planeExplode_2.jpg"));
  30. // 子弹
  31. loadimage(&img_bullet1, _T("D:\\桌面\\fighter\\bullet1.jpg"));
  32. loadimage(&img_bullet2, _T("D:\\桌面\\fighter\\bullet2.jpg"));
  33. // 敌机
  34. loadimage(&img_enemyPlane1, _T("D:\\桌面\\fighter\\enemyPlane1.jpg"));
  35. loadimage(&img_enemyPlane2, _T("D:\\桌面\\fighter\\enemyPlane2.jpg"));
  36. air_x = width / 2;
  37. air_y = high * 2 / 3;
  38. //bullet_x = air_x + 118 / 2 - 15; // 飞机宽度117 , 子弹宽度20
  39. //bullet_y = air_y - 24;
  40. enemy_x = rand() % (width - 104); // 随机生成 104*148
  41. enemy_y = 50;
  42. BeginBatchDraw();
  43. //mciSendString(_T("open D:\\桌面\\super_bird\\background.mp3 alias bkmusic"), NULL, 0, NULL);//打开背景音乐
  44. //mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL); // 循环播放
  45. }
  46. void show()
  47. {
  48. putimage(0, 0, &img_bk); // 显示背景
  49. if (isExpolde == 0)
  50. {
  51. putimage(air_x, air_y, &img_air1, NOTSRCERASE); // 遮罩透明处理
  52. putimage(air_x, air_y, &img_air2, SRCINVERT);// 显示斗鸡
  53. // 子弹
  54. putimage(bullet_x, bullet_y, &img_bullet1, NOTSRCERASE); // 遮罩透明处理
  55. putimage(bullet_x, bullet_y, &img_bullet2, SRCINVERT);// 显示
  56. // 敌机
  57. putimage(enemy_x, enemy_y, &img_enemyPlane1, NOTSRCERASE); // 遮罩透明处理
  58. putimage(enemy_x, enemy_y, &img_enemyPlane2, SRCINVERT);// 显示
  59. }
  60. else
  61. {
  62. putimage(air_x, air_y, &img_airExplode1, NOTSRCERASE); // 遮罩透明处理
  63. putimage(air_x, air_y, &img_airExplode2, SRCINVERT);// 显示斗鸡
  64. }
  65. outtextxy(width *0.5, high *0.9, _T("得分:"));
  66. TCHAR s[5];
  67. swprintf_s(s, _T("%d"), score); // 高版本 VC 推荐使用 _stprintf_s 函数
  68. outtextxy(width *0.55, high *0.9, s);
  69. FlushBatchDraw();
  70. Sleep(50);
  71. }
  72. void gameover()
  73. {
  74. EndBatchDraw();
  75. _getch();
  76. closegraph();
  77. }
  78. void updateWithoutInput()
  79. {
  80. // 输入空格进行控制小鸟
  81. char input;
  82. if (_kbhit())
  83. {
  84. input = _getch();
  85. if (input == ' ' )
  86. {
  87. bullet_x = air_x + 118 / 2 - 15; // 飞机宽度117 , 子弹宽度20
  88. bullet_y = air_y - 24;
  89. }
  90. else if (input == 'a' && air_x > 0)
  91. air_x -= 20;
  92. else if (input == 'd' && air_x < width - 117)
  93. air_x += 20;
  94. else if (input == 'w' && air_y > 0)
  95. air_y -= 20;
  96. else if (input == 's' && air_y < high - 120)
  97. air_y += 20;
  98. }
  99. }
  100. // 图形更新
  101. void updateWithInput()
  102. {
  103. if( bullet_y > -20)
  104. bullet_y -= 20;
  105. if (enemy_y < high)
  106. enemy_y ++;
  107. else
  108. {
  109. enemy_x = rand() % (width - 104) ; // 随机生成 104*148
  110. enemy_y = 50 ;
  111. }
  112. //判断 子弹击中敌机 abs(enemy_y - bullet_y) + abs(enemy_x - bullet_x) < 50
  113. if ( (bullet_x > enemy_x) && (bullet_x < enemy_x + 104) && (bullet_y < enemy_y +148))
  114. {
  115. score++;
  116. enemy_x = rand() % (width - 104); // 随机生成 104*148
  117. enemy_y = 50;
  118. }
  119. // 撞机了
  120. if ((air_x > enemy_x) && (air_x < enemy_x + 104) && (air_y < enemy_y + 148))
  121. {
  122. isExpolde = 1;
  123. //gameover(); // 游戏结束、后续处理
  124. }
  125. }
  126. int main()
  127. {
  128. startup(); // 数据初始化
  129. while (1) // 游戏循环执行
  130. {
  131. show(); // 显示画面
  132. updateWithoutInput(); // 界面的更新
  133. updateWithInput(); // 与用户输入有关的更新
  134. }
  135. gameover(); // 游戏结束、后续处理
  136. return 0;
  137. }

 

可以添加音乐:

1.添加背景音效.

2.添加打击音效

  1. #include <graphics.h>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. // 引用 Windows Multimedia API
  6. #pragma comment(lib,"Winmm.lib")
  7. #define width 591
  8. #define high 864
  9. //全局变量
  10. IMAGE img_bk; // 背景图片
  11. int air_x, air_y; // 飞机位置
  12. int bullet_x, bullet_y; // 子弹位置
  13. int enemy_x, enemy_y; // 敌机位置
  14. IMAGE img_air1, img_air2; // 正常飞机图片
  15. IMAGE img_airExplode1, img_airExplode2; // 爆炸飞机图片
  16. IMAGE img_bullet1, img_bullet2; // 子弹图片
  17. IMAGE img_enemyPlane1, img_enemyPlane2; // 敌机图片
  18. int isExpolde = 0; // 飞机是否爆炸
  19. int score = 0; // 得分
  20. void startup()
  21. {
  22. initgraph(width, high);
  23. loadimage(&img_bk, _T("D:\\桌面\\fighter\\background.jpg"));
  24. // 战斗机
  25. loadimage(&img_air1, _T("D:\\桌面\\fighter\\planeNormal_1.jpg"));
  26. loadimage(&img_air2, _T("D:\\桌面\\fighter\\planeNormal_2.jpg"));
  27. //爆炸
  28. loadimage(&img_airExplode1, _T("D:\\桌面\\fighter\\planeExplode_1.jpg"));
  29. loadimage(&img_airExplode2, _T("D:\\桌面\\fighter\\planeExplode_2.jpg"));
  30. // 子弹
  31. loadimage(&img_bullet1, _T("D:\\桌面\\fighter\\bullet1.jpg"));
  32. loadimage(&img_bullet2, _T("D:\\桌面\\fighter\\bullet2.jpg"));
  33. // 敌机
  34. loadimage(&img_enemyPlane1, _T("D:\\桌面\\fighter\\enemyPlane1.jpg"));
  35. loadimage(&img_enemyPlane2, _T("D:\\桌面\\fighter\\enemyPlane2.jpg"));
  36. air_x = width / 2;
  37. air_y = high * 2 / 3;
  38. //bullet_x = air_x + 118 / 2 - 15; // 飞机宽度117 , 子弹宽度20
  39. //bullet_y = air_y - 24;
  40. enemy_x = rand() % (width - 104); // 随机生成 104*148
  41. enemy_y = 50;
  42. BeginBatchDraw();
  43. mciSendString(_T("open D:\\桌面\\fighter\\game_music.mp3 alias bkmusic"), NULL, 0, NULL);//打开背景音乐
  44. mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL); // 循环播放
  45. }
  46. void show()
  47. {
  48. putimage(0, 0, &img_bk); // 显示背景
  49. if (isExpolde == 0)
  50. {
  51. putimage(air_x, air_y, &img_air1, NOTSRCERASE); // 遮罩透明处理
  52. putimage(air_x, air_y, &img_air2, SRCINVERT);// 显示斗鸡
  53. // 子弹
  54. putimage(bullet_x, bullet_y, &img_bullet1, NOTSRCERASE); // 遮罩透明处理
  55. putimage(bullet_x, bullet_y, &img_bullet2, SRCINVERT);// 显示
  56. // 敌机
  57. putimage(enemy_x, enemy_y, &img_enemyPlane1, NOTSRCERASE); // 遮罩透明处理
  58. putimage(enemy_x, enemy_y, &img_enemyPlane2, SRCINVERT);// 显示
  59. }
  60. else
  61. {
  62. putimage(air_x, air_y, &img_airExplode1, NOTSRCERASE); // 遮罩透明处理
  63. putimage(air_x, air_y, &img_airExplode2, SRCINVERT);// 显示斗鸡
  64. }
  65. outtextxy(width *0.5, high *0.9, _T("得分:"));
  66. TCHAR s[5];
  67. swprintf_s(s, _T("%d"), score); // 高版本 VC 推荐使用 _stprintf_s 函数
  68. outtextxy(width *0.55, high *0.9, s);
  69. FlushBatchDraw();
  70. Sleep(50);
  71. }
  72. void gameover()
  73. {
  74. EndBatchDraw();
  75. _getch();
  76. closegraph();
  77. }
  78. void updateWithoutInput()
  79. {
  80. // 输入空格进行控制小鸟
  81. char input;
  82. if (_kbhit())
  83. {
  84. input = _getch();
  85. if (input == ' ' )
  86. {
  87. bullet_x = air_x + 118 / 2 - 15; // 飞机宽度117 , 子弹宽度20
  88. bullet_y = air_y - 24;
  89. }
  90. else if (input == 'a' && air_x > 0)
  91. air_x -= 20;
  92. else if (input == 'd' && air_x < width - 117)
  93. air_x += 20;
  94. else if (input == 'w' && air_y > 0)
  95. air_y -= 20;
  96. else if (input == 's' && air_y < high - 120)
  97. air_y += 20;
  98. }
  99. }
  100. // 图形更新
  101. void updateWithInput()
  102. {
  103. if( bullet_y > -20)
  104. bullet_y -= 20;
  105. if (enemy_y < high)
  106. enemy_y ++;
  107. else
  108. {
  109. enemy_x = rand() % (width - 104) ; // 随机生成 104*148
  110. enemy_y = 50 ;
  111. }
  112. //判断 子弹击中敌机 abs(enemy_y - bullet_y) + abs(enemy_x - bullet_x) < 50
  113. if ( (bullet_x > enemy_x) && (bullet_x < enemy_x + 104) && (bullet_y < enemy_y +148))
  114. {
  115. score++;
  116. enemy_x = rand() % (width - 104); // 随机生成 104*148
  117. enemy_y = 50;
  118. mciSendString(_T("close gemusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
  119. mciSendString(_T("open D:\\桌面\\fighter\\gotEnemy.mp3 alias gemusic"), NULL, 0, NULL); // 打开音乐
  120. mciSendString(_T("play gemusic"), NULL, 0, NULL); // 仅播放一次
  121. score++;
  122. if (score>0 && score % 5 == 0 && score % 2 != 0)
  123. {
  124. mciSendString(_T("close 5music"), NULL, 0, NULL); // 先把前面一次的音乐关闭
  125. mciSendString(_T("open D:\\桌面\\fighter\\5.mp3 alias 5music"), NULL, 0, NULL); // 打开音乐
  126. mciSendString(_T("play 5music"), NULL, 0, NULL); // 仅播放一次
  127. }
  128. if (score % 10 == 0)
  129. {
  130. mciSendString(_T("close 10music"), NULL, 0, NULL); // 先把前面一次的音乐关闭
  131. mciSendString(_T("open D:\\桌面\\fighter\\10.mp3 alias 10music"), NULL, 0, NULL); // 打开音乐
  132. mciSendString(_T("play 10music"), NULL, 0, NULL); // 仅播放一次
  133. }
  134. }
  135. // 撞机了
  136. if ((air_x > enemy_x) && (air_x < enemy_x + 104) && (air_y < enemy_y + 148))
  137. {
  138. isExpolde = 1;
  139. //gameover(); // 游戏结束、后续处理
  140. mciSendString(_T("close exmusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
  141. mciSendString(_T("open D:\\桌面\\fighter\\explode.mp3 alias 10music"), NULL, 0, NULL); // 打开音乐
  142. mciSendString(_T("play exmusic"), NULL, 0, NULL); // 仅播放一次
  143. }
  144. }
  145. int main()
  146. {
  147. startup(); // 数据初始化
  148. while (1) // 游戏循环执行
  149. {
  150. show(); // 显示画面
  151. updateWithoutInput(); // 界面的更新
  152. updateWithInput(); // 与用户输入有关的更新
  153. }
  154. gameover(); // 游戏结束、后续处理
  155. return 0;
  156. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号