经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++实现俄罗斯方块小游戏
来源:jb51  时间:2021/10/11 9:22:45  对本文有异议

本文实例为大家分享了C++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下

操作说明:

D F:左右旋转
J  L:左右移动
E(一堆键都行): 加快下落速度
空格: 开始游戏 与 一落到底

上代码!

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <windows.h>
  5. #include <ctime>
  6. #include <conio.h>
  7. #include <iostream>
  8. using namespace std;
  9. #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  10. #define inf 2147483647
  11. struct type_block
  12. {
  13. int a[10][10];
  14. int color;
  15. int size;
  16. }now, nextA, nextB, nextC, hold;
  17. int sblock[20][10][10] = {{{7, 0, 0, 0}, {0, 0, 1, 1}, {0, 1, 1, 0}, {0, 0, 0, 0}},
  18. {{8, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},
  19. {{9, 0, 0, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},
  20. {{10, 0, 0, 0}, {0, 0, 0, 1}, {0, 1, 1, 1}, {0, 0, 0, 0}},
  21. {{13, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}},
  22. {{5, 0, 0, 0}, {0, 1, 1, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
  23. {{16, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}},
  24. {{0, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}},
  25. {{1, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 1, 0, 0}},
  26. {{2, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}},
  27. {{11, 0, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},
  28. {{12, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}}, //11
  29. {{3, 0, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}},
  30. {{14, 1, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0}},
  31. {{15, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},
  32. {{4, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 1, 1}, {0, 0, 0, 0}},
  33. {{17, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 0}},
  34. {{18, 0, 0, 0}, {0, 0, 0, 0}, {0, 1, 1, 1}, {0, 0, 1, 0}}, //17
  35. {{6, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}}};
  36. HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);
  37. int map[22][12];
  38. int mode = 1;
  39. int fraction = 0;
  40. int positionX, positionY;
  41. bool locked;
  42. int keytime = 100000000;
  43. bool keytimeflag;
  44. int sleeptime = 0;
  45. bool holdflag = 1;
  46. int passcondition = 200;
  47. int addlinetime = 10000, addlineflag;
  48. int locktime = 1000;
  49. int keydownflag;
  50. int xray = 0;
  51. int firstwin = 1;
  52. int exfraction = 0;
  53. int exgamestarttime;
  54. int blind = 0;
  55. int lockdelay = 300;
  56. int clockms, stclockms;
  57. double blockpersecond, blockperminute;
  58. int blocknum;
  59. void gotoxy (int x, int y);
  60. void welcomepage ();
  61. void reset ();
  62. void choosedifficulty ();
  63. void ready_go ();
  64. void updatedata ();
  65. void updatetime ();
  66. type_block roundblock ();
  67. void printblock (type_block m_block, int x, int y);
  68. void clearblock (type_block m_block, int x, int y);
  69. int checkblock (type_block m_block, int x, int y);
  70. type_block myup (type_block m_block);
  71. type_block mydown (type_block m_block);
  72. void checkkey ();
  73. void checkline ();
  74. void addline ();
  75. void gameover ();
  76. void win ();
  77. void easy_extra_game ();
  78. void master_extra_game ();
  79. void shirase_extra_game ();
  80. int main()
  81. {
  82. welcomepage ();
  83. reset ();
  84. choosedifficulty();
  85. ready_go ();
  86. clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
  87. now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
  88. printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
  89. positionX = 0; positionY = 4; locked = 0;
  90. keytime = clock(); keytimeflag = 1;
  91. addlineflag = clock (); stclockms = clock ();
  92. while (1)
  93. {
  94. updatedata (); updatetime ();
  95. if (locked)
  96. {
  97. ++blocknum;
  98. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  99. now.color = -xray * 2;
  100. printblock (now, positionY * 2 + 8, positionX + 1);
  101. for (int i = 0; i < 4; ++i)
  102. {
  103. for (int j = 0; j < 4; ++j)
  104. {
  105. if (!(i + j))
  106. continue;
  107. if (now.a[i][j])
  108. map[positionX + i][positionY + j] = 1;
  109. }
  110. }
  111. checkline ();
  112. Sleep (lockdelay);
  113. updatetime ();
  114. if (blind)
  115. clearblock (now, positionY * 2 + 8, positionX + 1);
  116. locked = 0;
  117. clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
  118. now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
  119. printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
  120. positionX = 0; positionY = 4;
  121. if (!checkblock (now, positionX, positionY))
  122. gameover ();
  123. if (fraction % 100 != 99 && fraction != passcondition)
  124. ++fraction;
  125. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  126. gotoxy (56, 10);
  127. printf ("%4d", fraction);
  128. gotoxy (57, 11);
  129. printf ("---");
  130. gotoxy (56, 12);
  131. int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction;
  132. if (mode == 1 && lssc >= 200) lssc = 200;
  133. if (mode == 2 && lssc >= 999) lssc = 900;
  134. if (mode == 3 && lssc >= 1300) lssc = 1300;
  135. printf ("%4d", lssc);
  136. keytime = clock(); holdflag = 1;
  137. if (clock () - addlineflag > addlinetime)
  138. {
  139. addlineflag = clock ();
  140. addline ();
  141. }
  142. keydownflag = 0;
  143. }
  144. if (checkblock (now, positionX + 1, positionY))
  145. while (checkblock (now, positionX + 1, positionY))
  146. {
  147. ++positionX; updatetime ();
  148. if (sleeptime)
  149. {
  150. printblock (now, positionY * 2 + 8, positionX + 1);
  151. int sttime = clock (), timeover;
  152. while ((timeover = (clock () - sttime < sleeptime)) && !kbhit());
  153. clearblock (now, positionY * 2 + 8, positionX + 1);
  154. if (timeover)
  155. checkkey ();
  156. }
  157. checkkey ();
  158. }
  159. printblock (now, positionY * 2 + 8, positionX + 1);
  160. Sleep (100);
  161. clearblock (now, positionY * 2 + 8, positionX + 1);
  162. checkkey ();
  163. }
  164. }
  165. void gotoxy (int x, int y)
  166. {
  167. COORD pos;
  168. pos.X = x; pos.Y = y;
  169. SetConsoleCursorPosition (hOut, pos);
  170. }
  171. void welcomepage ()
  172. {
  173. puts (" ");
  174. puts (" ■■■■■■■■■■ ");
  175. puts (" ■■■■■■■■■■ ");
  176. puts (" ■■ ");
  177. puts (" ■■ ");
  178. puts (" ■■ ");
  179. puts (" ■■ ■■■■ ■ ■ ■ ■■■ ");
  180. puts (" ■■ ■ ■ ■■■■ ■ ■■■ ■ ■ ");
  181. puts (" ■■ ■■■■ ■ ■■ ■ ■ ");
  182. puts (" ■■ ■ ■ ■ ■ ■■■ ");
  183. puts (" ■■ ■■■■ ■ ■ ■ ■ ");
  184. puts (" ■ ");
  185. puts (" ■■■■ ");
  186. puts (" ");
  187. puts (" ------------------------------------------------------------------ ");
  188. puts (" CHAMPION ");
  189. puts (" ");
  190. puts (" ");
  191. puts (" ");
  192. puts (" ");
  193. puts (" ");
  194. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  195. int modnum = 0;
  196. while (1)
  197. {
  198. gotoxy (22, 20);
  199. if (modnum)
  200. puts ("PUSH START BUTTOM");
  201. else
  202. puts (" ");
  203. int sttime = clock (), timeover;
  204. while ((timeover = (clock () - sttime < 700)) && !kbhit());
  205. if (timeover)
  206. {
  207. if (_getch () == ' ')
  208. break;
  209. }
  210. modnum ^= 1;
  211. }
  212. gotoxy (0, 0);
  213. for (int i = 1; i <= 25; ++i)
  214. puts (" ");
  215. gotoxy (0, 0);
  216. }
  217. void reset ()
  218. {
  219. srand (time (0));
  220. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  221. puts ("");
  222. puts (" ■■■■■■■■■■■■");
  223. puts (" ■ ■");
  224. puts (" ■ ■");
  225. puts (" ■ ■");
  226. puts (" ■ ■");
  227. puts (" ■ ■");
  228. puts (" ■ ■");
  229. puts (" ■ ■");
  230. puts (" ■ ■");
  231. puts (" ■ ■");
  232. puts (" ■ ■");
  233. puts (" ■ ■");
  234. puts (" ■ ■");
  235. puts (" ■ ■");
  236. puts (" ■ ■");
  237. puts (" ■ ■");
  238. puts (" ■ ■");
  239. puts (" ■ ■");
  240. puts (" ■ ■");
  241. puts (" ■ ■");
  242. puts (" ■ ■");
  243. puts (" ■■■■■■■■■■■■");
  244. nextA = roundblock (); nextB = roundblock (); nextC = roundblock ();
  245. for (int i = 34; i <= 34 + nextA.size; ++i)
  246. {
  247. gotoxy (i, 4);
  248. for (int j = 4; j <= 4 + nextA.size; ++j)
  249. printf (" ");
  250. }
  251. printblock (nextA, 34, 4);
  252. for (int i = 38 + nextA.size; i <= 38 + nextA.size + nextB.size; ++i)
  253. {
  254. gotoxy (i, 4);
  255. for (int j = 4; j <= 4 + nextB.size; ++j)
  256. printf (" ");
  257. }
  258. printblock (nextB, 38 + nextA.size, 4);
  259. for (int i = 42 + nextA.size + nextB.size; i <= 42 + nextA.size + nextB.size + nextC.size; ++i)
  260. {
  261. gotoxy (i, 4);
  262. for (int j = 4; j <= 4 + nextC.size; ++j)
  263. printf (" ");
  264. }
  265. printblock (nextC, 42 + nextA.size + nextB.size, 4);
  266. for (int i = 1; i <= 20; ++i)
  267. map[i][0] = map[i][11] = 1;
  268. CONSOLE_CURSOR_INFO CursorInfo;
  269. GetConsoleCursorInfo (hOut, &CursorInfo);
  270. CursorInfo.bVisible = 0;
  271. SetConsoleCursorInfo (hOut, &CursorInfo);
  272. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  273. gotoxy (56, 10);
  274. printf ("%4d", fraction);
  275. gotoxy (57, 11);
  276. printf ("---");
  277. gotoxy (56, 12);
  278. if (fraction)
  279. printf ("%4d", fraction % 100 ? (fraction / 100 + 1) * 100 : fraction);
  280. else
  281. printf (" 100");
  282. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  283. gotoxy (45, 20);
  284. printf ("00:00:00");
  285. }
  286. void choosedifficulty ()
  287. {
  288. while (1)
  289. {
  290. gotoxy (0, 0);
  291. switch (mode)
  292. {
  293. case 1:
  294. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  295. puts ("");
  296. puts (" ■■■■■■■■■■■■");
  297. puts (" ■ ■");
  298. puts (" ■ ■");
  299. puts (" ■ ■");
  300. puts (" ■ ■");
  301. puts (" ■ ■");
  302. puts (" ■ ■");
  303. puts (" ■ ■");
  304. puts (" ■ ■");
  305. puts (" ■ ■");
  306. puts (" ■ ■");
  307. puts (" ■ ■");
  308. puts (" ■ ■");
  309. puts (" ■ ■");
  310. puts (" ■ ■");
  311. puts (" ■ ■");
  312. puts (" ■ ■");
  313. puts (" ■ ■");
  314. puts (" ■ ■");
  315. puts (" ■ ■");
  316. puts (" ■ ■");
  317. puts (" ■■■■■■■■■■■■");
  318. gotoxy (18, 9);
  319. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  320. puts (" EASY ");
  321. gotoxy (10, 16);
  322. printf ("慢速的经典俄罗斯");
  323. gotoxy (10, 17);
  324. printf ("方块,适合初学者.");
  325. break;
  326. case 2:
  327. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  328. puts ("");
  329. puts (" ■■■■■■■■■■■■");
  330. puts (" ■ ■");
  331. puts (" ■ ■");
  332. puts (" ■ ■");
  333. puts (" ■ ■");
  334. puts (" ■ ■");
  335. puts (" ■ ■");
  336. puts (" ■ ■");
  337. puts (" ■ ■");
  338. puts (" ■ ■");
  339. puts (" ■ ■");
  340. puts (" ■ ■");
  341. puts (" ■ ■");
  342. puts (" ■ ■");
  343. puts (" ■ ■");
  344. puts (" ■ ■");
  345. puts (" ■ ■");
  346. puts (" ■ ■");
  347. puts (" ■ ■");
  348. puts (" ■ ■");
  349. puts (" ■ ■");
  350. puts (" ■■■■■■■■■■■■");
  351. gotoxy (17, 9);
  352. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  353. puts ("MASTER ");
  354. gotoxy (10, 16);
  355. printf ("中速的街机俄罗斯");
  356. gotoxy (10, 17);
  357. printf ("方块,适合中级者.");
  358. break;
  359. case 3:
  360. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  361. puts ("");
  362. puts (" ■■■■■■■■■■■■");
  363. puts (" ■ ■");
  364. puts (" ■ ■");
  365. puts (" ■ ■");
  366. puts (" ■ ■");
  367. puts (" ■ ■");
  368. puts (" ■ ■");
  369. puts (" ■ ■");
  370. puts (" ■ ■");
  371. puts (" ■ ■");
  372. puts (" ■ ■");
  373. puts (" ■ ■");
  374. puts (" ■ ■");
  375. puts (" ■ ■");
  376. puts (" ■ ■");
  377. puts (" ■ ■");
  378. puts (" ■ ■");
  379. puts (" ■ ■");
  380. puts (" ■ ■");
  381. puts (" ■ ■");
  382. puts (" ■ ■");
  383. puts (" ■■■■■■■■■■■■");
  384. gotoxy (16, 9);
  385. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  386. puts ("SHIRASE");
  387. gotoxy (10, 16);
  388. printf ("高速俄罗斯方块,");
  389. gotoxy (10, 17);
  390. printf ("挑战速度的极限.");
  391. break;
  392. }
  393. char key = _getch ();
  394. if (key == 'i' && mode != 1)
  395. --mode;
  396. if (key == 'k' && mode != 3)
  397. ++mode;
  398. gotoxy (10, 16);
  399. printf (" ");
  400. gotoxy (10, 17);
  401. printf (" ");
  402. if (key == ' ')
  403. break;
  404. }
  405. gotoxy (16, 9);
  406. printf (" ");
  407. }
  408. void ready_go ()
  409. {
  410. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  411. Sleep (1000);
  412. gotoxy (18, 8);
  413. puts ("READY");
  414. Sleep (800);
  415. gotoxy (18, 8);
  416. puts (" GO! ");
  417. Sleep (800);
  418. gotoxy (18, 8);
  419. puts (" ");
  420. }
  421. void updatedata ()
  422. {
  423. switch (mode)
  424. {
  425. case 1:
  426. addlinetime = inf; lockdelay = 300;
  427. if (fraction >= 0)
  428. {
  429. sleeptime = 2000 - fraction * 5;
  430. locktime = 800;
  431. }
  432. else if (fraction >= 100)
  433. {
  434. sleeptime = 1000 - fraction * 5 / 2;
  435. locktime = 700;
  436. }
  437. if (fraction >= 200)
  438. win ();
  439. break;
  440. case 2:
  441. addlinetime = inf; lockdelay = 300;
  442. if (fraction >= 0)
  443. {
  444. sleeptime = 1000 - fraction * 3;
  445. locktime = 700;
  446. }
  447. if (fraction >= 100)
  448. {
  449. sleeptime = 1000 - fraction * 3;
  450. locktime = 600;
  451. }
  452. if (fraction >= 200)
  453. {
  454. sleeptime = 1000 - fraction * 3;
  455. locktime = 500;
  456. if (fraction >= 300)
  457. locktime = 700;
  458. else if (fraction >= 400)
  459. locktime = 600;
  460. }
  461. if (fraction >= 999)
  462. win ();
  463. break;
  464. case 3:
  465. addlinetime = inf; lockdelay = 300 - fraction / 400 * 50; sleeptime = 0;
  466. locktime = 240 - fraction / 300 * 40;
  467. if (fraction >= 600)
  468. addlinetime = 10000;
  469. if (fraction >= 800)
  470. addlinetime = 7000;
  471. if (fraction >= 1000)
  472. {
  473. addlinetime = inf;
  474. xray = 1;
  475. }
  476. if (fraction >= 1300)
  477. win ();
  478. }
  479. }
  480. void updatetime ()
  481. {
  482. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  483. gotoxy (45, 20); clockms = clock () - stclockms;
  484. printf ("%02d:%02d:%02d", clockms / 60000 % 100, clockms / 1000 % 60, clockms % 1000 / 10);
  485. }
  486. type_block roundblock ()
  487. {
  488. type_block c;
  489. int kind = rand () % 7;
  490. while (kind < 2 && fraction <= 6)
  491. kind = rand () % 7;
  492. c.size = 4; c.color = kind + 1;
  493. if (xray) c.color = -2;
  494. for (int i = 0; i < c.size; ++i)
  495. for (int j = 0; j < c.size; ++j)
  496. c.a[i][j] = sblock[kind][i][j];
  497. return c;
  498. }
  499. void printblock (type_block m_block, int x, int y)
  500. {
  501. switch (m_block.color)
  502. {
  503. case 1:
  504. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  505. break;
  506. case 2:
  507. SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  508. break;
  509. case 3:
  510. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  511. break;
  512. case 4:
  513. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED);
  514. break;
  515. case 5:
  516. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  517. break;
  518. case 6:
  519. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  520. break;
  521. case 7:
  522. SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_BLUE);
  523. break;
  524. case -1:
  525. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
  526. break;
  527. case -2:
  528. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
  529. break;
  530. default:
  531. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  532. break;
  533. }
  534. for (int i = 0; i < m_block.size; ++i)
  535. {
  536. for (int j = 0 + !i; j < m_block.size; ++j)
  537. if (m_block.a[i][j])
  538. {
  539. gotoxy (x + j * 2, y + i);
  540. if (xray)
  541. puts ("[]");
  542. else
  543. puts ("■");
  544. }
  545. }
  546. }
  547. void clearblock (type_block m_block, int x, int y)
  548. {
  549. for (int i = 0; i < m_block.size; ++i)
  550. {
  551. for (int j = 0 + !i; j < m_block.size; ++j)
  552. if (m_block.a[i][j])
  553. {
  554. gotoxy (x + j * 2, y + i);
  555. puts (" ");
  556. }
  557. }
  558. }
  559. int checkblock (type_block m_block, int x, int y)
  560. {
  561. for (int i = 0; i < m_block.size; ++i)
  562. for (int j = 0; j < m_block.size; ++j)
  563. {
  564. if (!(i + j))
  565. continue;
  566. if (m_block.a[i][j] && (map[x + i][y + j] || x + i > 20 || y + j < 1 || y + j > 10))
  567. return 0;
  568. }
  569. return 1;
  570. }
  571. type_block myup (type_block m_block)
  572. {
  573. type_block c;
  574. int kind = m_block.a[0][0];
  575. for (int i = 0; i < m_block.size; ++i)
  576. for (int j = 0; j < m_block.size; ++j)
  577. c.a[i][j] = sblock[kind][i][j];
  578. c.size = m_block.size; c.color = m_block.color;
  579. return c;
  580. }
  581. type_block mydown (type_block m_block)
  582. {
  583. type_block c = m_block;
  584. for (int t = 1; t <= 3; ++t)
  585. c = myup (c);
  586. return c;
  587. }
  588. void checkkey ()
  589. {
  590. if (checkblock (now, positionX + 1, positionY) && keydownflag < (sleeptime > 100 ? 0 : 4))
  591. {
  592. ++keydownflag;
  593. if (KEY_DOWN('J'))
  594. {
  595. if (checkblock (now, positionX, positionY - 1))
  596. --positionY;
  597. }
  598. if (KEY_DOWN('L'))
  599. {
  600. if (checkblock (now, positionX, positionY + 1))
  601. ++positionY;
  602. }
  603. }
  604. if (kbhit())
  605. {
  606. keytime = clock ();
  607. char key = _getch();
  608. if (key == 'j')
  609. {
  610. if (checkblock (now, positionX, positionY - 1))
  611. --positionY;
  612. }
  613. if (key == 'l')
  614. {
  615. if (checkblock (now, positionX, positionY + 1))
  616. ++positionY;
  617. }
  618. if (key == 's')
  619. {
  620. if (!holdflag)
  621. return;
  622. if (hold.a[0][0])
  623. {
  624. clearblock (hold, 60, 5);
  625. type_block t = now; now = hold; hold = t;
  626. printblock (hold, 60, 5);
  627. positionX = 0; positionY = 4; keytime = clock();
  628. holdflag = 0;
  629. }
  630. else
  631. {
  632. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  633. gotoxy (60, 4);
  634. puts ("Hold");
  635. clearblock (hold, 60, 5);
  636. hold = now;
  637. printblock (hold, 60, 5);
  638. clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
  639. now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
  640. printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
  641. positionX = 0; positionY = 4; keytime = clock();
  642. }
  643. }
  644. if (key == 'f')
  645. {
  646. type_block newnow = myup (now);
  647. if (checkblock (newnow, positionX, positionY))
  648. now = newnow;
  649. else if (checkblock (newnow, positionX - 1, positionY))
  650. {
  651. now = newnow;
  652. --positionX;
  653. }
  654. else if (checkblock (newnow, positionX - 2, positionY))
  655. {
  656. now = newnow;
  657. positionX -= 2;
  658. }
  659. else if (checkblock (newnow, positionX, positionY - 1))
  660. {
  661. now = newnow;
  662. --positionY;
  663. }
  664. else if (checkblock (newnow, positionX, positionY + 1))
  665. {
  666. now = newnow;
  667. ++positionY;
  668. }
  669. }
  670. if (key == 'd')
  671. {
  672. type_block newnow = mydown (now);
  673. if (checkblock (newnow, positionX, positionY))
  674. now = newnow;
  675. else if (checkblock (newnow, positionX - 1, positionY))
  676. {
  677. now = newnow;
  678. --positionX;
  679. }
  680. else if (checkblock (newnow, positionX - 2, positionY))
  681. {
  682. now = newnow;
  683. positionX -= 2;
  684. }
  685. else if (checkblock (newnow, positionX, positionY - 1))
  686. {
  687. now = newnow;
  688. --positionY;
  689. }
  690. else if (checkblock (newnow, positionX, positionY + 1))
  691. {
  692. now = newnow;
  693. ++positionY;
  694. }
  695. }
  696. if (KEY_DOWN(' '))
  697. {
  698. for (int i = 1; i <= 20; ++i)
  699. if (checkblock (now, positionX + 1, positionY))
  700. ++positionX;
  701. locked = 1;
  702. }
  703. }
  704. if (clock() - keytime > locktime && !checkblock (now, positionX + 1, positionY))
  705. locked = 1;
  706. }
  707. void checkline ()
  708. {
  709. bool tf = 0;
  710. for (int i = 1; i <= 20; ++i)
  711. {
  712. int x = 0;
  713. for (int j = 1; j <= 10; ++j)
  714. if (map[i][j])
  715. ++x;
  716. if (x == 10)
  717. {
  718. tf = 1;
  719. for (int k = i; k >= 1; --k)
  720. for (int l = 1; l <= 10; ++l)
  721. map[k][l] = map[k - 1][l];
  722. SetConsoleTextAttribute (hOut, FOREGROUND_RED);
  723. gotoxy (10, i + 1);
  724. for (int k = 1; k <= 10; ++k)
  725. {
  726. map[1][k] = 0;
  727. printf ("..");
  728. }
  729. if (firstwin)
  730. ++fraction;
  731. }
  732. }
  733. if (tf)
  734. {
  735. Sleep (100);
  736. if (xray)
  737. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
  738. else
  739. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  740. for (int i = 1; i <= 20; ++i)
  741. {
  742. gotoxy (10, i + 1);
  743. for (int j = 1; j <= 10; ++j)
  744. if (map[i][j] && !blind)
  745. if (xray)
  746. printf ("[]");
  747. else
  748. printf ("■");
  749. else
  750. printf (" ");
  751. }
  752. }
  753. }
  754. void addline ()
  755. {
  756. for (int i = 1; i <= 19; ++i)
  757. for (int j = 1; j <= 10; ++j)
  758. map[i][j] = map[i + 1][j];
  759. for (int i = 1; i <= 10; ++i)
  760. map[20][i] = map[19][i];
  761. if (xray)
  762. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
  763. else
  764. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  765. for (int i = 1; i <= 20; ++i)
  766. {
  767. gotoxy (10, i + 1);
  768. for (int j = 1; j <= 10; ++j)
  769. if (map[i][j] && !(i != 1 && blind))
  770. if (xray)
  771. printf ("[]");
  772. else
  773. printf ("■");
  774. else
  775. printf (" ");
  776. }
  777. if (blind)
  778. {
  779. Sleep (200);
  780. gotoxy (10, 2);
  781. printf (" ");
  782. }
  783. }
  784. void gameover ()
  785. {
  786. clockms = clock () - stclockms;
  787. blockpersecond = (double) blocknum / clockms * 1000; blockperminute = blockpersecond * 60.0;
  788. for (int i = 20; i >= 1; --i)
  789. {
  790. for (int j = 1; j <= 10; ++j)
  791. {
  792. gotoxy (j * 2 + 8, i + 1);
  793. puts (" ");
  794. }
  795. Sleep (150);
  796. }
  797. Sleep (2000);
  798. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
  799. gotoxy (14, 10);
  800. puts (" 暂定段位");
  801. gotoxy (13, 19);
  802. printf ("BPS %lf", blockpersecond);
  803. gotoxy (13, 20);
  804. printf ("BPM %lf", blockperminute);
  805. for (int i = 1; i <= 29; ++i)
  806. {
  807. if (i % 2)
  808. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  809. else
  810. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
  811. gotoxy (19, 13);
  812. switch (mode)
  813. {
  814. case 1:
  815. gotoxy (18, 13);
  816. printf ("H%d", fraction + exfraction * 10 + rand () % 10);
  817. break;
  818. case 2:
  819. if (fraction >= 999)
  820. printf ("S13");
  821. else if (fraction >= 950)
  822. printf ("S12");
  823. else if (fraction >= 900)
  824. printf ("S11");
  825. else if (fraction >= 850)
  826. printf ("S10");
  827. else if (fraction >= 800)
  828. printf ("S9");
  829. else if (fraction >= 750)
  830. printf ("S8");
  831. else if (fraction >= 700)
  832. printf ("S7");
  833. else if (fraction >= 650)
  834. printf ("S6");
  835. else if (fraction >= 600)
  836. printf ("S5");
  837. else if (fraction >= 550)
  838. printf ("S4");
  839. else if (fraction >= 500)
  840. printf ("S3");
  841. else if (fraction >= 450)
  842. printf ("S2");
  843. else if (fraction >= 400)
  844. printf ("S1");
  845. else if (fraction >= 350)
  846. printf (" 1");
  847. else if (fraction >= 300)
  848. printf (" 2");
  849. else if (fraction >= 250)
  850. printf (" 3");
  851. else if (fraction >= 200)
  852. printf (" 4");
  853. else if (fraction >= 150)
  854. printf (" 5");
  855. else if (fraction >= 100)
  856. printf (" 6");
  857. else if (fraction >= 50)
  858. printf (" 7");
  859. else printf (" 8");
  860. break;
  861. case 3:
  862. if (fraction >= 1300)
  863. printf ("S13");
  864. else if (fraction >= 1200)
  865. printf ("S12");
  866. else if (fraction >= 1100)
  867. printf ("S11");
  868. else if (fraction >= 1000)
  869. printf ("S10");
  870. else if (fraction >= 900)
  871. printf ("S9");
  872. else if (fraction >= 800)
  873. printf ("S8");
  874. else if (fraction >= 700)
  875. printf ("S7");
  876. else if (fraction >= 600)
  877. printf ("S6");
  878. else if (fraction >= 500)
  879. printf ("S5");
  880. else if (fraction >= 400)
  881. printf ("S4");
  882. else if (fraction >= 300)
  883. printf ("S3");
  884. else if (fraction >= 200)
  885. printf ("S2");
  886. else if (fraction >= 100)
  887. printf ("S1");
  888. else
  889. {
  890. gotoxy (15, 13);
  891. printf ("Let's go");
  892. gotoxy (15, 14);
  893. printf ("better");
  894. gotoxy (15, 15);
  895. printf ("next time!");
  896. }
  897. break;
  898. }
  899. Sleep (120);
  900. }
  901. Sleep (2000);
  902. system ("pause>nul");
  903. exit (0);
  904. }
  905. void win ()
  906. {
  907. if (firstwin)
  908. {
  909. for (int i = 20; i >= 1; --i)
  910. {
  911. for (int j = 1; j <= 10; ++j)
  912. {
  913. gotoxy (j * 2 + 8, i + 1);
  914. puts (" ");
  915. map[i][j] = 0;
  916. }
  917. Sleep (150);
  918. }
  919. Sleep (1000);
  920. firstwin = 0;
  921. switch (mode)
  922. {
  923. case 1:
  924. easy_extra_game ();
  925. break;
  926. case 2:
  927. master_extra_game ();
  928. break;
  929. case 3:
  930. shirase_extra_game ();
  931. break;
  932. default:
  933. break;
  934. }
  935. return;
  936. }
  937. gotoxy (15, 9);
  938. switch (mode)
  939. {
  940. case 1:
  941. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  942. puts (" EASY MODE ");
  943. break;
  944. case 2:
  945. SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  946. puts (" MASTER MODE");
  947. break;
  948. case 3:
  949. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  950. puts ("SHIRASE MODE");
  951. break;
  952. }
  953. gotoxy (15, 10);
  954. puts (" ALL CLEAR ");
  955. Sleep (5000);
  956. gotoxy (15, 9);
  957. puts (" ");
  958. gotoxy (15, 10);
  959. puts (" ");
  960. gameover ();
  961. }
  962. void easy_extra_game ()
  963. {
  964. sleeptime = 0; exgamestarttime = clock (); locktime = 300; keytime = clock ();
  965. if (mode == 3)
  966. locktime = 200;
  967. while (clock () - exgamestarttime < 40000)
  968. {
  969. if (locked)
  970. {
  971. ++exfraction;
  972. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  973. now.color = -xray * 2;
  974. printblock (now, positionY * 2 + 8, positionX + 1);
  975. for (int i = 0; i < 4; ++i)
  976. {
  977. for (int j = 0; j < 4; ++j)
  978. {
  979. if (!(i + j))
  980. continue;
  981. if (now.a[i][j])
  982. map[positionX + i][positionY + j] = 1;
  983. }
  984. }
  985. checkline ();
  986. Sleep (lockdelay);
  987. if (blind)
  988. clearblock (now, positionY * 2 + 8, positionX + 1);
  989. locked = 0;
  990. clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
  991. now = nextA; nextA = nextB; nextB = nextC;
  992. if (mode == 3 && !rand () % 4)
  993. xray = 0;
  994. nextC = roundblock();
  995. xray = 1;
  996. printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
  997. positionX = 0; positionY = 4;
  998. if (!checkblock (now, positionX, positionY))
  999. gameover ();
  1000. SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  1001. gotoxy (56, 10);
  1002. printf ("%4d", fraction);
  1003. gotoxy (57, 11);
  1004. printf ("---");
  1005. gotoxy (56, 12);
  1006. int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction;
  1007. if (mode == 1 && lssc >= 200) lssc = 200;
  1008. if (mode == 2 && lssc >= 999) lssc = 900;
  1009. if (mode == 3 && lssc >= 1300) lssc = 1300;
  1010. printf ("%4d", lssc);
  1011. keytime = clock(); holdflag = 1;
  1012. if (clock () - addlineflag > addlinetime)
  1013. {
  1014. addlineflag = clock ();
  1015. addline ();
  1016. }
  1017. keydownflag = 0;
  1018. }
  1019. if (checkblock (now, positionX + 1, positionY))
  1020. while (checkblock (now, positionX + 1, positionY))
  1021. {
  1022. ++positionX;
  1023. if (sleeptime)
  1024. {
  1025. printblock (now, positionY * 2 + 8, positionX + 1);
  1026. int sttime = clock (), timeover;
  1027. while ((timeover = (clock () - sttime < sleeptime)) && !kbhit());
  1028. clearblock (now, positionY * 2 + 8, positionX + 1);
  1029. if (timeover)
  1030. checkkey ();
  1031. }
  1032. checkkey ();
  1033. }
  1034. printblock (now, positionY * 2 + 8, positionX + 1);
  1035. Sleep (100);
  1036. clearblock (now, positionY * 2 + 8, positionX + 1);
  1037. checkkey ();
  1038. }
  1039. if (xray)
  1040. SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
  1041. else
  1042. SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
  1043. for (int i = 1; i <= 20; ++i)
  1044. {
  1045. gotoxy (10, i + 1);
  1046. for (int j = 1; j <= 10; ++j)
  1047. if (map[i][j])
  1048. if (xray)
  1049. printf ("[]");
  1050. else
  1051. printf ("■");
  1052. else
  1053. printf (" ");
  1054. }
  1055. win ();
  1056. }
  1057. void master_extra_game ()
  1058. {
  1059. blind = 1;
  1060. easy_extra_game ();
  1061. }
  1062. void shirase_extra_game ()
  1063. {
  1064. blind = 1;
  1065. easy_extra_game ();
  1066. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号