俄罗斯方块C++语言代码

article/2025/9/25 2:24:46

大家都知道俄罗斯方块,就是控制不同的方块旋转,通过摆满一行方块消除得分,今天就让我们用C++制作一个俄罗斯方块小游戏。

首先定义方块:

int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };

接着是定义各个函数:

void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值

初始化窗口:

void initialWindow(HANDLE hOut)
{SetConsoleTitle("俄罗斯方块");COORD size = { 80, 25 };SetConsoleScreenBufferSize(hOut, size);SMALL_RECT rc = { 0, 0, 79, 24 };SetConsoleWindowInfo(hOut, true, &rc);CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(hOut, &cursor_info);
}

初始化界面:

void initialPrint(HANDLE hOut)
{SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);for (int i = 0; i < 20; ++i){cout << "■                    ■☆                      ☆" << endl;}gotoXY(hOut, 26, 0);cout << "☆☆☆☆☆☆☆☆☆☆☆";gotoXY(hOut, 0, 20);cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";gotoXY(hOut, 26, 1);cout << "分    数:      ";gotoXY(hOut, 26, 2);cout << "关    卡:      ";gotoXY(hOut, 26, 4);cout << "下一方块:";gotoXY(hOut, 26, 9);cout << "操作方法:";gotoXY(hOut, 30, 11);cout << "↑:旋转 ↓:速降";gotoXY(hOut, 30, 12);cout << "→:右移 ←:左移";gotoXY(hOut, 30, 13);cout << "空格键:开始/暂停";gotoXY(hOut, 30, 14);cout << "Esc 键:退出";gotoXY(hOut, 26, 16);cout << "关    于:";gotoXY(hOut, 30, 18);cout << "俄罗斯方块V1.0";gotoXY(hOut, 35, 19);cout << "作者:李国良";
}

随机生成;:方块:

void roundBlock(HANDLE hOut, int block[4][4])
{clearBlock(hOut, block, 5, 15);switch (rand() % 19){case 0:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}break;case 1:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block01[i][j];}}break;case 2:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}break;case 3:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}break;case 4:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}break;case 5:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}break;case 6:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}break;case 7:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}break;case 8:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}break;case 9:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}break;case 10:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}break;case 11:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}break;case 12:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}break;case 13:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}break;case 14:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}break;case 15:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}break;case 16:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}break;case 17:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}break;case 18:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block18[i][j];}}break;default:break;}printBlock(hOut, block, 5, 15);
}

检测碰撞:

bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
{for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1){return false;}}}return true;
}

打印方块:

void printBlock(HANDLE hOut, int block[4][4], int x, int y)
{switch (block[0][0]){case 10:case 11:SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);break;case 12:case 13:case 14:case 15:SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 16:case 17:case 18:case 19:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 20:case 21:case 22:case 23:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);break;case 24:case 25:SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 26:case 27:SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);break;case 28:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);break;default:break;}for (int i = 0; i < 4; ++i){if (i + x >= 0){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){gotoXY(hOut, 2 * (y + j), x + i);cout << "■";}}}}
}

消除方块:

void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
{for (int i = 0; i < 4; ++i){if (i + x >= 0){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){gotoXY(hOut, 2 * (y + j), x + i);cout << "  ";}}}}
}

控制移动:

左:

void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{if (collisionDetection(block, map, x, y - 1)){clearBlock(hOut, block, x, y);--y;}
}

右:

void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{if (collisionDetection(block, map, x, y + 1)){clearBlock(hOut, block, x, y);++y;}
}

旋转方块:

void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{switch (block[0][0]){case 10:if (collisionDetection(block01, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block01[i][j];}}}break;case 11:if (collisionDetection(block00, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}}else if (collisionDetection(block00, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}--y;}else if (collisionDetection(block00, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}++y;}else if (collisionDetection(block00, map, x, y - 2)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}y = y - 2;}else if (collisionDetection(block00, map, x, y + 2)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}y = y + 2;}break;case 12:if (collisionDetection(block03, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}}else if (collisionDetection(block03, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}--y;}else if (collisionDetection(block03, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}++y;}break;case 13:if (collisionDetection(block04, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}}else if (collisionDetection(block04, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}--y;}else if (collisionDetection(block04, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}++y;}break;case 14:if (collisionDetection(block05, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}}else if (collisionDetection(block05, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}--y;}else if (collisionDetection(block05, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}++y;}break;case 15:if (collisionDetection(block02, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}}else if (collisionDetection(block02, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}--y;}else if (collisionDetection(block02, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}++y;}break;case 16:if (collisionDetection(block07, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}}else if (collisionDetection(block07, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}--y;}else if (collisionDetection(block07, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}++y;}break;case 17:if (collisionDetection(block08, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}}else if (collisionDetection(block08, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}--y;}else if (collisionDetection(block08, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}++y;}break;case 18:if (collisionDetection(block09, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}}else if (collisionDetection(block09, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}--y;}else if (collisionDetection(block09, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}++y;}break;case 19:if (collisionDetection(block06, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}}else if (collisionDetection(block06, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}--y;}else if (collisionDetection(block06, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}++y;}break;case 20:if (collisionDetection(block11, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}}else if (collisionDetection(block11, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}--y;}else if (collisionDetection(block11, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}++y;}break;case 21:if (collisionDetection(block12, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}}else if (collisionDetection(block12, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}--y;}else if (collisionDetection(block12, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}++y;}break;case 22:if (collisionDetection(block13, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}}else if (collisionDetection(block13, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}--y;}else if (collisionDetection(block13, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}++y;}break;case 23:if (collisionDetection(block10, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}}else if (collisionDetection(block10, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}--y;}else if (collisionDetection(block10, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}++y;}break;case 24:if (collisionDetection(block15, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}}else if (collisionDetection(block15, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}--y;}else if (collisionDetection(block15, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}++y;}break;case 25:if (collisionDetection(block14, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}}else if (collisionDetection(block14, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}--y;}else if (collisionDetection(block14, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}++y;}break;case 26:if (collisionDetection(block17, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}}else if (collisionDetection(block17, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}--y;}else if (collisionDetection(block17, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}++y;}break;case 27:if (collisionDetection(block16, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}}else if (collisionDetection(block16, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}--y;}else if (collisionDetection(block16, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}++y;}break;default:break;}
}

速降:

int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
{if (collisionDetection(block, map, x + 1, y)){clearBlock(hOut, block, x, y);++x;return 0;}if (x < 0){return 2;}for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){map[x + i][y + j] = 1;SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 2 * (y + j), x + i);cout << "■";}}}return 1;
}

暂停:

void myStop(HANDLE hOut, int block[4][4])
{clearBlock(hOut, block, 5, 15);SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 30, 7);cout << "游戏暂停";char key;while (true){key = _getch();if (key == 32){gotoXY(hOut, 30, 7);cout << "        ";printBlock(hOut, block, 5, 15);return;}if (key == 27){exit(0);}}
}

游戏结束:

void myStop(HANDLE hOut, int block[4][4])
{clearBlock(hOut, block, 5, 15);SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 30, 7);cout << "游戏暂停";char key;while (true){key = _getch();if (key == 32){gotoXY(hOut, 30, 7);cout << "        ";printBlock(hOut, block, 5, 15);return;}if (key == 27){exit(0);}}
}

判断是否能更新分值:

void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
{SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);for (int i = 19; i >= 0; --i){int x = 0;for (int j = 1; j < 11; ++j){x += map[i][j];}if (x == 10){fraction += 100;if (val > 1 && fraction / 1000 + 1 != checkpoint){checkpoint = fraction / 1000 + 1;val -= 5;}for (int m = i; m > 0; --m){for (int n = 1; n < 11; ++n){map[m][n] = map[m - 1][n];gotoXY(hOut, 2 * n, m);if (map[m][n] == 1){cout << "■";}else{cout << "  ";}}}++i;}}gotoXY(hOut, 36, 1);cout << fraction;gotoXY(hOut, 36, 2);cout << checkpoint;
}

总体代码如下:

//"俄罗斯方块"V1.0
//李国良于2017年1月20日编写完成
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>using namespace std;int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
int main()
{int map[21][12];int blockA[4][4];//候选区的方块int blockB[4][4];//下落中的方块int positionX, positionY;//方块左上角的坐标bool check;//检查方块还能不能下落char key;//用来存储按键int val;//用来控制下落速度int fraction;//用来存储得分int checkpoint;//用来存储关卡int times;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄initialWindow(hOut);
initial:gotoXY(hOut, 0, 0);initialPrint(hOut);check = true;val = 50;fraction = 0;checkpoint = 1;times = val;for (int i = 0; i < 20; ++i){for (int j = 1; j < 11; ++j){map[i][j] = 0;}}for (int i = 0; i < 20; ++i){map[i][0] = map[i][11] = 1;}for (int i = 0; i < 12; ++i){map[20][i] = 1;}srand((unsigned)time(NULL));roundBlock(hOut, blockA);while (true){if (check){eliminateRow(hOut, map, val, fraction, checkpoint);check = false;positionX = -3;positionY = 4;if (collisionDetection(blockA, map, positionX, positionY)){for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){blockB[i][j] = blockA[i][j];}}roundBlock(hOut, blockA);}else{gameOver(hOut, blockA, map);goto initial;}}printBlock(hOut, blockB, positionX, positionY);if (_kbhit()){key = _getch();switch (key){case 72:myUp(hOut, blockB, map, positionX, positionY);break;case 75:myLeft(hOut, blockB, map, positionX, positionY);break;case 77:myRight(hOut, blockB, map, positionX, positionY);break;case 80:switch (myDown(hOut, blockB, map, positionX, positionY)){case 0:check = false;break;case 1:check = true;break;case 2:gameOver(hOut, blockB, map);goto initial;default:break;}break;case 32:myStop(hOut, blockA);break;case 27:exit(0);default:break;}}Sleep(20);if (0 == --times){switch (myDown(hOut, blockB, map, positionX, positionY)){case 0:check = false;break;case 1:check = true;break;case 2:gameOver(hOut, blockB, map);goto initial;default:break;}times = val;}}cin.get();return 0;
}void initialWindow(HANDLE hOut)
{SetConsoleTitle("俄罗斯方块");COORD size = { 80, 25 };SetConsoleScreenBufferSize(hOut, size);SMALL_RECT rc = { 0, 0, 79, 24 };SetConsoleWindowInfo(hOut, true, &rc);CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(hOut, &cursor_info);
}void initialPrint(HANDLE hOut)
{SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);for (int i = 0; i < 20; ++i){cout << "■                    ■☆                      ☆" << endl;}gotoXY(hOut, 26, 0);cout << "☆☆☆☆☆☆☆☆☆☆☆";gotoXY(hOut, 0, 20);cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";gotoXY(hOut, 26, 1);cout << "分    数:      ";gotoXY(hOut, 26, 2);cout << "关    卡:      ";gotoXY(hOut, 26, 4);cout << "下一方块:";gotoXY(hOut, 26, 9);cout << "操作方法:";gotoXY(hOut, 30, 11);cout << "↑:旋转 ↓:速降";gotoXY(hOut, 30, 12);cout << "→:右移 ←:左移";gotoXY(hOut, 30, 13);cout << "空格键:开始/暂停";gotoXY(hOut, 30, 14);cout << "Esc 键:退出";gotoXY(hOut, 26, 16);cout << "关    于:";gotoXY(hOut, 30, 18);cout << "俄罗斯方块V1.0";gotoXY(hOut, 35, 19);cout << "作者:李国良";
}void gotoXY(HANDLE hOut, int x, int y)
{COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(hOut, pos);
}void roundBlock(HANDLE hOut, int block[4][4])
{clearBlock(hOut, block, 5, 15);switch (rand() % 19){case 0:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}break;case 1:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block01[i][j];}}break;case 2:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}break;case 3:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}break;case 4:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}break;case 5:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}break;case 6:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}break;case 7:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}break;case 8:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}break;case 9:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}break;case 10:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}break;case 11:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}break;case 12:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}break;case 13:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}break;case 14:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}break;case 15:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}break;case 16:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}break;case 17:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}break;case 18:for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block18[i][j];}}break;default:break;}printBlock(hOut, block, 5, 15);
}bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
{for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1){return false;}}}return true;
}void printBlock(HANDLE hOut, int block[4][4], int x, int y)
{switch (block[0][0]){case 10:case 11:SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);break;case 12:case 13:case 14:case 15:SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 16:case 17:case 18:case 19:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 20:case 21:case 22:case 23:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);break;case 24:case 25:SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);break;case 26:case 27:SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);break;case 28:SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);break;default:break;}for (int i = 0; i < 4; ++i){if (i + x >= 0){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){gotoXY(hOut, 2 * (y + j), x + i);cout << "■";}}}}
}void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
{for (int i = 0; i < 4; ++i){if (i + x >= 0){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){gotoXY(hOut, 2 * (y + j), x + i);cout << "  ";}}}}
}void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
{SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 9, 8);cout << "GAME OVER";gotoXY(hOut, 8, 9);cout << "空格键:重来";gotoXY(hOut, 8, 10);cout << "ESC键:退出";char key;while (true){key = _getch();if (key == 32){return;}if (key == 27){exit(0);}}
}int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
{if (collisionDetection(block, map, x + 1, y)){clearBlock(hOut, block, x, y);++x;return 0;}if (x < 0){return 2;}for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){if (block[i][j] == 1){map[x + i][y + j] = 1;SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 2 * (y + j), x + i);cout << "■";}}}return 1;
}void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{if (collisionDetection(block, map, x, y - 1)){clearBlock(hOut, block, x, y);--y;}
}void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{if (collisionDetection(block, map, x, y + 1)){clearBlock(hOut, block, x, y);++y;}
}void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{switch (block[0][0]){case 10:if (collisionDetection(block01, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block01[i][j];}}}break;case 11:if (collisionDetection(block00, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}}else if (collisionDetection(block00, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}--y;}else if (collisionDetection(block00, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}++y;}else if (collisionDetection(block00, map, x, y - 2)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}y = y - 2;}else if (collisionDetection(block00, map, x, y + 2)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block00[i][j];}}y = y + 2;}break;case 12:if (collisionDetection(block03, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}}else if (collisionDetection(block03, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}--y;}else if (collisionDetection(block03, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block03[i][j];}}++y;}break;case 13:if (collisionDetection(block04, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}}else if (collisionDetection(block04, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}--y;}else if (collisionDetection(block04, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block04[i][j];}}++y;}break;case 14:if (collisionDetection(block05, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}}else if (collisionDetection(block05, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}--y;}else if (collisionDetection(block05, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block05[i][j];}}++y;}break;case 15:if (collisionDetection(block02, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}}else if (collisionDetection(block02, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}--y;}else if (collisionDetection(block02, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block02[i][j];}}++y;}break;case 16:if (collisionDetection(block07, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}}else if (collisionDetection(block07, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}--y;}else if (collisionDetection(block07, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block07[i][j];}}++y;}break;case 17:if (collisionDetection(block08, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}}else if (collisionDetection(block08, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}--y;}else if (collisionDetection(block08, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block08[i][j];}}++y;}break;case 18:if (collisionDetection(block09, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}}else if (collisionDetection(block09, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}--y;}else if (collisionDetection(block09, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block09[i][j];}}++y;}break;case 19:if (collisionDetection(block06, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}}else if (collisionDetection(block06, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}--y;}else if (collisionDetection(block06, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block06[i][j];}}++y;}break;case 20:if (collisionDetection(block11, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}}else if (collisionDetection(block11, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}--y;}else if (collisionDetection(block11, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block11[i][j];}}++y;}break;case 21:if (collisionDetection(block12, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}}else if (collisionDetection(block12, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}--y;}else if (collisionDetection(block12, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block12[i][j];}}++y;}break;case 22:if (collisionDetection(block13, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}}else if (collisionDetection(block13, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}--y;}else if (collisionDetection(block13, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block13[i][j];}}++y;}break;case 23:if (collisionDetection(block10, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}}else if (collisionDetection(block10, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}--y;}else if (collisionDetection(block10, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block10[i][j];}}++y;}break;case 24:if (collisionDetection(block15, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}}else if (collisionDetection(block15, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}--y;}else if (collisionDetection(block15, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block15[i][j];}}++y;}break;case 25:if (collisionDetection(block14, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}}else if (collisionDetection(block14, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}--y;}else if (collisionDetection(block14, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block14[i][j];}}++y;}break;case 26:if (collisionDetection(block17, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}}else if (collisionDetection(block17, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}--y;}else if (collisionDetection(block17, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block17[i][j];}}++y;}break;case 27:if (collisionDetection(block16, map, x, y)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}}else if (collisionDetection(block16, map, x, y - 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}--y;}else if (collisionDetection(block16, map, x, y + 1)){clearBlock(hOut, block, x, y);for (int i = 0; i < 4; ++i){for (int j = 0; j < 4; ++j){block[i][j] = block16[i][j];}}++y;}break;default:break;}
}void myStop(HANDLE hOut, int block[4][4])
{clearBlock(hOut, block, 5, 15);SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);gotoXY(hOut, 30, 7);cout << "游戏暂停";char key;while (true){key = _getch();if (key == 32){gotoXY(hOut, 30, 7);cout << "        ";printBlock(hOut, block, 5, 15);return;}if (key == 27){exit(0);}}
}void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
{SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);for (int i = 19; i >= 0; --i){int x = 0;for (int j = 1; j < 11; ++j){x += map[i][j];}if (x == 10){fraction += 100;if (val > 1 && fraction / 1000 + 1 != checkpoint){checkpoint = fraction / 1000 + 1;val -= 5;}for (int m = i; m > 0; --m){for (int n = 1; n < 11; ++n){map[m][n] = map[m - 1][n];gotoXY(hOut, 2 * n, m);if (map[m][n] == 1){cout << "■";}else{cout << "  ";}}}++i;}}gotoXY(hOut, 36, 1);cout << fraction;gotoXY(hOut, 36, 2);cout << checkpoint;
}

