我是一个C++初学者,控制台实现了一个俄罗斯方块游戏。

代码如下:

  1. //"俄罗斯方块"V1.0
  2. //李国良于2017年1月20日编写完成
  3. #include <iostream>
  4. #include <string>
  5. #include <ctime>
  6. #include <cstdlib>
  7. #include <windows.h>
  8. #include <conio.h>
  9. using namespace std;
  10. int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
  11. int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
  12. int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
  13. int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
  14. int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
  15. int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
  16. int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
  17. int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
  18. int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
  19. int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
  20. int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
  21. int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
  22. int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
  23. int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
  24. int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
  25. int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
  26. int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
  27. int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
  28. int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };
  29. void initialWindow(HANDLE hOut);//初始化窗口
  30. void initialPrint(HANDLE hOut);//初始化界面
  31. void gotoXY(HANDLE hOut, int x, int y);//移动光标
  32. void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
  33. bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
  34. void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
  35. void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
  36. void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
  37. void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
  38. void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
  39. int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
  40. void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
  41. void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
  42. void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
  43. int main()
  44. {
  45. int map[21][12];
  46. int blockA[4][4];//候选区的方块
  47. int blockB[4][4];//下落中的方块
  48. int positionX, positionY;//方块左上角的坐标
  49. bool check;//检查方块还能不能下落
  50. char key;//用来存储按键
  51. int val;//用来控制下落速度
  52. int fraction;//用来存储得分
  53. int checkpoint;//用来存储关卡
  54. int times;
  55. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
  56. initialWindow(hOut);
  57. initial:
  58. gotoXY(hOut, 0, 0);
  59. initialPrint(hOut);
  60. check = true;
  61. val = 50;
  62. fraction = 0;
  63. checkpoint = 1;
  64. times = val;
  65. for (int i = 0; i < 20; ++i)
  66. {
  67. for (int j = 1; j < 11; ++j)
  68. {
  69. map[i][j] = 0;
  70. }
  71. }
  72. for (int i = 0; i < 20; ++i)
  73. {
  74. map[i][0] = map[i][11] = 1;
  75. }
  76. for (int i = 0; i < 12; ++i)
  77. {
  78. map[20][i] = 1;
  79. }
  80. srand((unsigned)time(NULL));
  81. roundBlock(hOut, blockA);
  82. while (true)
  83. {
  84. if (check)
  85. {
  86. eliminateRow(hOut, map, val, fraction, checkpoint);
  87. check = false;
  88. positionX = -3;
  89. positionY = 4;
  90. if (collisionDetection(blockA, map, positionX, positionY))
  91. {
  92. for (int i = 0; i < 4; ++i)
  93. {
  94. for (int j = 0; j < 4; ++j)
  95. {
  96. blockB[i][j] = blockA[i][j];
  97. }
  98. }
  99. roundBlock(hOut, blockA);
  100. }
  101. else
  102. {
  103. gameOver(hOut, blockA, map);
  104. goto initial;
  105. }
  106. }
  107. printBlock(hOut, blockB, positionX, positionY);
  108. if (_kbhit())
  109. {
  110. key = _getch();
  111. switch (key)
  112. {
  113. case 72:
  114. myUp(hOut, blockB, map, positionX, positionY);
  115. break;
  116. case 75:
  117. myLeft(hOut, blockB, map, positionX, positionY);
  118. break;
  119. case 77:
  120. myRight(hOut, blockB, map, positionX, positionY);
  121. break;
  122. case 80:
  123. switch (myDown(hOut, blockB, map, positionX, positionY))
  124. {
  125. case 0:
  126. check = false;
  127. break;
  128. case 1:
  129. check = true;
  130. break;
  131. case 2:
  132. gameOver(hOut, blockB, map);
  133. goto initial;
  134. default:
  135. break;
  136. }
  137. break;
  138. case 32:
  139. myStop(hOut, blockA);
  140. break;
  141. case 27:
  142. exit(0);
  143. default:
  144. break;
  145. }
  146. }
  147. Sleep(20);
  148. if (0 == --times)
  149. {
  150. switch (myDown(hOut, blockB, map, positionX, positionY))
  151. {
  152. case 0:
  153. check = false;
  154. break;
  155. case 1:
  156. check = true;
  157. break;
  158. case 2:
  159. gameOver(hOut, blockB, map);
  160. goto initial;
  161. default:
  162. break;
  163. }
  164. times = val;
  165. }
  166. }
  167. cin.get();
  168. return 0;
  169. }
  170. void initialWindow(HANDLE hOut)
  171. {
  172. SetConsoleTitle("俄罗斯方块");
  173. COORD size = { 80, 25 };
  174. SetConsoleScreenBufferSize(hOut, size);
  175. SMALL_RECT rc = { 0, 0, 79, 24 };
  176. SetConsoleWindowInfo(hOut, true, &rc);
  177. CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
  178. SetConsoleCursorInfo(hOut, &cursor_info);
  179. }
  180. void initialPrint(HANDLE hOut)
  181. {
  182. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
  183. for (int i = 0; i < 20; ++i)
  184. {
  185. cout << "■ ■☆ ☆" << endl;
  186. }
  187. gotoXY(hOut, 26, 0);
  188. cout << "☆☆☆☆☆☆☆☆☆☆☆";
  189. gotoXY(hOut, 0, 20);
  190. cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
  191. gotoXY(hOut, 26, 1);
  192. cout << "分 数: ";
  193. gotoXY(hOut, 26, 2);
  194. cout << "关 卡: ";
  195. gotoXY(hOut, 26, 4);
  196. cout << "下一方块:";
  197. gotoXY(hOut, 26, 9);
  198. cout << "操作方法:";
  199. gotoXY(hOut, 30, 11);
  200. cout << "↑:旋转 ↓:速降";
  201. gotoXY(hOut, 30, 12);
  202. cout << "→:右移 ←:左移";
  203. gotoXY(hOut, 30, 13);
  204. cout << "空格键:开始/暂停";
  205. gotoXY(hOut, 30, 14);
  206. cout << "Esc 键:退出";
  207. gotoXY(hOut, 26, 16);
  208. cout << "关 于:";
  209. gotoXY(hOut, 30, 18);
  210. cout << "俄罗斯方块V1.0";
  211. gotoXY(hOut, 35, 19);
  212. cout << "作者:李国良";
  213. }
  214. void gotoXY(HANDLE hOut, int x, int y)
  215. {
  216. COORD pos;
  217. pos.X = x;
  218. pos.Y = y;
  219. SetConsoleCursorPosition(hOut, pos);
  220. }
  221. void roundBlock(HANDLE hOut, int block[4][4])
  222. {
  223. clearBlock(hOut, block, 5, 15);
  224. switch (rand() % 19)
  225. {
  226. case 0:
  227. for (int i = 0; i < 4; ++i)
  228. {
  229. for (int j = 0; j < 4; ++j)
  230. {
  231. block[i][j] = block00[i][j];
  232. }
  233. }
  234. break;
  235. case 1:
  236. for (int i = 0; i < 4; ++i)
  237. {
  238. for (int j = 0; j < 4; ++j)
  239. {
  240. block[i][j] = block01[i][j];
  241. }
  242. }
  243. break;
  244. case 2:
  245. for (int i = 0; i < 4; ++i)
  246. {
  247. for (int j = 0; j < 4; ++j)
  248. {
  249. block[i][j] = block02[i][j];
  250. }
  251. }
  252. break;
  253. case 3:
  254. for (int i = 0; i < 4; ++i)
  255. {
  256. for (int j = 0; j < 4; ++j)
  257. {
  258. block[i][j] = block03[i][j];
  259. }
  260. }
  261. break;
  262. case 4:
  263. for (int i = 0; i < 4; ++i)
  264. {
  265. for (int j = 0; j < 4; ++j)
  266. {
  267. block[i][j] = block04[i][j];
  268. }
  269. }
  270. break;
  271. case 5:
  272. for (int i = 0; i < 4; ++i)
  273. {
  274. for (int j = 0; j < 4; ++j)
  275. {
  276. block[i][j] = block05[i][j];
  277. }
  278. }
  279. break;
  280. case 6:
  281. for (int i = 0; i < 4; ++i)
  282. {
  283. for (int j = 0; j < 4; ++j)
  284. {
  285. block[i][j] = block06[i][j];
  286. }
  287. }
  288. break;
  289. case 7:
  290. for (int i = 0; i < 4; ++i)
  291. {
  292. for (int j = 0; j < 4; ++j)
  293. {
  294. block[i][j] = block07[i][j];
  295. }
  296. }
  297. break;
  298. case 8:
  299. for (int i = 0; i < 4; ++i)
  300. {
  301. for (int j = 0; j < 4; ++j)
  302. {
  303. block[i][j] = block08[i][j];
  304. }
  305. }
  306. break;
  307. case 9:
  308. for (int i = 0; i < 4; ++i)
  309. {
  310. for (int j = 0; j < 4; ++j)
  311. {
  312. block[i][j] = block09[i][j];
  313. }
  314. }
  315. break;
  316. case 10:
  317. for (int i = 0; i < 4; ++i)
  318. {
  319. for (int j = 0; j < 4; ++j)
  320. {
  321. block[i][j] = block10[i][j];
  322. }
  323. }
  324. break;
  325. case 11:
  326. for (int i = 0; i < 4; ++i)
  327. {
  328. for (int j = 0; j < 4; ++j)
  329. {
  330. block[i][j] = block11[i][j];
  331. }
  332. }
  333. break;
  334. case 12:
  335. for (int i = 0; i < 4; ++i)
  336. {
  337. for (int j = 0; j < 4; ++j)
  338. {
  339. block[i][j] = block12[i][j];
  340. }
  341. }
  342. break;
  343. case 13:
  344. for (int i = 0; i < 4; ++i)
  345. {
  346. for (int j = 0; j < 4; ++j)
  347. {
  348. block[i][j] = block13[i][j];
  349. }
  350. }
  351. break;
  352. case 14:
  353. for (int i = 0; i < 4; ++i)
  354. {
  355. for (int j = 0; j < 4; ++j)
  356. {
  357. block[i][j] = block14[i][j];
  358. }
  359. }
  360. break;
  361. case 15:
  362. for (int i = 0; i < 4; ++i)
  363. {
  364. for (int j = 0; j < 4; ++j)
  365. {
  366. block[i][j] = block15[i][j];
  367. }
  368. }
  369. break;
  370. case 16:
  371. for (int i = 0; i < 4; ++i)
  372. {
  373. for (int j = 0; j < 4; ++j)
  374. {
  375. block[i][j] = block16[i][j];
  376. }
  377. }
  378. break;
  379. case 17:
  380. for (int i = 0; i < 4; ++i)
  381. {
  382. for (int j = 0; j < 4; ++j)
  383. {
  384. block[i][j] = block17[i][j];
  385. }
  386. }
  387. break;
  388. case 18:
  389. for (int i = 0; i < 4; ++i)
  390. {
  391. for (int j = 0; j < 4; ++j)
  392. {
  393. block[i][j] = block18[i][j];
  394. }
  395. }
  396. break;
  397. default:
  398. break;
  399. }
  400. printBlock(hOut, block, 5, 15);
  401. }
  402. bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
  403. {
  404. for (int i = 0; i < 4; ++i)
  405. {
  406. for (int j = 0; j < 4; ++j)
  407. {
  408. if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1)
  409. {
  410. return false;
  411. }
  412. }
  413. }
  414. return true;
  415. }
  416. void printBlock(HANDLE hOut, int block[4][4], int x, int y)
  417. {
  418. switch (block[0][0])
  419. {
  420. case 10:
  421. case 11:
  422. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
  423. break;
  424. case 12:
  425. case 13:
  426. case 14:
  427. case 15:
  428. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  429. break;
  430. case 16:
  431. case 17:
  432. case 18:
  433. case 19:
  434. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  435. break;
  436. case 20:
  437. case 21:
  438. case 22:
  439. case 23:
  440. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  441. break;
  442. case 24:
  443. case 25:
  444. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  445. break;
  446. case 26:
  447. case 27:
  448. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  449. break;
  450. case 28:
  451. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  452. break;
  453. default:
  454. break;
  455. }
  456. for (int i = 0; i < 4; ++i)
  457. {
  458. if (i + x >= 0)
  459. {
  460. for (int j = 0; j < 4; ++j)
  461. {
  462. if (block[i][j] == 1)
  463. {
  464. gotoXY(hOut, 2 * (y + j), x + i);
  465. cout << "■";
  466. }
  467. }
  468. }
  469. }
  470. }
  471. void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
  472. {
  473. for (int i = 0; i < 4; ++i)
  474. {
  475. if (i + x >= 0)
  476. {
  477. for (int j = 0; j < 4; ++j)
  478. {
  479. if (block[i][j] == 1)
  480. {
  481. gotoXY(hOut, 2 * (y + j), x + i);
  482. cout << " ";
  483. }
  484. }
  485. }
  486. }
  487. }
  488. void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
  489. {
  490. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  491. gotoXY(hOut, 9, 8);
  492. cout << "GAME OVER";
  493. gotoXY(hOut, 8, 9);
  494. cout << "空格键:重来";
  495. gotoXY(hOut, 8, 10);
  496. cout << "ESC键:退出";
  497. char key;
  498. while (true)
  499. {
  500. key = _getch();
  501. if (key == 32)
  502. {
  503. return;
  504. }
  505. if (key == 27)
  506. {
  507. exit(0);
  508. }
  509. }
  510. }
  511. int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
  512. {
  513. if (collisionDetection(block, map, x + 1, y))
  514. {
  515. clearBlock(hOut, block, x, y);
  516. ++x;
  517. return 0;
  518. }
  519. if (x < 0)
  520. {
  521. return 2;
  522. }
  523. for (int i = 0; i < 4; ++i)
  524. {
  525. for (int j = 0; j < 4; ++j)
  526. {
  527. if (block[i][j] == 1)
  528. {
  529. map[x + i][y + j] = 1;
  530. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  531. gotoXY(hOut, 2 * (y + j), x + i);
  532. cout << "■";
  533. }
  534. }
  535. }
  536. return 1;
  537. }
  538. void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
  539. {
  540. if (collisionDetection(block, map, x, y - 1))
  541. {
  542. clearBlock(hOut, block, x, y);
  543. --y;
  544. }
  545. }
  546. void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
  547. {
  548. if (collisionDetection(block, map, x, y + 1))
  549. {
  550. clearBlock(hOut, block, x, y);
  551. ++y;
  552. }
  553. }
  554. void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
  555. {
  556. switch (block[0][0])
  557. {
  558. case 10:
  559. if (collisionDetection(block01, map, x, y))
  560. {
  561. clearBlock(hOut, block, x, y);
  562. for (int i = 0; i < 4; ++i)
  563. {
  564. for (int j = 0; j < 4; ++j)
  565. {
  566. block[i][j] = block01[i][j];
  567. }
  568. }
  569. }
  570. break;
  571. case 11:
  572. if (collisionDetection(block00, map, x, y))
  573. {
  574. clearBlock(hOut, block, x, y);
  575. for (int i = 0; i < 4; ++i)
  576. {
  577. for (int j = 0; j < 4; ++j)
  578. {
  579. block[i][j] = block00[i][j];
  580. }
  581. }
  582. }
  583. else if (collisionDetection(block00, map, x, y - 1))
  584. {
  585. clearBlock(hOut, block, x, y);
  586. for (int i = 0; i < 4; ++i)
  587. {
  588. for (int j = 0; j < 4; ++j)
  589. {
  590. block[i][j] = block00[i][j];
  591. }
  592. }
  593. --y;
  594. }
  595. else if (collisionDetection(block00, map, x, y + 1))
  596. {
  597. clearBlock(hOut, block, x, y);
  598. for (int i = 0; i < 4; ++i)
  599. {
  600. for (int j = 0; j < 4; ++j)
  601. {
  602. block[i][j] = block00[i][j];
  603. }
  604. }
  605. ++y;
  606. }
  607. else if (collisionDetection(block00, map, x, y - 2))
  608. {
  609. clearBlock(hOut, block, x, y);
  610. for (int i = 0; i < 4; ++i)
  611. {
  612. for (int j = 0; j < 4; ++j)
  613. {
  614. block[i][j] = block00[i][j];
  615. }
  616. }
  617. y = y - 2;
  618. }
  619. else if (collisionDetection(block00, map, x, y + 2))
  620. {
  621. clearBlock(hOut, block, x, y);
  622. for (int i = 0; i < 4; ++i)
  623. {
  624. for (int j = 0; j < 4; ++j)
  625. {
  626. block[i][j] = block00[i][j];
  627. }
  628. }
  629. y = y + 2;
  630. }
  631. break;
  632. case 12:
  633. if (collisionDetection(block03, map, x, y))
  634. {
  635. clearBlock(hOut, block, x, y);
  636. for (int i = 0; i < 4; ++i)
  637. {
  638. for (int j = 0; j < 4; ++j)
  639. {
  640. block[i][j] = block03[i][j];
  641. }
  642. }
  643. }
  644. else if (collisionDetection(block03, map, x, y - 1))
  645. {
  646. clearBlock(hOut, block, x, y);
  647. for (int i = 0; i < 4; ++i)
  648. {
  649. for (int j = 0; j < 4; ++j)
  650. {
  651. block[i][j] = block03[i][j];
  652. }
  653. }
  654. --y;
  655. }
  656. else if (collisionDetection(block03, map, x, y + 1))
  657. {
  658. clearBlock(hOut, block, x, y);
  659. for (int i = 0; i < 4; ++i)
  660. {
  661. for (int j = 0; j < 4; ++j)
  662. {
  663. block[i][j] = block03[i][j];
  664. }
  665. }
  666. ++y;
  667. }
  668. break;
  669. case 13:
  670. if (collisionDetection(block04, map, x, y))
  671. {
  672. clearBlock(hOut, block, x, y);
  673. for (int i = 0; i < 4; ++i)
  674. {
  675. for (int j = 0; j < 4; ++j)
  676. {
  677. block[i][j] = block04[i][j];
  678. }
  679. }
  680. }
  681. else if (collisionDetection(block04, map, x, y - 1))
  682. {
  683. clearBlock(hOut, block, x, y);
  684. for (int i = 0; i < 4; ++i)
  685. {
  686. for (int j = 0; j < 4; ++j)
  687. {
  688. block[i][j] = block04[i][j];
  689. }
  690. }
  691. --y;
  692. }
  693. else if (collisionDetection(block04, map, x, y + 1))
  694. {
  695. clearBlock(hOut, block, x, y);
  696. for (int i = 0; i < 4; ++i)
  697. {
  698. for (int j = 0; j < 4; ++j)
  699. {
  700. block[i][j] = block04[i][j];
  701. }
  702. }
  703. ++y;
  704. }
  705. break;
  706. case 14:
  707. if (collisionDetection(block05, map, x, y))
  708. {
  709. clearBlock(hOut, block, x, y);
  710. for (int i = 0; i < 4; ++i)
  711. {
  712. for (int j = 0; j < 4; ++j)
  713. {
  714. block[i][j] = block05[i][j];
  715. }
  716. }
  717. }
  718. else if (collisionDetection(block05, map, x, y - 1))
  719. {
  720. clearBlock(hOut, block, x, y);
  721. for (int i = 0; i < 4; ++i)
  722. {
  723. for (int j = 0; j < 4; ++j)
  724. {
  725. block[i][j] = block05[i][j];
  726. }
  727. }
  728. --y;
  729. }
  730. else if (collisionDetection(block05, map, x, y + 1))
  731. {
  732. clearBlock(hOut, block, x, y);
  733. for (int i = 0; i < 4; ++i)
  734. {
  735. for (int j = 0; j < 4; ++j)
  736. {
  737. block[i][j] = block05[i][j];
  738. }
  739. }
  740. ++y;
  741. }
  742. break;
  743. case 15:
  744. if (collisionDetection(block02, map, x, y))
  745. {
  746. clearBlock(hOut, block, x, y);
  747. for (int i = 0; i < 4; ++i)
  748. {
  749. for (int j = 0; j < 4; ++j)
  750. {
  751. block[i][j] = block02[i][j];
  752. }
  753. }
  754. }
  755. else if (collisionDetection(block02, map, x, y - 1))
  756. {
  757. clearBlock(hOut, block, x, y);
  758. for (int i = 0; i < 4; ++i)
  759. {
  760. for (int j = 0; j < 4; ++j)
  761. {
  762. block[i][j] = block02[i][j];
  763. }
  764. }
  765. --y;
  766. }
  767. else if (collisionDetection(block02, map, x, y + 1))
  768. {
  769. clearBlock(hOut, block, x, y);
  770. for (int i = 0; i < 4; ++i)
  771. {
  772. for (int j = 0; j < 4; ++j)
  773. {
  774. block[i][j] = block02[i][j];
  775. }
  776. }
  777. ++y;
  778. }
  779. break;
  780. case 16:
  781. if (collisionDetection(block07, map, x, y))
  782. {
  783. clearBlock(hOut, block, x, y);
  784. for (int i = 0; i < 4; ++i)
  785. {
  786. for (int j = 0; j < 4; ++j)
  787. {
  788. block[i][j] = block07[i][j];
  789. }
  790. }
  791. }
  792. else if (collisionDetection(block07, map, x, y - 1))
  793. {
  794. clearBlock(hOut, block, x, y);
  795. for (int i = 0; i < 4; ++i)
  796. {
  797. for (int j = 0; j < 4; ++j)
  798. {
  799. block[i][j] = block07[i][j];
  800. }
  801. }
  802. --y;
  803. }
  804. else if (collisionDetection(block07, map, x, y + 1))
  805. {
  806. clearBlock(hOut, block, x, y);
  807. for (int i = 0; i < 4; ++i)
  808. {
  809. for (int j = 0; j < 4; ++j)
  810. {
  811. block[i][j] = block07[i][j];
  812. }
  813. }
  814. ++y;
  815. }
  816. break;
  817. case 17:
  818. if (collisionDetection(block08, map, x, y))
  819. {
  820. clearBlock(hOut, block, x, y);
  821. for (int i = 0; i < 4; ++i)
  822. {
  823. for (int j = 0; j < 4; ++j)
  824. {
  825. block[i][j] = block08[i][j];
  826. }
  827. }
  828. }
  829. else if (collisionDetection(block08, map, x, y - 1))
  830. {
  831. clearBlock(hOut, block, x, y);
  832. for (int i = 0; i < 4; ++i)
  833. {
  834. for (int j = 0; j < 4; ++j)
  835. {
  836. block[i][j] = block08[i][j];
  837. }
  838. }
  839. --y;
  840. }
  841. else if (collisionDetection(block08, map, x, y + 1))
  842. {
  843. clearBlock(hOut, block, x, y);
  844. for (int i = 0; i < 4; ++i)
  845. {
  846. for (int j = 0; j < 4; ++j)
  847. {
  848. block[i][j] = block08[i][j];
  849. }
  850. }
  851. ++y;
  852. }
  853. break;
  854. case 18:
  855. if (collisionDetection(block09, map, x, y))
  856. {
  857. clearBlock(hOut, block, x, y);
  858. for (int i = 0; i < 4; ++i)
  859. {
  860. for (int j = 0; j < 4; ++j)
  861. {
  862. block[i][j] = block09[i][j];
  863. }
  864. }
  865. }
  866. else if (collisionDetection(block09, map, x, y - 1))
  867. {
  868. clearBlock(hOut, block, x, y);
  869. for (int i = 0; i < 4; ++i)
  870. {
  871. for (int j = 0; j < 4; ++j)
  872. {
  873. block[i][j] = block09[i][j];
  874. }
  875. }
  876. --y;
  877. }
  878. else if (collisionDetection(block09, map, x, y + 1))
  879. {
  880. clearBlock(hOut, block, x, y);
  881. for (int i = 0; i < 4; ++i)
  882. {
  883. for (int j = 0; j < 4; ++j)
  884. {
  885. block[i][j] = block09[i][j];
  886. }
  887. }
  888. ++y;
  889. }
  890. break;
  891. case 19:
  892. if (collisionDetection(block06, map, x, y))
  893. {
  894. clearBlock(hOut, block, x, y);
  895. for (int i = 0; i < 4; ++i)
  896. {
  897. for (int j = 0; j < 4; ++j)
  898. {
  899. block[i][j] = block06[i][j];
  900. }
  901. }
  902. }
  903. else if (collisionDetection(block06, map, x, y - 1))
  904. {
  905. clearBlock(hOut, block, x, y);
  906. for (int i = 0; i < 4; ++i)
  907. {
  908. for (int j = 0; j < 4; ++j)
  909. {
  910. block[i][j] = block06[i][j];
  911. }
  912. }
  913. --y;
  914. }
  915. else if (collisionDetection(block06, map, x, y + 1))
  916. {
  917. clearBlock(hOut, block, x, y);
  918. for (int i = 0; i < 4; ++i)
  919. {
  920. for (int j = 0; j < 4; ++j)
  921. {
  922. block[i][j] = block06[i][j];
  923. }
  924. }
  925. ++y;
  926. }
  927. break;
  928. case 20:
  929. if (collisionDetection(block11, map, x, y))
  930. {
  931. clearBlock(hOut, block, x, y);
  932. for (int i = 0; i < 4; ++i)
  933. {
  934. for (int j = 0; j < 4; ++j)
  935. {
  936. block[i][j] = block11[i][j];
  937. }
  938. }
  939. }
  940. else if (collisionDetection(block11, map, x, y - 1))
  941. {
  942. clearBlock(hOut, block, x, y);
  943. for (int i = 0; i < 4; ++i)
  944. {
  945. for (int j = 0; j < 4; ++j)
  946. {
  947. block[i][j] = block11[i][j];
  948. }
  949. }
  950. --y;
  951. }
  952. else if (collisionDetection(block11, map, x, y + 1))
  953. {
  954. clearBlock(hOut, block, x, y);
  955. for (int i = 0; i < 4; ++i)
  956. {
  957. for (int j = 0; j < 4; ++j)
  958. {
  959. block[i][j] = block11[i][j];
  960. }
  961. }
  962. ++y;
  963. }
  964. break;
  965. case 21:
  966. if (collisionDetection(block12, map, x, y))
  967. {
  968. clearBlock(hOut, block, x, y);
  969. for (int i = 0; i < 4; ++i)
  970. {
  971. for (int j = 0; j < 4; ++j)
  972. {
  973. block[i][j] = block12[i][j];
  974. }
  975. }
  976. }
  977. else if (collisionDetection(block12, map, x, y - 1))
  978. {
  979. clearBlock(hOut, block, x, y);
  980. for (int i = 0; i < 4; ++i)
  981. {
  982. for (int j = 0; j < 4; ++j)
  983. {
  984. block[i][j] = block12[i][j];
  985. }
  986. }
  987. --y;
  988. }
  989. else if (collisionDetection(block12, map, x, y + 1))
  990. {
  991. clearBlock(hOut, block, x, y);
  992. for (int i = 0; i < 4; ++i)
  993. {
  994. for (int j = 0; j < 4; ++j)
  995. {
  996. block[i][j] = block12[i][j];
  997. }
  998. }
  999. ++y;
  1000. }
  1001. break;
  1002. case 22:
  1003. if (collisionDetection(block13, map, x, y))
  1004. {
  1005. clearBlock(hOut, block, x, y);
  1006. for (int i = 0; i < 4; ++i)
  1007. {
  1008. for (int j = 0; j < 4; ++j)
  1009. {
  1010. block[i][j] = block13[i][j];
  1011. }
  1012. }
  1013. }
  1014. else if (collisionDetection(block13, map, x, y - 1))
  1015. {
  1016. clearBlock(hOut, block, x, y);
  1017. for (int i = 0; i < 4; ++i)
  1018. {
  1019. for (int j = 0; j < 4; ++j)
  1020. {
  1021. block[i][j] = block13[i][j];
  1022. }
  1023. }
  1024. --y;
  1025. }
  1026. else if (collisionDetection(block13, map, x, y + 1))
  1027. {
  1028. clearBlock(hOut, block, x, y);
  1029. for (int i = 0; i < 4; ++i)
  1030. {
  1031. for (int j = 0; j < 4; ++j)
  1032. {
  1033. block[i][j] = block13[i][j];
  1034. }
  1035. }
  1036. ++y;
  1037. }
  1038. break;
  1039. case 23:
  1040. if (collisionDetection(block10, map, x, y))
  1041. {
  1042. clearBlock(hOut, block, x, y);
  1043. for (int i = 0; i < 4; ++i)
  1044. {
  1045. for (int j = 0; j < 4; ++j)
  1046. {
  1047. block[i][j] = block10[i][j];
  1048. }
  1049. }
  1050. }
  1051. else if (collisionDetection(block10, map, x, y - 1))
  1052. {
  1053. clearBlock(hOut, block, x, y);
  1054. for (int i = 0; i < 4; ++i)
  1055. {
  1056. for (int j = 0; j < 4; ++j)
  1057. {
  1058. block[i][j] = block10[i][j];
  1059. }
  1060. }
  1061. --y;
  1062. }
  1063. else if (collisionDetection(block10, map, x, y + 1))
  1064. {
  1065. clearBlock(hOut, block, x, y);
  1066. for (int i = 0; i < 4; ++i)
  1067. {
  1068. for (int j = 0; j < 4; ++j)
  1069. {
  1070. block[i][j] = block10[i][j];
  1071. }
  1072. }
  1073. ++y;
  1074. }
  1075. break;
  1076. case 24:
  1077. if (collisionDetection(block15, map, x, y))
  1078. {
  1079. clearBlock(hOut, block, x, y);
  1080. for (int i = 0; i < 4; ++i)
  1081. {
  1082. for (int j = 0; j < 4; ++j)
  1083. {
  1084. block[i][j] = block15[i][j];
  1085. }
  1086. }
  1087. }
  1088. else if (collisionDetection(block15, map, x, y - 1))
  1089. {
  1090. clearBlock(hOut, block, x, y);
  1091. for (int i = 0; i < 4; ++i)
  1092. {
  1093. for (int j = 0; j < 4; ++j)
  1094. {
  1095. block[i][j] = block15[i][j];
  1096. }
  1097. }
  1098. --y;
  1099. }
  1100. else if (collisionDetection(block15, map, x, y + 1))
  1101. {
  1102. clearBlock(hOut, block, x, y);
  1103. for (int i = 0; i < 4; ++i)
  1104. {
  1105. for (int j = 0; j < 4; ++j)
  1106. {
  1107. block[i][j] = block15[i][j];
  1108. }
  1109. }
  1110. ++y;
  1111. }
  1112. break;
  1113. case 25:
  1114. if (collisionDetection(block14, map, x, y))
  1115. {
  1116. clearBlock(hOut, block, x, y);
  1117. for (int i = 0; i < 4; ++i)
  1118. {
  1119. for (int j = 0; j < 4; ++j)
  1120. {
  1121. block[i][j] = block14[i][j];
  1122. }
  1123. }
  1124. }
  1125. else if (collisionDetection(block14, map, x, y - 1))
  1126. {
  1127. clearBlock(hOut, block, x, y);
  1128. for (int i = 0; i < 4; ++i)
  1129. {
  1130. for (int j = 0; j < 4; ++j)
  1131. {
  1132. block[i][j] = block14[i][j];
  1133. }
  1134. }
  1135. --y;
  1136. }
  1137. else if (collisionDetection(block14, map, x, y + 1))
  1138. {
  1139. clearBlock(hOut, block, x, y);
  1140. for (int i = 0; i < 4; ++i)
  1141. {
  1142. for (int j = 0; j < 4; ++j)
  1143. {
  1144. block[i][j] = block14[i][j];
  1145. }
  1146. }
  1147. ++y;
  1148. }
  1149. break;
  1150. case 26:
  1151. if (collisionDetection(block17, map, x, y))
  1152. {
  1153. clearBlock(hOut, block, x, y);
  1154. for (int i = 0; i < 4; ++i)
  1155. {
  1156. for (int j = 0; j < 4; ++j)
  1157. {
  1158. block[i][j] = block17[i][j];
  1159. }
  1160. }
  1161. }
  1162. else if (collisionDetection(block17, map, x, y - 1))
  1163. {
  1164. clearBlock(hOut, block, x, y);
  1165. for (int i = 0; i < 4; ++i)
  1166. {
  1167. for (int j = 0; j < 4; ++j)
  1168. {
  1169. block[i][j] = block17[i][j];
  1170. }
  1171. }
  1172. --y;
  1173. }
  1174. else if (collisionDetection(block17, map, x, y + 1))
  1175. {
  1176. clearBlock(hOut, block, x, y);
  1177. for (int i = 0; i < 4; ++i)
  1178. {
  1179. for (int j = 0; j < 4; ++j)
  1180. {
  1181. block[i][j] = block17[i][j];
  1182. }
  1183. }
  1184. ++y;
  1185. }
  1186. break;
  1187. case 27:
  1188. if (collisionDetection(block16, map, x, y))
  1189. {
  1190. clearBlock(hOut, block, x, y);
  1191. for (int i = 0; i < 4; ++i)
  1192. {
  1193. for (int j = 0; j < 4; ++j)
  1194. {
  1195. block[i][j] = block16[i][j];
  1196. }
  1197. }
  1198. }
  1199. else if (collisionDetection(block16, map, x, y - 1))
  1200. {
  1201. clearBlock(hOut, block, x, y);
  1202. for (int i = 0; i < 4; ++i)
  1203. {
  1204. for (int j = 0; j < 4; ++j)
  1205. {
  1206. block[i][j] = block16[i][j];
  1207. }
  1208. }
  1209. --y;
  1210. }
  1211. else if (collisionDetection(block16, map, x, y + 1))
  1212. {
  1213. clearBlock(hOut, block, x, y);
  1214. for (int i = 0; i < 4; ++i)
  1215. {
  1216. for (int j = 0; j < 4; ++j)
  1217. {
  1218. block[i][j] = block16[i][j];
  1219. }
  1220. }
  1221. ++y;
  1222. }
  1223. break;
  1224. default:
  1225. break;
  1226. }
  1227. }
  1228. void myStop(HANDLE hOut, int block[4][4])
  1229. {
  1230. clearBlock(hOut, block, 5, 15);
  1231. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  1232. gotoXY(hOut, 30, 7);
  1233. cout << "游戏暂停";
  1234. char key;
  1235. while (true)
  1236. {
  1237. key = _getch();
  1238. if (key == 32)
  1239. {
  1240. gotoXY(hOut, 30, 7);
  1241. cout << " ";
  1242. printBlock(hOut, block, 5, 15);
  1243. return;
  1244. }
  1245. if (key == 27)
  1246. {
  1247. exit(0);
  1248. }
  1249. }
  1250. }
  1251. void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
  1252. {
  1253. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  1254. for (int i = 19; i >= 0; --i)
  1255. {
  1256. int x = 0;
  1257. for (int j = 1; j < 11; ++j)
  1258. {
  1259. x += map[i][j];
  1260. }
  1261. if (x == 10)
  1262. {
  1263. fraction += 100;
  1264. if (val > 1 && fraction / 1000 + 1 != checkpoint)
  1265. {
  1266. checkpoint = fraction / 1000 + 1;
  1267. val -= 5;
  1268. }
  1269. for (int m = i; m > 0; --m)
  1270. {
  1271. for (int n = 1; n < 11; ++n)
  1272. {
  1273. map[m][n] = map[m - 1][n];
  1274. gotoXY(hOut, 2 * n, m);
  1275. if (map[m][n] == 1)
  1276. {
  1277. cout << "■";
  1278. }
  1279. else
  1280. {
  1281. cout << " ";
  1282. }
  1283. }
  1284. }
  1285. ++i;
  1286. }
  1287. }
  1288. gotoXY(hOut, 36, 1);
  1289. cout << fraction;
  1290. gotoXY(hOut, 36, 2);
  1291. cout << checkpoint;
  1292. }

