千家信息网

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++如何实现俄罗斯方块小游戏"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0