运行结果:

好了,今天就到这里, 我们下期再见!


http://chatgpt.dhexx.cn/article/jGYPsMkB.shtml

相关文章

c++俄罗斯方块 完整源代码

文章目录 1. 功能描述2. 源代码3. 运行截图4. 结尾 1. 功能描述 2. 源代码 #include<iostream> #include<string> #include<cstdlib> #include<windows.h> #include<ctime> #include<conio.h> #include<cstdio> using namespace st…

俄罗斯方块游戏代码

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽…

C语言实现俄罗斯方块

目录 一、游戏效果展示 二、完整代码&#xff0c;可以直接拷贝运行 三、所需开发环境 四、具体项目实现 ①游戏欢迎界面 welcome( ) ②游戏背景 initGameScreen( ) ③方块表示 int block[ ][ ][ ] ④新方块表示nextBlock( ) ⑤设计游戏循环main( ) ⑥搭建用户操作框…

❤️VS Code❤️,cmd终端窗口运行,解决中文乱码问题

目录 问题归纳VS Code默认终端配置window窗口弹出相关解释 解决中文乱码问题运行俄罗斯方块程序 问题归纳 在软件Visual Studio中一切都是配置好的&#xff0c;默认终端运行采用弹出cmd窗口形式。而在VS Code中除了一些默认的配置设置外&#xff0c;所有环境配置、界面显示等操…

