温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++如何实现俄罗斯方块小游戏

发布时间:2021-10-11 09:22:20 来源:亿速云 阅读:208 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“C++如何实现俄罗斯方块小游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“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 (); }

以上是“C++如何实现俄罗斯方块小游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI