俄罗斯方块源码(彩色版)

article/2025/9/25 0:50:03

此程序使用C语言简单实现了俄罗瑟方块主要的游戏功能(包含统计得分、速度等级设置、下一方块提示),还有简单的消除特效。

使用的编译器为:Visual Studio 2022

效果图:

 

 

主要缺点:

1:代码较长

2:注释写的不是很详细

3:屏幕闪烁问题

#include<stdio.h>
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <time.h>//用数组表示俄罗斯方块的所有情况
int SQUARES[7][4] = { {1, 1, 1, 1}, {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 1, 2}, {1, 2, 1, 2}, {1, 2, 1, 2}, {1, 2, 3, 4} };

橘色区域为方块的重心 

clock_t start, now;             //用于控制方块定时下落,start:当前方块上一次下落开始时刻,now:当前时刻
int Score = 0;                  //统计得分
int Speed = 0;                  //方块下落速度
int High = 23;                  //当前已堆积的方块的最高行行序号
int Line = 4;                   //代表当前方块所在行
int Col = 17;                   //代表当前方块所在列
int I = 1;                      //当前方块
int J = 0;                      //控制方块旋转参数
int Color = 3;                  //控制方块颜色
int NEXT = 0;                   //下一个方块
int Flag = 1;                   //新游戏开始标志
int INTERFACE[26][29] = {0};    //将游戏区分为26*29的表,利用“0”“非零”进行游戏区的显示

 函数声明:

void Screen_Refresh();                          //屏幕刷新,显示当前游戏状态
void Print_Square(int, int, int, int, int);     //打印对应方块函,i,j:方块类型及对应形态  L,C:方块位置  color:方块颜色
void Framework_interface();                     //生成界面框架
void Show_Game_Area();                          //显示游戏区
void Move_Whirl();                              //控制方块移动、旋转
void Rand_Block();                              //随机生成方块函数(当前方块、下一个方块、方块颜色)
void Next_Square();                             //下一个方块提示
int L_Move_Judge(int, int);                     //判断方块是否能进行向左移动
int R_Move_Judge(int, int);                     //判断方块是否能进行向右移动
int Down_Judge(int, int);                       //判断方块是否能进行向下移动
int Whirl_Judge(int, int);                      //判断方块是否能进行旋转
void Line_High();                               //返回当前已堆积方块的最高行行序号,在ELiminate_Judge()及中Game_over_Judge()被用到
int Eliminate_Judge();                          //消除判断及消除
void Statistical_Score(int);                    //计分函数,所需参数为消除行数,与Eliminate_Judge()函数配合使用
void Speed_Judge();                             //速度等级判断
void Game_over_Judge();                         //游戏结束判断

 主函数:

int main() {int i = I, j = J;Framework_interface(); //设置界面框架while (1) {Line = 3;           //方块初始下落行Col = 17;           //方块初始下路列Rand_Block();       //随机生成方块及方块颜色Next_Square();      //在对应的框内显示下一个方块while (1) {start = clock();    //当前方块开始下落时间now = start;        //now初始化为start,以便安全进入 while ((now - start) <= 2000 - Speed * 200) 循环Screen_Refresh();   //刷新屏幕,显示当前状态while ((now - start) <= 2000 - Speed * 200) {       //控制方块定时下落Move_Whirl();       //控制方块移动、旋转now = clock();      //记录当前时间}if (Down_Judge(I, J)) {     //判断方块是否能继续下落Line++;                 //方块下落一行Screen_Refresh();       //刷新屏幕,显示当前状态}else {                      //方块已经落地Print_Square(I, J, Line, Col, Color);   //将方块固定在当前位置Statistical_Score(Eliminate_Judge());   //判断是否满足消除条件,统计得分Game_over_Judge();                      //判断游戏是否结束break;                                  //如游戏未结束,则跳出当前循环,继续生成下一个方块}}}return 0;
}

 各函数内容:

