admin管理员组

文章数量:1596328

此程序使用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]) {
   

本文标签: 俄罗斯方块源码彩色