俄罗斯方块(C语言实现)

文章目录 游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面初始化方块信息颜色设置画出方块空格覆盖合法性判断判断得分与结束游戏主体逻辑函数从文件读取最高分更新最高分到文件主函数 游戏说明 俄罗斯方块相信大家都知道&#xff0c;这里就…

IDEA 设置类注释模板

效果展示 步骤&#xff1a;File-->settings-->Editor-->File and Code Templates-->Files 选择Class文件&#xff08;当然你要设置接口的还也可以选择Interface文件&#xff09;

设置idea类注释模板

1.File-->Settings...&#xff0c;或者直接按快捷键CtrlAltS. 2. Editor-->File and Code Templates-->Includes-->File Header,根据右下角Description的提示&#xff0c;添加自己需要的注释。 3.在右侧空白处设置自己的模板&#xff0c;若提示cant parse class.可…

IDEA 创建类注释模板设置

1.idea类注释 打开&#xff1a;file->setting->Editor->Filr and Code Templates->Includes->File Header 类注释模板&#xff1a; /** * title: ${NAME}* projectName ${PROJECT_NAME}* description: TODO* author ${USER}* date ${DATE}${TIME}*/ 2.方法注释…

java idea 配置注释模板

java idea 配置注释模板 最近项目组在加强代码规范管理。代码优雅从代码注释开始。奥力给&#xff01;&#xff01;&#xff01; 类注释的 File >> Settings >> Editor >> File and code Templates >> Files >> class 上图中的模板内容如下&…