用C++实现俄罗斯方块(Tetris)游戏的更多相关文章

  1. 俄罗斯方块 Tetris

    今天,为大家带来一个用Qt C++ (Windows环境下)做的一个简易俄罗斯方块小游戏 思路和模块介绍都在注释里面,其次就是一些项目中遇到的问题以及解决方案,在后面部分说明. 一.效果 测试图样 Q ...

  2. C#俄罗斯方块小游戏程序设计与简单实现

    C#俄罗斯方块小游戏程序设计与简单实现 相信90后或者80后都玩过这款小游戏,一直想干一票,琢磨一下,但又不太懂,于是网上搜集修改就有了以下效果!bug较多,多多包涵! 1.效果展示 2.实现方法 参 ...

  3. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...

  4. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  5. H5版俄罗斯方块(2)---游戏的基本框架和实现

    前言: 上文中谈到了H5版俄罗斯方块的需求和目标, 这次要实现一个可玩的版本. 但饭要一口一口吃, 很多东西并非一蹴而就. 本文将简单实现一个可玩的俄罗斯方块版本. 下一步会引入AI, 最终采用coc ...

  6. Java课设--俄罗斯方块Tetris

    Java程序设计课程作业报告 作业:俄罗斯方块游戏 姓名 赵璐媛 学号 程序得分 90% 作业报告 得分10% 实验总分 100% 作业目的: 掌握基本的图形程序设计方法 掌握Java事件处理程序编写 ...

  7. C语言编程学习开发的俄罗斯方块小游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. 【补档STM32】STM32F103俄罗斯方块游戏实现

    项目地址:https://gitee.com/daycen/stm32-tetris/tree/master 使用Keil uVision5打开即可 一.概述 ​ 本文介绍了一个基于STM32的俄罗斯 ...

  9. Javascript写俄罗斯方块游戏

    俄罗斯方块这个游戏也做了移动端的兼容, 这个游戏难点是怎么翻转方块, 自己实现的方式是把方块放到一个二维数组, 然后逆时针旋转二维数组. 也有别的方法,比如直接用一个全局变量代表一个方向, 翻转的时候 ...

