C++如何实现俄罗斯方块小游戏
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这篇文章主要为大家展示了"C++如何实现俄罗斯方块小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++如何实现俄罗斯方块小游戏"这篇文章吧。具体内容
千家信息网最后更新 2024年11月18日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安全错误
数据库的锁怎样保障安全
数据库为什么要容器化
apk包没有数据库文件
我的世界怎么做其他服务器
什么软件开发oa系统
根河软件开发设计
贵阳信息网络安全协会
软件开发岗位分哪些
持久层与数据库对接
医院系统都是用的什么服务器
网络安全防骗的秘诀
优房网络技术有限公司天津
安卓的软件开发报价
失落世界服务器如何tp
ibm服务器断电出现问题
山大华天软件开发
扫描服务器数字越大越好吗
建立材料数据库
微信聊天服务器注册失败
检察数据库
服务器机柜市场发展预测研究报告
国内常用的学术数据库
知山知网络技术是学的什么
apk包没有数据库文件
宝山区无线网络技术电话
山东ios软件开发解决方案
珠海做旅游平台的软件开发
服务器级的安全管理制度
2020 网络安全活动周
青浦区一站式网络技术服务报价
互联网科技套餐