//打印对应方块函,i,j:方块类型及对应形态  L,C:方块位置  color:方块颜色void Print_Square(int i, int j, int L, int C, int color) { //i、j用来确定要打印的方块的类型(i:方块、j:旋转)int col = 14;switch (i) {case 0: INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C] = color;INTERFACE[L + 1][C + 1] = color;break;case 1:switch (SQUARES[i][j]) {case 1: INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C - 1] = color;break;case 2:INTERFACE[L - 1][C - 1] = color;INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;break;case 3:INTERFACE[L - 1][C + 1] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;break;case 4:INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;INTERFACE[L + 1][C + 1] = color;break;}break;case 2:switch (SQUARES[i][j]) {case 1:INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C] = color;break;case 2:INTERFACE[L - 1][C] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;break;case 3:INTERFACE[L - 1][C] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;break;case 4:INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C] = color;break;}break;case 3:switch (SQUARES[i][j]) {case 1:INTERFACE[L][C - 2] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;break;case 2:INTERFACE[L - 2][C] = color;INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;break;}break;case 4:switch (SQUARES[i][j]) {case 1: INTERFACE[L - 1][C - 1] = color;INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;break;case 2:INTERFACE[L - 1][C + 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C] = color;break;}break;case 5:switch (SQUARES[i][j]) {case 1:INTERFACE[L - 1][C] = color;INTERFACE[L - 1][C + 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C - 1] = color;break;case 2:INTERFACE[L - 1][C - 1] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;break;}break;case 6:switch (SQUARES[i][j]) {case 1:INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;INTERFACE[L + 1][C + 1] = color;break;case 2:INTERFACE[L - 1][C] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;INTERFACE[L + 1][C - 1] = color;break;case 3:INTERFACE[L - 1][C - 1] = color;INTERFACE[L][C - 1] = color;INTERFACE[L][C] = color;INTERFACE[L][C + 1] = color;break;case 4: INTERFACE[L - 1][C] = color;INTERFACE[L - 1][C + 1] = color;INTERFACE[L][C] = color;INTERFACE[L + 1][C] = color;break;}break;}if(L <= 5)for (col == 14; col < 26; col++)INTERFACE[2][col] = 1;
}//生成界面框架
void Framework_interface() {int T_coord[4] = { 0, 0, 25, 28 };    //总框左上角、右下角两个顶点(坐标确定一个长方形)int S_coord[4] = { 2, 2, 6, 11 };    //得分框左上角、右下角两个顶点int SP_coord[4] = { 8, 2, 12, 11 };   //下落速度框左上角、右下角两个顶点int N_coord[4] = { 14, 2, 22, 11 };    //下一方块提示左上角、右下角两个框顶点int G_coord[4] = { 2, 13, 23, 26 };    //游戏区左上角、右下角两个顶点int i, j;for (i = T_coord[0], j = T_coord[1]; j <= T_coord[3]; j++)INTERFACE[i][j] = 1;for (i = T_coord[2], j = T_coord[1]; j <= T_coord[3]; j++)INTERFACE[i][j] = 1;for (i = T_coord[0], j = T_coord[1]; i <= T_coord[2]; i++)INTERFACE[i][j] = 1;for (i = T_coord[0], j = T_coord[3]; i <= T_coord[2]; i++)INTERFACE[i][j] = 1;for (i = S_coord[0], j = S_coord[1]; j <= S_coord[3]; j++)INTERFACE[i][j] = 1;for (i = S_coord[2], j = S_coord[1]; j <= S_coord[3]; j++)INTERFACE[i][j] = 1;for (i = S_coord[0], j = S_coord[1]; i <= S_coord[2]; i++)INTERFACE[i][j] = 1;for (i = S_coord[0], j = S_coord[3]; i <= S_coord[2]; i++)INTERFACE[i][j] = 1;for (i = SP_coord[0], j = SP_coord[1]; j <= SP_coord[3]; j++)INTERFACE[i][j] = 1;for (i = SP_coord[2], j = SP_coord[1]; j <= SP_coord[3]; j++)INTERFACE[i][j] = 1;for (i = SP_coord[0], j = SP_coord[1]; i <= SP_coord[2]; i++)INTERFACE[i][j] = 1;for (i = SP_coord[0], j = SP_coord[3]; i <= SP_coord[2]; i++)INTERFACE[i][j] = 1;for (i = N_coord[0], j = N_coord[1]; j <= N_coord[3]; j++)INTERFACE[i][j] = 1;for (i = N_coord[2], j = N_coord[1]; j <= N_coord[3]; j++)INTERFACE[i][j] = 1;for (i = N_coord[0], j = N_coord[1]; i <= N_coord[2]; i++)INTERFACE[i][j] = 1;for (i = N_coord[0], j = N_coord[3]; i <= N_coord[2]; i++)INTERFACE[i][j] = 1;for (i = G_coord[0], j = G_coord[1]; j <= G_coord[3]; j++)INTERFACE[i][j] = 1;for (i = G_coord[2], j = G_coord[1]; j <= G_coord[3]; j++)INTERFACE[i][j] = 1;for (i = G_coord[0], j = G_coord[1]; i <= G_coord[2]; i++)INTERFACE[i][j] = 1;for (i = G_coord[0], j = G_coord[3]; i <= G_coord[2]; i++)INTERFACE[i][j] = 1;
}
//显示游戏区
void Show_Game_Area() {int i = 0, j = 0;for (i = 0; i < 26; i++) {for (j = 0; j < 29; j++) {if (i == 3 && j == 4) {printf("\033[40mS C O R E:\033[0m");j = j + 5;}else if (i == 4 && j == 4) {printf("\033[40m% 9d \033[0m", Score);j = j + 5;}else if (i == 9 && j == 4) {printf("\033[40mS P E E D:\033[0m");j = j + 5;}else if (i == 10 && j ==4) {printf("\033[40m% 9d \033[0m", Speed + 1);j = j + 5;}else if (i == 15 && j == 4) {printf("\033[40m N E X T: \033[0m");j = j + 5;}switch (INTERFACE[i][j]) {case 0:printf("\033[40m  \033[0m");break;case 1:printf("\033[46m■\033[0m");break;case 2:printf("\033[41m■\033[0m");break;case 3:printf("\033[42m■\033[0m");break;case 4:printf("\033[43m■\033[0m");break;case 5:printf("\033[44m■\033[0m");break;case 6:printf("\033[45m■\033[0m");break;case 9:printf("\033[40m■\033[0m");break;case 10:printf("\033[46m■\033[0m");break;}}putchar('\n');}
} 
//控制方块移动、旋转
void Move_Whirl() {               //左、右移移动,加速下落int i = 0;char input;if (_kbhit()){input = _getch();if (input == 'a')if(L_Move_Judge(I, J))Col--;if (input == 'd')if(R_Move_Judge(I, J))Col++;if (input == 's')for (i = 0; i < 3; i++)if (Down_Judge(I, J))Line++;elsebreak;if (input == 'w')if(Whirl_Judge(I, J))J = (J + 1) % 4;Screen_Refresh();}
}
//随机生成方块函数(当前方块、下一个方块)
void Rand_Block() {int a;if (Flag == 1) {Flag = 0;srand(time(0));Color = rand() % 5 + 2;I = rand() % 7;NEXT = rand() % 7;}else {Color = rand() % 5 + 2;I = NEXT;NEXT = rand() % 7;}
}//判断方块是否能进行向左、向右、向下移动、旋转
int L_Move_Judge(int i, int j) {int L = Line, C = Col;switch (i) {case 0:if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 1:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L + 1][C - 2])return 0;break;case 2:if (INTERFACE[L - 1][C - 2])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 3:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L][C - 2])return 0;break;case 4:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 2:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 2:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 3:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 2])return 0;break;case 4:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 3:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C - 3])return 0;break;case 2:if (INTERFACE[L - 2][C - 1])return 0;if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 4:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C - 2])return 0;if (INTERFACE[L][C - 1])return 0;break;case 2:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 5:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 2])return 0;break;case 2:if (INTERFACE[L - 1][C -2])return 0;if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 6:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L + 1][C])return 0;break;case 2:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 2])return 0;break;case 3:if (INTERFACE[L - 1][C - 2])return 0;if (INTERFACE[L][C - 2])return 0;break;case 4:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;}return 1;
}
int R_Move_Judge(int i, int j) {int L = Line, C = Col;switch (i) {case 0:if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C + 2])return 0;break;case 1:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C])return 0;break;case 2:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 3:if (INTERFACE[L - 1][C + 2])return 0;if (INTERFACE[L][C + 2])return 0;break;case 4:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 2])return 0;break;}break;case 2:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 2:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 3:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 2])return 0;break;case 4:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 3:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C + 2])return 0;break;case 2:if (INTERFACE[L - 2][C + 1])return 0;if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 4:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 2])return 0;break;case 2:if (INTERFACE[L - 1][C + 2])return 0;if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 5:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C + 2])return 0;if (INTERFACE[L][C + 1])return 0;break;case 2:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 6:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C + 2])return 0;if (INTERFACE[L + 1][C + 2])return 0;break;case 2:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 3:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L][C + 2])return 0;break;case 4:if (INTERFACE[L - 1][C + 2])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;}return 1;
}
int Down_Judge(int i, int j) {int L = Line, C = Col;switch (i) {case 0:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 2][C + 1])return 0;break;case 1:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;if (INTERFACE[L + 2][C - 1])return 0;break;case 2:if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L + 2][C])return 0;break;case 3:if (INTERFACE[L + 1][C + 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 4:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 2][C + 1])return 0;break;}break;case 2:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 2:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 3:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 4:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 3:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C - 2])return 0;if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 2:if (INTERFACE[L + 2][C])return 0;break;}break;case 4:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L][C + -1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 2:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;}break;case 5:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L][C + 1])return 0;break;case 2:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 2][C])return 0;break;}break;case 6:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 2][C + 1])return 0;break;case 2:if (INTERFACE[L + 2][C - 1])return 0;if (INTERFACE[L + 2][C])return 0;break;case 3:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;break;case 4:if (INTERFACE[L + 2][C])return 0;if (INTERFACE[L][C + 1])return 0;break;}break;}return 1;}
int Whirl_Judge(int i, int j) {int L = Line, C = Col;switch (i) {case 0:break;case 1:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L + 1][C])return 0;break;case 2:if (INTERFACE[L - 1][C + 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L][C - 1])return 0;break;case 3:if (INTERFACE[L + 1][C + 1])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L - 1][C])return 0;break;case 4:if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;}break;case 2:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C])return 0;break;case 2:if (INTERFACE[L][C + 1])return 0;break;case 3:if (INTERFACE[L - 1][C])return 0;break;case 4:if (INTERFACE[L][C - 1])return 0;break;}break;case 3:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 2][C])return 0;if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L + 1][C])return 0;break;case 2:if (INTERFACE[L][C - 2])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L][C + 1])return 0;break;}break;case 4:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C +1])return 0;if (INTERFACE[L + 1][C])return 0;break;case 2:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L - 1][C])return 0;break;}break;case 5:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L + 1][C - 1])return 0;if (INTERFACE[L - 1][C])return 0;break;case 2:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L - 1][C + 1])return 0;break;}break;case 6:switch (SQUARES[i][j]) {case 1:if (INTERFACE[L - 1][C])return 0;if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C - 1])return 0;break;case 2:if (INTERFACE[L - 1][C - 1])return 0;if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L][C + 1])return 0;break;case 3:if (INTERFACE[L + 1][C])return 0;if (INTERFACE[L + 1][C + 1])return 0;if (INTERFACE[L - 1][C])return 0;break;case 4:if (INTERFACE[L][C - 1])return 0;if (INTERFACE[L][C + 1])return 0;if (INTERFACE[L - 1][C + 1])return 0;break;}break;}return 1;
}//返回当前已堆积方块的最高行行序号,在ELiminate_Judge()中被用到
void Line_High() {int l, c, h = 23; for (c = 14; c < 26; c++) {for (l = 3; INTERFACE[l][c] == 0; l++);if (l < h)h = l;}High = h;}
//消除判断及消除
int Eliminate_Judge() {int i, j;int m = 0, n = 0;           //m:空行 n:非空行int Eline_num = 0;  //统计消除行数int Eflag[4] = { 0 };      //消除标志,值为0:代表不满足消除条件 值大于0:代表满足消除条件的行序号int Eline = 0;      //当前所判断的行序号int Ecol = 0;       //当前所判断的列序号for (Eline = Line + 1; Eline >= Line - 2; Eline--) {      //判断当前重心上下共4行(Line-2 ~ Line+1),是否满足消除条件if (Eline >= 23) {Eflag[3] = 0;Eline--;}for (Ecol = 14; Ecol < 26; Ecol++)if (INTERFACE[Eline][Ecol] == 0)break;if (Ecol == 26) {Eflag[Eline - Line + 2] = Eline;Eline_num++;}elseEflag[Eline - Line + 2] = 0;}if (Eline_num != 0) {for (i = 0; i < 4; i++) {      //消除效果①:改变所有满足消除条件的行的显示效果if (Eflag[i] != 0)for (Ecol = 14, Eline = Eflag[i]; Ecol < 26; Ecol++)INTERFACE[Eline][Ecol] = 10;}system("cls");Show_Game_Area();Sleep(100);for (i = 0; i < 4; i++) {      //消除效果②:将要消除的行置为空if (Eflag[i] != 0)for (Ecol = 14; Ecol < 26; Ecol++)INTERFACE[Eflag[i]][Ecol] = 0;}system("cls");Show_Game_Area();Sleep(100);Line_High();                           //获取行高i = 3;                                 //消除效果③:将被消除的行上方的方块,向下平移if (i >= 0) { while (Eflag[i] == 0)i--;m = Eflag[i];j = i - 1;}for (n = m - 1; n >= High - 1 && n > 2; m--, n--) { while (Eflag[j] != 0 && j >= 0) {n--;j--;}for (Ecol = 14; Ecol < 26; Ecol++) {INTERFACE[m][Ecol] = INTERFACE[n][Ecol];INTERFACE[n][Ecol] = 0;}}system("cls");Show_Game_Area();Sleep(10);}return Eline_num;
}
//计分函数,所需参数为消除行数,与Eliminate_Judge()函数配合使用
void Statistical_Score(int num) {switch (num) {case 0:break;case 1:Score += 10;Speed_Judge();break;case 2:Score += 30;Speed_Judge();break;case 3:Score += 60;Speed_Judge();break;case 4:Score += 100;Speed_Judge();break;}
}
//下一个方块提示
void Next_Square() {int i, j;if (INTERFACE[19][6] != 0)for (i = 17; i <= 21; i++)for (j = 4; j <= 8; j++)INTERFACE[i][j] = 0;Print_Square(NEXT, 2, 19, 6, 9);
}
//速度等级判断
void Speed_Judge() {Speed = (int)(Score / 1000);
}
//屏幕刷新,显示当前游戏状态
void Screen_Refresh() {Print_Square(I, J, Line, Col, Color);system("cls");Show_Game_Area();Print_Square(I, J, Line, Col, 0);
}
//游戏结束判断
void Game_over_Judge() {Line_High();if (High == 3) {system("cls");printf("\t\t\tGAME OVER!");exit(0);}
}

 本人小白,初来乍到,还请各位大佬多多指点~

