C++如何实现俄罗斯方块小游戏
发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,这篇文章主要为大家展示了"C++如何实现俄罗斯方块小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++如何实现俄罗斯方块小游戏"这篇文章吧。具体内容
千家信息网最后更新 2025年02月19日C++如何实现俄罗斯方块小游戏
这篇文章主要为大家展示了"C++如何实现俄罗斯方块小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++如何实现俄罗斯方块小游戏"这篇文章吧。
具体内容如下
操作说明:
D F:左右旋转
J L:左右移动
E(一堆键都行): 加快下落速度
空格: 开始游戏 与 一落到底
上代码!
#include#include #include #include #include #include #include using namespace std;#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define inf 2147483647struct type_block{ int a[10][10]; int color; int size;}now, nextA, nextB, nextC, hold;int sblock[20][10][10] = {{{7, 0, 0, 0}, {0, 0, 1, 1}, {0, 1, 1, 0}, {0, 0, 0, 0}},{{8, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},{{9, 0, 0, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},{{10, 0, 0, 0}, {0, 0, 0, 1}, {0, 1, 1, 1}, {0, 0, 0, 0}},{{13, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}},{{5, 0, 0, 0}, {0, 1, 1, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},{{16, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}}, {{0, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}},{{1, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 1, 0, 0}},{{2, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}},{{11, 0, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},{{12, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}}, //11{{3, 0, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}},{{14, 1, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0}},{{15, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},{{4, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 1, 1}, {0, 0, 0, 0}},{{17, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 0}},{{18, 0, 0, 0}, {0, 0, 0, 0}, {0, 1, 1, 1}, {0, 0, 1, 0}}, //17{{6, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}}};HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);int map[22][12];int mode = 1;int fraction = 0;int positionX, positionY;bool locked;int keytime = 100000000;bool keytimeflag;int sleeptime = 0;bool holdflag = 1;int passcondition = 200;int addlinetime = 10000, addlineflag;int locktime = 1000;int keydownflag;int xray = 0;int firstwin = 1;int exfraction = 0;int exgamestarttime;int blind = 0;int lockdelay = 300;int clockms, stclockms;double blockpersecond, blockperminute;int blocknum;void gotoxy (int x, int y);void welcomepage ();void reset ();void choosedifficulty ();void ready_go ();void updatedata ();void updatetime ();type_block roundblock ();void printblock (type_block m_block, int x, int y);void clearblock (type_block m_block, int x, int y);int checkblock (type_block m_block, int x, int y);type_block myup (type_block m_block);type_block mydown (type_block m_block);void checkkey ();void checkline ();void addline ();void gameover ();void win ();void easy_extra_game ();void master_extra_game ();void shirase_extra_game ();int main(){ welcomepage (); reset (); choosedifficulty(); ready_go (); clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4); now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock(); printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4); positionX = 0; positionY = 4; locked = 0; keytime = clock(); keytimeflag = 1; addlineflag = clock (); stclockms = clock (); while (1) { updatedata (); updatetime (); if (locked) { ++blocknum; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); now.color = -xray * 2; printblock (now, positionY * 2 + 8, positionX + 1); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (!(i + j)) continue; if (now.a[i][j]) map[positionX + i][positionY + j] = 1; } } checkline (); Sleep (lockdelay); updatetime (); if (blind) clearblock (now, positionY * 2 + 8, positionX + 1); locked = 0; clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4); now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock(); printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4); positionX = 0; positionY = 4; if (!checkblock (now, positionX, positionY)) gameover (); if (fraction % 100 != 99 && fraction != passcondition) ++fraction; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (56, 10); printf ("%4d", fraction); gotoxy (57, 11); printf ("---"); gotoxy (56, 12); int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction; if (mode == 1 && lssc >= 200) lssc = 200; if (mode == 2 && lssc >= 999) lssc = 900; if (mode == 3 && lssc >= 1300) lssc = 1300; printf ("%4d", lssc); keytime = clock(); holdflag = 1; if (clock () - addlineflag > addlinetime) { addlineflag = clock (); addline (); } keydownflag = 0; } if (checkblock (now, positionX + 1, positionY)) while (checkblock (now, positionX + 1, positionY)) { ++positionX; updatetime (); if (sleeptime) { printblock (now, positionY * 2 + 8, positionX + 1); int sttime = clock (), timeover; while ((timeover = (clock () - sttime < sleeptime)) && !kbhit()); clearblock (now, positionY * 2 + 8, positionX + 1); if (timeover) checkkey (); } checkkey (); } printblock (now, positionY * 2 + 8, positionX + 1); Sleep (100); clearblock (now, positionY * 2 + 8, positionX + 1); checkkey (); }} void gotoxy (int x, int y){ COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition (hOut, pos);}void welcomepage (){ puts (" "); puts (" ■■■■■■■■■■ "); puts (" ■■■■■■■■■■ "); puts (" ■■ "); puts (" ■■ "); puts (" ■■ "); puts (" ■■ ■■■■ ■ ■ ■ ■■■ "); puts (" ■■ ■ ■ ■■■■ ■ ■■■ ■ ■ "); puts (" ■■ ■■■■ ■ ■■ ■ ■ "); puts (" ■■ ■ ■ ■ ■ ■■■ "); puts (" ■■ ■■■■ ■ ■ ■ ■ "); puts (" ■ "); puts (" ■■■■ "); puts (" "); puts (" ------------------------------------------------------------------ "); puts (" CHAMPION "); puts (" "); puts (" "); puts (" "); puts (" "); puts (" "); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); int modnum = 0; while (1) { gotoxy (22, 20); if (modnum) puts ("PUSH START BUTTOM"); else puts (" "); int sttime = clock (), timeover; while ((timeover = (clock () - sttime < 700)) && !kbhit()); if (timeover) { if (_getch () == ' ') break; } modnum ^= 1; } gotoxy (0, 0); for (int i = 1; i <= 25; ++i) puts (" "); gotoxy (0, 0);}void reset (){ srand (time (0)); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); puts (""); puts (" ■■■■■■■■■■■■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■■■■■■■■■■■■"); nextA = roundblock (); nextB = roundblock (); nextC = roundblock (); for (int i = 34; i <= 34 + nextA.size; ++i) { gotoxy (i, 4); for (int j = 4; j <= 4 + nextA.size; ++j) printf (" "); } printblock (nextA, 34, 4); for (int i = 38 + nextA.size; i <= 38 + nextA.size + nextB.size; ++i) { gotoxy (i, 4); for (int j = 4; j <= 4 + nextB.size; ++j) printf (" "); } printblock (nextB, 38 + nextA.size, 4); for (int i = 42 + nextA.size + nextB.size; i <= 42 + nextA.size + nextB.size + nextC.size; ++i) { gotoxy (i, 4); for (int j = 4; j <= 4 + nextC.size; ++j) printf (" "); } printblock (nextC, 42 + nextA.size + nextB.size, 4); for (int i = 1; i <= 20; ++i) map[i][0] = map[i][11] = 1; CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo (hOut, &CursorInfo); CursorInfo.bVisible = 0; SetConsoleCursorInfo (hOut, &CursorInfo); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (56, 10); printf ("%4d", fraction); gotoxy (57, 11); printf ("---"); gotoxy (56, 12); if (fraction) printf ("%4d", fraction % 100 ? (fraction / 100 + 1) * 100 : fraction); else printf (" 100"); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (45, 20); printf ("00:00:00");}void choosedifficulty (){ while (1) { gotoxy (0, 0); switch (mode) { case 1: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); puts (""); puts (" ■■■■■■■■■■■■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■■■■■■■■■■■■"); gotoxy (18, 9); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); puts (" EASY "); gotoxy (10, 16); printf ("慢速的经典俄罗斯"); gotoxy (10, 17); printf ("方块,适合初学者."); break; case 2: SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); puts (""); puts (" ■■■■■■■■■■■■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■■■■■■■■■■■■"); gotoxy (17, 9); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); puts ("MASTER "); gotoxy (10, 16); printf ("中速的街机俄罗斯"); gotoxy (10, 17); printf ("方块,适合中级者."); break; case 3: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); puts (""); puts (" ■■■■■■■■■■■■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■ ■"); puts (" ■■■■■■■■■■■■"); gotoxy (16, 9); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); puts ("SHIRASE"); gotoxy (10, 16); printf ("高速俄罗斯方块,"); gotoxy (10, 17); printf ("挑战速度的极限."); break; } char key = _getch (); if (key == 'i' && mode != 1) --mode; if (key == 'k' && mode != 3) ++mode; gotoxy (10, 16); printf (" "); gotoxy (10, 17); printf (" "); if (key == ' ') break; } gotoxy (16, 9); printf (" ");} void ready_go (){ SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); Sleep (1000); gotoxy (18, 8); puts ("READY"); Sleep (800); gotoxy (18, 8); puts (" GO! "); Sleep (800); gotoxy (18, 8); puts (" ");}void updatedata (){ switch (mode) { case 1: addlinetime = inf; lockdelay = 300; if (fraction >= 0) { sleeptime = 2000 - fraction * 5; locktime = 800; } else if (fraction >= 100) { sleeptime = 1000 - fraction * 5 / 2; locktime = 700; } if (fraction >= 200) win (); break; case 2: addlinetime = inf; lockdelay = 300; if (fraction >= 0) { sleeptime = 1000 - fraction * 3; locktime = 700; } if (fraction >= 100) { sleeptime = 1000 - fraction * 3; locktime = 600; } if (fraction >= 200) { sleeptime = 1000 - fraction * 3; locktime = 500; if (fraction >= 300) locktime = 700; else if (fraction >= 400) locktime = 600; } if (fraction >= 999) win (); break; case 3: addlinetime = inf; lockdelay = 300 - fraction / 400 * 50; sleeptime = 0; locktime = 240 - fraction / 300 * 40; if (fraction >= 600) addlinetime = 10000; if (fraction >= 800) addlinetime = 7000; if (fraction >= 1000) { addlinetime = inf; xray = 1; } if (fraction >= 1300) win (); }}void updatetime (){ SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (45, 20); clockms = clock () - stclockms; printf ("d:d:d", clockms / 60000 % 100, clockms / 1000 % 60, clockms % 1000 / 10);}type_block roundblock (){ type_block c; int kind = rand () % 7; while (kind < 2 && fraction <= 6) kind = rand () % 7; c.size = 4; c.color = kind + 1; if (xray) c.color = -2; for (int i = 0; i < c.size; ++i) for (int j = 0; j < c.size; ++j) c.a[i][j] = sblock[kind][i][j]; return c;}void printblock (type_block m_block, int x, int y){ switch (m_block.color) { case 1: SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case 2: SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); break; case 3: SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 4: SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED); break; case 5: SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case 6: SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); break; case 7: SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_BLUE); break; case -1: SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); break; case -2: SetConsoleTextAttribute (hOut, FOREGROUND_GREEN); break; default: SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); break; } for (int i = 0; i < m_block.size; ++i) { for (int j = 0 + !i; j < m_block.size; ++j) if (m_block.a[i][j]) { gotoxy (x + j * 2, y + i); if (xray) puts ("[]"); else puts ("■"); } }}void clearblock (type_block m_block, int x, int y){ for (int i = 0; i < m_block.size; ++i) { for (int j = 0 + !i; j < m_block.size; ++j) if (m_block.a[i][j]) { gotoxy (x + j * 2, y + i); puts (" "); } }}int checkblock (type_block m_block, int x, int y){ for (int i = 0; i < m_block.size; ++i) for (int j = 0; j < m_block.size; ++j) { if (!(i + j)) continue; if (m_block.a[i][j] && (map[x + i][y + j] || x + i > 20 || y + j < 1 || y + j > 10)) return 0; } return 1;}type_block myup (type_block m_block){ type_block c; int kind = m_block.a[0][0]; for (int i = 0; i < m_block.size; ++i) for (int j = 0; j < m_block.size; ++j) c.a[i][j] = sblock[kind][i][j]; c.size = m_block.size; c.color = m_block.color; return c;}type_block mydown (type_block m_block){ type_block c = m_block; for (int t = 1; t <= 3; ++t) c = myup (c); return c;}void checkkey (){ if (checkblock (now, positionX + 1, positionY) && keydownflag < (sleeptime > 100 ? 0 : 4)) { ++keydownflag; if (KEY_DOWN('J')) { if (checkblock (now, positionX, positionY - 1)) --positionY; } if (KEY_DOWN('L')) { if (checkblock (now, positionX, positionY + 1)) ++positionY; } } if (kbhit()) { keytime = clock (); char key = _getch(); if (key == 'j') { if (checkblock (now, positionX, positionY - 1)) --positionY; } if (key == 'l') { if (checkblock (now, positionX, positionY + 1)) ++positionY; } if (key == 's') { if (!holdflag) return; if (hold.a[0][0]) { clearblock (hold, 60, 5); type_block t = now; now = hold; hold = t; printblock (hold, 60, 5); positionX = 0; positionY = 4; keytime = clock(); holdflag = 0; } else { SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (60, 4); puts ("Hold"); clearblock (hold, 60, 5); hold = now; printblock (hold, 60, 5); clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4); now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock(); printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4); positionX = 0; positionY = 4; keytime = clock(); } } if (key == 'f') { type_block newnow = myup (now); if (checkblock (newnow, positionX, positionY)) now = newnow; else if (checkblock (newnow, positionX - 1, positionY)) { now = newnow; --positionX; } else if (checkblock (newnow, positionX - 2, positionY)) { now = newnow; positionX -= 2; } else if (checkblock (newnow, positionX, positionY - 1)) { now = newnow; --positionY; } else if (checkblock (newnow, positionX, positionY + 1)) { now = newnow; ++positionY; } } if (key == 'd') { type_block newnow = mydown (now); if (checkblock (newnow, positionX, positionY)) now = newnow; else if (checkblock (newnow, positionX - 1, positionY)) { now = newnow; --positionX; } else if (checkblock (newnow, positionX - 2, positionY)) { now = newnow; positionX -= 2; } else if (checkblock (newnow, positionX, positionY - 1)) { now = newnow; --positionY; } else if (checkblock (newnow, positionX, positionY + 1)) { now = newnow; ++positionY; } } if (KEY_DOWN(' ')) { for (int i = 1; i <= 20; ++i) if (checkblock (now, positionX + 1, positionY)) ++positionX; locked = 1; } } if (clock() - keytime > locktime && !checkblock (now, positionX + 1, positionY)) locked = 1;}void checkline (){ bool tf = 0; for (int i = 1; i <= 20; ++i) { int x = 0; for (int j = 1; j <= 10; ++j) if (map[i][j]) ++x; if (x == 10) { tf = 1; for (int k = i; k >= 1; --k) for (int l = 1; l <= 10; ++l) map[k][l] = map[k - 1][l]; SetConsoleTextAttribute (hOut, FOREGROUND_RED); gotoxy (10, i + 1); for (int k = 1; k <= 10; ++k) { map[1][k] = 0; printf (".."); } if (firstwin) ++fraction; } } if (tf) { Sleep (100); if (xray) SetConsoleTextAttribute (hOut, FOREGROUND_GREEN); else SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); for (int i = 1; i <= 20; ++i) { gotoxy (10, i + 1); for (int j = 1; j <= 10; ++j) if (map[i][j] && !blind) if (xray) printf ("[]"); else printf ("■"); else printf (" "); } }}void addline (){ for (int i = 1; i <= 19; ++i) for (int j = 1; j <= 10; ++j) map[i][j] = map[i + 1][j]; for (int i = 1; i <= 10; ++i) map[20][i] = map[19][i]; if (xray) SetConsoleTextAttribute (hOut, FOREGROUND_GREEN); else SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); for (int i = 1; i <= 20; ++i) { gotoxy (10, i + 1); for (int j = 1; j <= 10; ++j) if (map[i][j] && !(i != 1 && blind)) if (xray) printf ("[]"); else printf ("■"); else printf (" "); } if (blind) { Sleep (200); gotoxy (10, 2); printf (" "); }}void gameover (){ clockms = clock () - stclockms; blockpersecond = (double) blocknum / clockms * 1000; blockperminute = blockpersecond * 60.0; for (int i = 20; i >= 1; --i) { for (int j = 1; j <= 10; ++j) { gotoxy (j * 2 + 8, i + 1); puts (" "); } Sleep (150); } Sleep (2000); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); gotoxy (14, 10); puts (" 暂定段位"); gotoxy (13, 19); printf ("BPS %lf", blockpersecond); gotoxy (13, 20); printf ("BPM %lf", blockperminute); for (int i = 1; i <= 29; ++i) { if (i % 2) SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); else SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); gotoxy (19, 13); switch (mode) { case 1: gotoxy (18, 13); printf ("H%d", fraction + exfraction * 10 + rand () % 10); break; case 2: if (fraction >= 999) printf ("S13"); else if (fraction >= 950) printf ("S12"); else if (fraction >= 900) printf ("S11"); else if (fraction >= 850) printf ("S10"); else if (fraction >= 800) printf ("S9"); else if (fraction >= 750) printf ("S8"); else if (fraction >= 700) printf ("S7"); else if (fraction >= 650) printf ("S6"); else if (fraction >= 600) printf ("S5"); else if (fraction >= 550) printf ("S4"); else if (fraction >= 500) printf ("S3"); else if (fraction >= 450) printf ("S2"); else if (fraction >= 400) printf ("S1"); else if (fraction >= 350) printf (" 1"); else if (fraction >= 300) printf (" 2"); else if (fraction >= 250) printf (" 3"); else if (fraction >= 200) printf (" 4"); else if (fraction >= 150) printf (" 5"); else if (fraction >= 100) printf (" 6"); else if (fraction >= 50) printf (" 7"); else printf (" 8"); break; case 3: if (fraction >= 1300) printf ("S13"); else if (fraction >= 1200) printf ("S12"); else if (fraction >= 1100) printf ("S11"); else if (fraction >= 1000) printf ("S10"); else if (fraction >= 900) printf ("S9"); else if (fraction >= 800) printf ("S8"); else if (fraction >= 700) printf ("S7"); else if (fraction >= 600) printf ("S6"); else if (fraction >= 500) printf ("S5"); else if (fraction >= 400) printf ("S4"); else if (fraction >= 300) printf ("S3"); else if (fraction >= 200) printf ("S2"); else if (fraction >= 100) printf ("S1"); else { gotoxy (15, 13); printf ("Let's go"); gotoxy (15, 14); printf ("better"); gotoxy (15, 15); printf ("next time!"); } break; } Sleep (120); } Sleep (2000); system ("pause>nul"); exit (0);}void win (){ if (firstwin) { for (int i = 20; i >= 1; --i) { for (int j = 1; j <= 10; ++j) { gotoxy (j * 2 + 8, i + 1); puts (" "); map[i][j] = 0; } Sleep (150); } Sleep (1000); firstwin = 0; switch (mode) { case 1: easy_extra_game (); break; case 2: master_extra_game (); break; case 3: shirase_extra_game (); break; default: break; } return; } gotoxy (15, 9); switch (mode) { case 1: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); puts (" EASY MODE "); break; case 2: SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY); puts (" MASTER MODE"); break; case 3: SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY); puts ("SHIRASE MODE"); break; } gotoxy (15, 10); puts (" ALL CLEAR "); Sleep (5000); gotoxy (15, 9); puts (" "); gotoxy (15, 10); puts (" "); gameover ();}void easy_extra_game (){ sleeptime = 0; exgamestarttime = clock (); locktime = 300; keytime = clock (); if (mode == 3) locktime = 200; while (clock () - exgamestarttime < 40000) { if (locked) { ++exfraction; SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); now.color = -xray * 2; printblock (now, positionY * 2 + 8, positionX + 1); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (!(i + j)) continue; if (now.a[i][j]) map[positionX + i][positionY + j] = 1; } } checkline (); Sleep (lockdelay); if (blind) clearblock (now, positionY * 2 + 8, positionX + 1); locked = 0; clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4); now = nextA; nextA = nextB; nextB = nextC; if (mode == 3 && !rand () % 4) xray = 0; nextC = roundblock(); xray = 1; printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4); positionX = 0; positionY = 4; if (!checkblock (now, positionX, positionY)) gameover (); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); gotoxy (56, 10); printf ("%4d", fraction); gotoxy (57, 11); printf ("---"); gotoxy (56, 12); int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction; if (mode == 1 && lssc >= 200) lssc = 200; if (mode == 2 && lssc >= 999) lssc = 900; if (mode == 3 && lssc >= 1300) lssc = 1300; printf ("%4d", lssc); keytime = clock(); holdflag = 1; if (clock () - addlineflag > addlinetime) { addlineflag = clock (); addline (); } keydownflag = 0; } if (checkblock (now, positionX + 1, positionY)) while (checkblock (now, positionX + 1, positionY)) { ++positionX; if (sleeptime) { printblock (now, positionY * 2 + 8, positionX + 1); int sttime = clock (), timeover; while ((timeover = (clock () - sttime < sleeptime)) && !kbhit()); clearblock (now, positionY * 2 + 8, positionX + 1); if (timeover) checkkey (); } checkkey (); } printblock (now, positionY * 2 + 8, positionX + 1); Sleep (100); clearblock (now, positionY * 2 + 8, positionX + 1); checkkey (); } if (xray) SetConsoleTextAttribute (hOut, FOREGROUND_GREEN); else SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); for (int i = 1; i <= 20; ++i) { gotoxy (10, i + 1); for (int j = 1; j <= 10; ++j) if (map[i][j]) if (xray) printf ("[]"); else printf ("■"); else printf (" "); } win ();}void master_extra_game (){ blind = 1; easy_extra_game ();}void shirase_extra_game (){ blind = 1; easy_extra_game ();}
以上是"C++如何实现俄罗斯方块小游戏"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
内容
小游戏
方块
俄罗斯
C++
篇文章
c.a
学习
帮助
上代
操作说明
易懂
更多
条理
段位
知识
空格
编带
行业
资讯
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
wifi网络安全版本过低
网络安全大赛人员名单
mysql服务器管理权限
qq国家网络安全宣传周
沧州南皮网络技术
nas网络服务器linux
数据库有关书籍读后感
怎样使用第三方软件开发
微软总部软件开发测试
常见数据库的软件
网站数据库能对接么
个人网络安全信息咨询
数据库id自增长删除后
新疆新华科技互联网学院
工商联数据库管理系统
网络安全软件的选择
济南erp软件开发怎么收费
后端软件开发mac笔记本要求
网络安全保障网络安全数据的
我的世界混乱服务器第一集
软件开发必学技能
卫星互联网与金融科技
网络技术和网络工程哪个好学
家用nas存储服务器
fpga软件开发教程
网站数据库能对接么
互联网科技公司绘图用什么软件
一般厂家什么时候更新数据库
怎样把服务器图标放在桌面
宣州区专业软件开发服务解决方案