idea类注释模板,方法注释模板。

idea设置--实时模板 新建组 类模板 /*** description $description$* author YJJ* date $date$ $time$* version 1.0*/ 方法模板 ** * description $description$ $params$ $return$* author YJJ* date $date$ $time$*/ params脚本&#xff1a; groovyScript("def r…

IDEA代码注释模板

存在问题: 每次写代码&#xff0c;新建类都没有注释&#xff0c;这对一个拥有代码强迫症患者来说&#xff0c;是多么不爽的一件事&#xff0c;不利于开发和后期问题排查 举个例子&#xff1a; 上次写代码的时候&#xff0c;这一段只有我和上帝知道&#xff0c;而现在&#xff0…

idea添加注释模板

自动添加描述 class // 创建时间有的也没有 仅仅就是class的描述信息&#xff0c;看个人公司情况吧&#xff0c;描述信息最好创建时间有一个空行&#xff0c;我忘记了/** * 描述信息 * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} */method // 一会要写入模板的内…

【idea生成类注释模板快捷键设置】

idea类注释模板快捷键 设置在方法上生成注释的快捷键1&#xff0c;ctrlaltS打开idea设置设置模板中的参数取值来源使用效果展示 设置在方法上生成注释的快捷键 1&#xff0c;ctrlaltS打开idea设置 设置模板中的参数取值来源 使用效果展示

IntelliJ IDEA类和方法注释模板配置

1、设置文件注释 设置Java类的注释模板&#xff0c;创建Java类自动生成该注释模板。 先看文件注释效果&#xff1a; 1.1、选择 IntelliJ IDEA —> 选择 Preferences... 打开IDEA属性设置面板 1.2、选择 File Code Templates—>选择 Includes 选项卡—>选择 File He…

IDEA配置方法类注释模板

IDEA配置方法类注释模板 IDEA20.1配置方法注释注释的种类注释使用规范 摘自阿里开发手册 IDEA方法模板注释一、打开idea 点击菜单File->Setting-Editor->Live Template二、选择Live Template 添加快键键缩写注释模板代码三、配置Edit variables四、配置入参和返回字段的d…

IDEA类和方法注释模板配置

1、类的注释模板配置 File-->Settings-->Editor-->File and Code Templates-->File --->Class: 模板代码下所示&#xff1a; /*** ClassName: ${NAME}* Author : ${USER}* Date :${DATE} ${TIME}* Description: TODO* Version :1.0*/ 上述${NAME}为类名&…

IDEA方法注释模板设置

IDEA类和方法注释模板设置 1、File–>Settings–>Editor–>Live Templates &#xff08;1&#xff09;新建组&#xff1a;命名为userDefine &#xff08;2&#xff09;新建模板&#xff1a;选中你刚才创建的组&#xff0c;然后右上角新建模板&#xff0c;命名为* &…

IDEA注释模板配置

最初&#xff0c;从Eclipse转到IDEA&#xff0c;总是不习惯IDEA的注释方式&#xff0c;所以在网上找来找去加上自己的测试&#xff0c;终于形成一套相对详细的配置流程。之前每次用到都靠收藏里的别人文章应付&#xff0c;但是在配置新的开发环境或者有新的小组成员加入时总要用…

IDEA类文档注释模板设置

IDEA类文档注释模板设置&#xff1a; 在【File and Code Templates】页面设置类&#xff08;Class&#xff09;的文档注释 . 注意&#xff1a;public class ${NAME} {}一定不能删 /***ClassName ${NAME}*Description TODO*Author ${USER}*Date ${DATE} ${TIME}*Version 1.0*…

IDEA 创建类注释模板

一、引言 在写Java代码过程中&#xff0c;当我们创建类的时候往往需要在类上写一些注释信息&#xff0c;而这些注释信息就主要是几个注释点&#xff0c;如果全部都手写就比较浪费时间了&#xff0c;这个时间后我们就可以通过使用注释模板添加自己的自定义的注释在类或者方法上。…