如有问题和建议欢迎评论,感谢


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

相关文章

html 小游戏 俄罗斯方块

样式如下&#xff1a; html代码如下&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>俄罗斯方块</title><style>body, div, dl, dt, dd…

Javascript 俄罗斯方块 游戏代码

本俄罗斯方块代码采用 JavaScript 脚本代码写成&#xff0c;简单易懂&#xff1b; 全代码采用静态类及静态变量成员组成&#xff1b; 全脚本通过实现代码全局配置 OLSFK.Options {...} 定义方块起始坐标及定义各自的旋转点&#xff1b; 从初始化俄罗斯方块界面开始&#x…

C语言实现俄罗斯方块代码

这里为大家敲写一段怎样用C语言实现俄罗斯方块&#xff1a; 首先推荐大家使用CodeBlocks这个软件&#xff0c;方便添加不同的工程。 代码中有很多注释便于理解&#xff01; 下面是效果图和全部的代码以及注释&#xff0c;大家可以观看并自己新增内容&#xff01; 1&#xff1a;…

android俄罗斯方块完整代码

这段时间一直没有更新自己的博客,很多东西不经常看看会生疏了许多。在这里我就把自己前段时间编写的android俄罗斯方块代码贴出来。 转载请注明出处~~~~~~~~~~~~~~~~谢谢! http://blog.csdn.net/wu10045125/article/details/8248356 再贴出几张图片: 整个游戏我分为10个jav…