随机推荐

  1. P5287-[HNOI2019]JOJO【KMP】

    正题 题目链接:https://www.luogu.com.cn/problem/P5287 题目大意 开始一个空串,\(n\)个操作 在末尾加入\(x\)个\(c\)字符(保证和\(c\)和前面的字 ...

  2. python numpy loadtxt

    用numpy加载csv文件数据 发现python numpy loadtxt 方法和数据的结构有很大关系当我的数据有第一行文字是这样子的时候 我程序的运行结果永远都报错,编码格式也处理了统一utf-8 ...

  3. maven插件maven-install-plugin

    maven-install-plugin负责将获取的jar包安装到本地仓库 <build> <plugin> <groupId>org.apache.maven.p ...

  4. Python列表操作常用API

    1.列表的概念 (1)列表的定义 列表是Python中一种基本的数据结构.列表存储的数据,我们称为元素.在列表中的每个元素都会有一个下标来与之对应,第一个索引是0,第二个索引是1,依此类推的整数. 列 ...

  5. 3.docker容器常用命令

    docker容器的常用命令 docker有很多命令,让我们一个一个全部背下来,基本是不可能的,帮助文档的作用就很大了,想要查询那个命令,直接去找帮助文档,帮助文档地址:https://docs.doc ...

  6. 这两个基础seo插件,wordpress网站必装

    WordPress对搜索引擎非常友好,这一点很多人都知道.不过我们在制作完成WordPress主题后,还可以在原来的良好基础上,添加两个队seo非常有利的WordPress插件. 第一个插件:Baid ...

  7. 使用python -m pip install 和 pip install 安装包有什么区别?

    如果去看源码的话,你会发现 pip 作为执行文件的入口点是 pip._internal.main. 另一方面,pip 作为模块运行时入口是 _main.py,而该模块也只是调用 pip.interna ...

  8. Centos7最小安装后快速初始化脚本

    功能说明 服务器通常使用最小化安装操作系统,使用该脚本可快速初始化一些基本配置,包括以下: 1.ssh修改默认端口 2.ssh禁止root登陆 3.selinux及firewalld禁用 4.hist ...

  9. Java初步学习——2021.10.09每日总结,第五周周六

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了菜鸟教程实例部分 一.字符串 1.字符串比较--compareTo方法 public class Main { p ...

  10. 2021.7.27--Benelux Algorithm Programming Contest 2020 补提

    I Jigsaw 题目内容: 链接:https://ac.nowcoder.com/acm/contest/18454/I 来源:牛客网 You have found an old jigsaw pu ...