C++_写游戏—打飞机、飞机大战

﹏ヽ暗。殇╰゛Y 2023-06-16 08:26 136阅读 0赞

看到某位大牛的游戏博客,感觉装逼真的太好使了,哈哈

  1. #include<iostream>
  2. #include<windows.h>
  3. #include<conio.h>
  4. #include<time.h>
  5. #include<string>
  6. using namespace std;
  7. /*=============== all the structures ===============*/
  8. typedef struct Frame
  9. {
  10. COORD position[2];
  11. int flag;
  12. }Frame;
  13. /*=============== all the functions ===============*/
  14. void SetPos(COORD a)// set cursor
  15. {
  16. HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
  17. SetConsoleCursorPosition(out, a);
  18. }
  19. void SetPos(int i, int j)// set cursor
  20. {
  21. COORD pos = { i, j };
  22. SetPos(pos);
  23. }
  24. void HideCursor()
  25. {
  26. CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
  27. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
  28. }
  29. //把第y行,[x1, x2) 之间的坐标填充为 ch
  30. void drawRow(int y, int x1, int x2, char ch)
  31. {
  32. SetPos(x1, y);
  33. for (int i = 0; i <= (x2 - x1); i++)
  34. cout << ch;
  35. }
  36. //在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
  37. void drawRow(COORD a, COORD b, char ch)
  38. {
  39. if (a.Y == b.Y)
  40. drawRow(a.Y, a.X, b.X, ch);
  41. else
  42. {
  43. SetPos(0, 25);
  44. cout << "error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
  45. system("pause");
  46. }
  47. }
  48. //把第x列,[y1, y2] 之间的坐标填充为 ch
  49. void drawCol(int x, int y1, int y2, char ch)
  50. {
  51. int y = y1;
  52. while (y != y2 + 1)
  53. {
  54. SetPos(x, y);
  55. cout << ch;
  56. y++;
  57. }
  58. }
  59. //在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
  60. void drawCol(COORD a, COORD b, char ch)
  61. {
  62. if (a.X == b.X)
  63. drawCol(a.X, a.Y, b.Y, ch);
  64. else
  65. {
  66. SetPos(0, 25);
  67. cout << "error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
  68. system("pause");
  69. }
  70. }
  71. //左上角坐标、右下角坐标、用row填充行、用col填充列
  72. void drawFrame(COORD a, COORD b, char row, char col)
  73. {
  74. drawRow(a.Y, a.X + 1, b.X - 1, row);
  75. drawRow(b.Y, a.X + 1, b.X - 1, row);
  76. drawCol(a.X, a.Y + 1, b.Y - 1, col);
  77. drawCol(b.X, a.Y + 1, b.Y - 1, col);
  78. }
  79. void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
  80. {
  81. COORD a = { x1, y1 };
  82. COORD b = { x2, y2 };
  83. drawFrame(a, b, row, col);
  84. }
  85. void drawFrame(Frame frame, char row, char col)
  86. {
  87. COORD a = frame.position[0];
  88. COORD b = frame.position[1];
  89. drawFrame(a, b, row, col);
  90. }
  91. void drawPlaying()
  92. {
  93. drawFrame(0, 0, 48, 24, '=', '|');// draw map frame;
  94. drawFrame(49, 0, 79, 4, '-', '|');// draw output frame
  95. drawFrame(49, 4, 79, 9, '-', '|');// draw score frame
  96. drawFrame(49, 9, 79, 20, '-', '|');// draw operate frame
  97. drawFrame(49, 20, 79, 24, '-', '|');// draw other message frame
  98. SetPos(52, 6);
  99. cout << "得分:";
  100. SetPos(52, 7);
  101. cout << "称号:";
  102. SetPos(52, 10);
  103. cout << "操作方式:";
  104. SetPos(52, 12);
  105. cout << " a,s,d,w 控制战机移动。";
  106. SetPos(52, 14);
  107. cout << " p 暂停游戏。";
  108. SetPos(52, 16);
  109. cout << " e 退出游戏。";
  110. }
  111. //在[a, b)之间产生一个随机整数
  112. int random(int a, int b)
  113. {
  114. int c = (rand() % (a - b)) + a;
  115. return c;
  116. }
  117. //在两个坐标包括的矩形框内随机产生一个坐标
  118. COORD random(COORD a, COORD b)
  119. {
  120. int x = random(a.X, b.X);
  121. int y = random(a.Y, b.Y);
  122. COORD c = { x, y };
  123. return c;
  124. }
  125. bool judgeCoordInFrame(Frame frame, COORD spot)
  126. {
  127. if (spot.X >= frame.position[0].X)
  128. if (spot.X <= frame.position[1].X)
  129. if (spot.Y >= frame.position[0].Y)
  130. if (spot.Y <= frame.position[0].Y)
  131. return true;
  132. return false;
  133. }
  134. void printCoord(COORD a)
  135. {
  136. cout << "( " << a.X << " , " << a.Y << " )";
  137. }
  138. void printFrameCoord(Frame a)
  139. {
  140. printCoord(a.position[0]);
  141. cout << " - ";
  142. printCoord(a.position[1]);
  143. }
  144. int drawMenu()
  145. {
  146. SetPos(30, 1);
  147. cout << "P l a n e W a r";
  148. drawRow(3, 0, 79, '-');
  149. drawRow(5, 0, 79, '-');
  150. SetPos(28, 4);
  151. cout << "w 和 s 选择, k 确定";
  152. SetPos(15, 11);
  153. cout << "1. 简单的敌人";
  154. SetPos(15, 13);
  155. cout << "2. 冷酷的敌人";
  156. drawRow(20, 0, 79, '-');
  157. drawRow(22, 0, 79, '-');
  158. SetPos(47, 11);
  159. cout << "简单的敌人:";
  160. SetPos(51, 13);
  161. cout << "简单敌人有着较慢的移动速度。";
  162. SetPos(24, 21);
  163. cout << "制作:Andy";
  164. int j = 11;
  165. SetPos(12, j);
  166. cout << ">>";
  167. //drawFrame(45, 9, 79, 17, '=', '|');
  168. while (1)
  169. {
  170. if (_kbhit())
  171. {
  172. char x = _getch();
  173. switch (x)
  174. {
  175. case 'w':
  176. {
  177. if (j == 13)
  178. {
  179. SetPos(12, j);
  180. cout << " ";
  181. j = 11;
  182. SetPos(12, j);
  183. cout << ">>";
  184. SetPos(51, 13);
  185. cout << "            ";
  186. SetPos(47, 11);
  187. cout << "简单的敌人:";
  188. SetPos(51, 13);
  189. cout << "简单敌人有着较慢的移动速度,比较容易对付";
  190. }
  191. break;
  192. }
  193. case 's':
  194. {
  195. if (j == 11)
  196. {
  197. SetPos(12, j);
  198. cout << " ";
  199. j = 13;
  200. SetPos(12, j);
  201. cout << ">>";
  202. SetPos(51, 13);
  203. cout << "              ";
  204. SetPos(47, 11);
  205. cout << "冷酷的敌人:";
  206. SetPos(51, 13);
  207. cout << "冷酷的敌人移动速度较快,难对付哟。";
  208. }
  209. break;
  210. }
  211. case 'k':
  212. {
  213. if (j == 8) return 1;
  214. else return 2;
  215. }
  216. }
  217. }
  218. }
  219. }
  220. /* DWORD WINAPI MusicFun(LPVOID lpParamte) { //DWORD OBJ; sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC); return 0; } */
  221. /*================== the Game Class ==================*/
  222. class Game
  223. {
  224. public:
  225. COORD position[10];
  226. COORD bullet[10];
  227. Frame enemy[8];
  228. int score;
  229. int rank;
  230. int rankf;
  231. string title;
  232. int flag_rank;
  233. Game();
  234. //初始化所有
  235. void initPlane();
  236. void initBullet();
  237. void initEnemy();
  238. //初始化其中一个
  239. //void initThisBullet( COORD );
  240. //void initThisEnemy( Frame );
  241. void planeMove(char);
  242. void bulletMove();
  243. void enemyMove();
  244. //填充所有
  245. void drawPlane();
  246. void drawPlaneToNull();
  247. void drawBullet();
  248. void drawBulletToNull();
  249. void drawEnemy();
  250. void drawEnemyToNull();
  251. //填充其中一个
  252. void drawThisBulletToNull(COORD);
  253. void drawThisEnemyToNull(Frame);
  254. void Pause();
  255. void Playing();
  256. void judgePlane();
  257. void judgeEnemy();
  258. void Shoot();
  259. void GameOver();
  260. void printScore();
  261. };
  262. Game::Game()
  263. {
  264. initPlane();
  265. initBullet();
  266. initEnemy();
  267. score = 0;
  268. rank = 25;
  269. rankf = 0;
  270. flag_rank = 0;
  271. }
  272. void Game::initPlane()
  273. {
  274. COORD centren = { 39, 22 };
  275. position[0].X = position[5].X = position[7].X = position[9].X = centren.X;
  276. position[1].X = centren.X - 2;
  277. position[2].X = position[6].X = centren.X - 1;
  278. position[3].X = position[8].X = centren.X + 1;
  279. position[4].X = centren.X + 2;
  280. for (int i = 0; i <= 4; i++)
  281. position[i].Y = centren.Y;
  282. for (int i = 6; i <= 8; i++)
  283. position[i].Y = centren.Y + 1;
  284. position[5].Y = centren.Y - 1;
  285. position[9].Y = centren.Y - 2;
  286. }
  287. void Game::drawPlane()
  288. {
  289. for (int i = 0; i < 9; i++)
  290. {
  291. SetPos(position[i]);
  292. if (i != 5)
  293. cout << "O";
  294. else if (i == 5)
  295. cout << "|";
  296. }
  297. }
  298. void Game::drawPlaneToNull()
  299. {
  300. for (int i = 0; i < 9; i++)
  301. {
  302. SetPos(position[i]);
  303. cout << " ";
  304. }
  305. }
  306. void Game::initBullet()
  307. {
  308. for (int i = 0; i < 10; i++)
  309. bullet[i].Y = 30;
  310. }
  311. void Game::drawBullet()
  312. {
  313. for (int i = 0; i < 10; i++)
  314. {
  315. if (bullet[i].Y != 30)
  316. {
  317. SetPos(bullet[i]);
  318. cout << "^";
  319. }
  320. }
  321. }
  322. void Game::drawBulletToNull()
  323. {
  324. for (int i = 0; i < 10; i++)
  325. if (bullet[i].Y != 30)
  326. {
  327. COORD pos = { bullet[i].X, bullet[i].Y + 1 };
  328. SetPos(pos);
  329. cout << " ";
  330. }
  331. }
  332. void Game::initEnemy()
  333. {
  334. COORD a = { 1, 1 };
  335. COORD b = { 45, 15 };
  336. for (int i = 0; i < 8; i++)
  337. {
  338. enemy[i].position[0] = random(a, b);
  339. enemy[i].position[1].X = enemy[i].position[0].X + 3;
  340. enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
  341. }
  342. }
  343. void Game::drawEnemy()
  344. {
  345. for (int i = 0; i < 8; i++)
  346. drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
  347. }
  348. void Game::drawEnemyToNull()
  349. {
  350. for (int i = 0; i < 8; i++)
  351. {
  352. drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
  353. }
  354. }
  355. void Game::Pause()
  356. {
  357. SetPos(61, 2);
  358. cout << " ";
  359. SetPos(61, 2);
  360. cout << "暂停中...";
  361. char c = _getch();
  362. while (c != 'p')
  363. c = _getch();
  364. SetPos(61, 2);
  365. cout << " ";
  366. }
  367. void Game::planeMove(char x)
  368. {
  369. if (x == 'a')
  370. if (position[1].X != 1)
  371. for (int i = 0; i <= 9; i++)
  372. position[i].X -= 2;
  373. if (x == 's')
  374. if (position[7].Y != 23)
  375. for (int i = 0; i <= 9; i++)
  376. position[i].Y += 1;
  377. if (x == 'd')
  378. if (position[4].X != 47)
  379. for (int i = 0; i <= 9; i++)
  380. position[i].X += 2;
  381. if (x == 'w')
  382. if (position[5].Y != 3)
  383. for (int i = 0; i <= 9; i++)
  384. position[i].Y -= 1;
  385. }
  386. void Game::bulletMove()
  387. {
  388. for (int i = 0; i < 10; i++)
  389. {
  390. if (bullet[i].Y != 30)
  391. {
  392. bullet[i].Y -= 1;
  393. if (bullet[i].Y == 1)
  394. {
  395. COORD pos = { bullet[i].X, bullet[i].Y + 1 };
  396. drawThisBulletToNull(pos);
  397. bullet[i].Y = 30;
  398. }
  399. }
  400. }
  401. }
  402. void Game::enemyMove()
  403. {
  404. for (int i = 0; i < 8; i++)
  405. {
  406. for (int j = 0; j < 2; j++)
  407. enemy[i].position[j].Y++;
  408. if (24 == enemy[i].position[1].Y)
  409. {
  410. COORD a = { 1, 1 };
  411. COORD b = { 45, 3 };
  412. enemy[i].position[0] = random(a, b);
  413. enemy[i].position[1].X = enemy[i].position[0].X + 3;
  414. enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
  415. }
  416. }
  417. }
  418. void Game::judgePlane()
  419. {
  420. for (int i = 0; i < 8; i++)
  421. for (int j = 0; j < 9; j++)
  422. if (judgeCoordInFrame(enemy[i], position[j]))
  423. {
  424. SetPos(62, 1);
  425. cout << "坠毁";
  426. drawFrame(enemy[i], '+', '+');
  427. Sleep(1000);
  428. GameOver();
  429. break;
  430. }
  431. }
  432. void Game::drawThisBulletToNull(COORD c)
  433. {
  434. SetPos(c);
  435. cout << " ";
  436. }
  437. void Game::drawThisEnemyToNull(Frame f)
  438. {
  439. drawFrame(f, ' ', ' ');
  440. }
  441. void Game::judgeEnemy()
  442. {
  443. for (int i = 0; i < 8; i++)
  444. for (int j = 0; j < 10; j++)
  445. if (judgeCoordInFrame(enemy[i], bullet[j]))
  446. {
  447. score += 5;
  448. drawThisEnemyToNull(enemy[i]);
  449. COORD a = { 1, 1 };
  450. COORD b = { 45, 3 };
  451. enemy[i].position[0] = random(a, b);
  452. enemy[i].position[1].X = enemy[i].position[0].X + 3;
  453. enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
  454. drawThisBulletToNull(bullet[j]);
  455. bullet[j].Y = 30;
  456. }
  457. }
  458. void Game::Shoot()
  459. {
  460. for (int i = 0; i < 10; i++)
  461. if (bullet[i].Y == 30)
  462. {
  463. bullet[i].X = position[5].X;
  464. bullet[i].Y = position[5].Y - 1;
  465. break;
  466. }
  467. }
  468. void Game::printScore()
  469. {
  470. if (score == 120 && flag_rank == 0)
  471. {
  472. rank -= 3;
  473. flag_rank = 1;
  474. }
  475. else if (score == 360 && flag_rank == 1)
  476. {
  477. rank -= 5;
  478. flag_rank = 2;
  479. }
  480. else if (score == 480 && flag_rank == 2)
  481. {
  482. rank -= 5;
  483. flag_rank = 3;
  484. }
  485. int x = rank / 5;
  486. SetPos(60, 6);
  487. cout << score;
  488. if (rank != rankf)
  489. {
  490. SetPos(60, 7);
  491. if (x == 5)
  492. title = "初级飞行员";
  493. else if (x == 4)
  494. title = "中级飞行员";
  495. else if (x == 3)
  496. title = "高级飞行员";
  497. else if (x == 2)
  498. title = "王牌飞行员";
  499. cout << title;
  500. }
  501. rankf = rank;
  502. }
  503. void Game::Playing()
  504. {
  505. //HANDLE MFUN;
  506. //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
  507. drawEnemy();
  508. drawPlane();
  509. int flag_bullet = 0;
  510. int flag_enemy = 0;
  511. while (1)
  512. {
  513. Sleep(8);
  514. if (_kbhit())
  515. {
  516. char x = _getch();
  517. if ('a' == x || 's' == x || 'd' == x || 'w' == x)
  518. {
  519. drawPlaneToNull();
  520. planeMove(x);
  521. drawPlane();
  522. judgePlane();
  523. }
  524. else if ('p' == x)
  525. Pause();
  526. else if ('k' == x)
  527. Shoot();
  528. else if ('e' == x)
  529. {
  530. //CloseHandle(MFUN);
  531. GameOver();
  532. break;
  533. }
  534. }
  535. /* 处理子弹 */
  536. if (0 == flag_bullet)
  537. {
  538. bulletMove();
  539. drawBulletToNull();
  540. drawBullet();
  541. judgeEnemy();
  542. }
  543. flag_bullet++;
  544. if (5 == flag_bullet)
  545. flag_bullet = 0;
  546. /* 处理敌人 */
  547. if (0 == flag_enemy)
  548. {
  549. drawEnemyToNull();
  550. enemyMove();
  551. drawEnemy();
  552. judgePlane();
  553. }
  554. flag_enemy++;
  555. if (flag_enemy >= rank)
  556. flag_enemy = 0;
  557. /* 输出得分 */
  558. printScore();
  559. }
  560. }
  561. void Game::GameOver()
  562. {
  563. system("cls");
  564. COORD p1 = { 28,9 };
  565. COORD p2 = { 53,15 };
  566. drawFrame(p1, p2, '=', '|');
  567. SetPos(36, 12);
  568. string str = "Game Over!";
  569. for (int i = 0; i < str.size(); i++)
  570. {
  571. Sleep(80);
  572. cout << str[i];
  573. }
  574. Sleep(1000);
  575. system("cls");
  576. drawFrame(p1, p2, '=', '|');
  577. SetPos(31, 11);
  578. cout << "击落敌机:" << score / 5 << " 架";
  579. SetPos(31, 12);
  580. cout << "得  分:" << score;
  581. SetPos(31, 13);
  582. cout << "获得称号:" << title;
  583. SetPos(30, 16);
  584. Sleep(1000);
  585. cout << "继续? 是(y)| 否(n)制作:Andy";
  586. as:
  587. char x = _getch();
  588. if (x == 'n')
  589. exit(0);
  590. else if (x == 'y')
  591. {
  592. system("cls");
  593. Game game;
  594. int a = drawMenu();
  595. if (a == 2)
  596. game.rank = 20;
  597. system("cls");
  598. drawPlaying();
  599. game.Playing();
  600. }
  601. else goto as;
  602. }
  603. /*================== the main function ==================*/
  604. int main()
  605. {
  606. srand((int)time(0));//
  607. HideCursor(); //
  608. Game game;
  609. int a = drawMenu();
  610. if (a == 2)
  611. game.rank = 20;
  612. system("cls");
  613. drawPlaying();
  614. game.Playing();
  615. }

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java飞机

    一、项目分析 1、设计步骤 在一个Java Swing的小游戏中,首先需要考虑的是组件的绘制,其次是如何让需要运动的组件运动起来,最后是如何检测物体的碰撞等。 (1)