俄罗斯方块-C语言-完整代码

效果图如下 #ifndef _DAY7_H #define _DAY7_H #include<windows.h> #include<time.h> #include<stdbool.h> #include<conio.h>//控制台输入输出函数getch通过键盘进行的操作 //游戏区域位置设计 #define COL_BEGIN 2 #define COL_END 14 #define ROW_…

C语言俄罗斯方块(新版本完整代码)

2020博客之星年度总评选进行中&#xff1a;请为74号的狗子投上宝贵的一票&#xff01; 我的投票地址&#xff1a;点击为我投票 写在前面&#xff1a; 大家好&#xff0c;我是 花狗Fdog &#xff0c;来自内蒙古的一个小城市&#xff0c;目前在泰州读书。 很感谢能有这样一个平台…

HTML5俄罗斯方块网页游戏代码

HTML5俄罗斯方块网页游戏代码 非常好用 代码如下 注意 把所有文件放在一个文件夹里! 把所有css文件夹里,命名css 把所有js文件夹里,命名js 先看index.html <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>俄罗斯方块…

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

大家都知道俄罗斯方块&#xff0c;就是控制不同的方块旋转&#xff0c;通过摆满一行方块消除得分&#xff0c;今天就让我们用C制作一个俄罗斯方块小游戏。 首先定义方块&#xff1a; int block00[4][4] { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } }; int block01[…

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 // 一会要写入模板的内…