C++实现俄罗斯方块小游戏
程序员文章站
2022-03-23 10:44:50
本文实例为大家分享了c++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下操作说明:d f:左右旋转j l:左右移动e(一堆键都行): 加快下落速度空格: 开始游戏 与 一落到底上代码!#in...
本文实例为大家分享了c++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下
操作说明:
d f:左右旋转
j l:左右移动
e(一堆键都行): 加快下落速度
空格: 开始游戏 与 一落到底
上代码!
#include <cstdio> #include <cstdlib> #include <cstring> #include <windows.h> #include <ctime> #include <conio.h> #include <iostream> using namespace std; #define key_down(vk_code) ((getasynckeystate(vk_code) & 0x8000) ? 1 : 0) #define inf 2147483647 struct 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 ("%02d:%02d:%02d", 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 (); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。