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

article/2025/9/25 1:21:53

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

在这里插入图片描述

1:

首先是main.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "game.h"int main()
{gameInit();return 0;
}

2:

然后是mywindows.h文件:

#ifndef MYWINDOWS_H_INCLUDED
#define MYWINDOWS_H_INCLUDED// 封装系统函数-系统调用模块
#include <windows.h>// 初始化句柄
extern void initHandle();// 设置颜色
extern void setColor(int color);// 设置光标位置
extern void setPos(int x, int y);// 设置光标是否可见
extern void setCursorVisible(int flag);// 关闭句柄
extern void closeHandle();#endif // MYWINDOWS_H_INCLUDED

3:

接下来是mywindows.c文件:

#include "mywindows.h"HANDLE handle;// 初始化句柄
void initHandle()
{handle = GetStdHandle(STD_OUTPUT_HANDLE);
}// 设置颜色
void setColor(int color)
{SetConsoleTextAttribute(handle, color);
}void setPos(int x, int y)
{//, ,COORD coord = {x*2, y};SetConsoleCursorPosition(handle, coord);
}// 设置光标是否可见
void setCursorVisible(int flag)
{CONSOLE_CURSOR_INFO info;info.bVisible = flag;   //光标是否可见info.dwSize = 100;      //光标宽度1-100SetConsoleCursorInfo(handle, &info);
}// 关闭句柄
void closeHandle()
{CloseHandle(handle);
}

4:

下面是data.h文件,也就是数据库的存储地址:

#ifndef DATA_H_INCLUDED
#define DATA_H_INCLUDED//函数声明\变量声明
// 存储数据-数据模块
//界面数组
extern int windowShape[25][26];extern int block[7][4][4][4];#endif // DATA_H_INCLUDED

5:

数据库内容:data.c

#include "data.h"//函数的定义int windowShape[25][26] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};// 边框为1,游戏池长度为14int block[7][4][4][4] =
{{//Z{}{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}},{//S{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}},{//L{}{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}},{{1,1,1,0},{1,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,0,1,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}}},{//J{{0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,0,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}}},{//I{}{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}},{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}}},{//T{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{0,1,0,0},{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},{1,0,0,0},{0,0,0,0}}},{//田{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}}}};

6:

游戏头部:game.h:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED// 游戏逻辑模块#include <stdio.h>
#include <time.h>typedef struct{int x;int y;int shape;int status;int color;
}BLOCK;// 定义当前正在下落的方块,和下一个方块
BLOCK curBlock;
BLOCK nextBlock;// 绘制游戏池边框
extern void gamePool(int x, int y);// 打印操作说明
extern void printRule();// 打印分数和等级
extern void printGradeLevel(int num);// 游戏计时
extern void gameTime(clock_t startTime);// 打印一个方块
extern void printBlock(int x, int y, int shape, int status, int color);// 删除一个方块
extern void delBlock(int x, int y, int shape, int status);//方块左移
extern void leftBlock();//方块右移
extern void rightBlock();//方块下移
extern int downBlock();//方块变形
extern void changeBlock();//方块直接落底
extern void bottomBlock();//游戏暂停
extern void pause();//随机产生游戏第一个方块
extern void startBlock();//随机产生下一个方块
extern void blockNext();//拷贝方块:把下一个方块变成当前正在下落的方块
extern void copyBlock();//碰撞检测
extern int crash(int x, int y, int shape, int status);//保存方块
extern void saveBlock();//刷新游戏池
extern void updateGamePool();//消行检测
extern void lineClear();//消行下移
extern void lineDown(int line);// 初始化游戏
extern void gameInit();#endif // GAME_H_INCLUDED

7:

最后一部分,游戏内容,game.c文件:

#include "game.h"
#include "mywindows.h"
#include "data.h"
#include <conio.h>int level = 1;
int grade = 100;// 打印游戏池
void gamePool(int x, int y)
{int i, j;for(i=0;i<25;i++){for(j=0;j<26;j++){if(windowShape[i][j] == 1){setColor(0xc0);setPos(x+j,y+i);printf("  ");   // printf("%2s", "");}}}
}// 打印操作说明
void printRule()
{setColor(0x0f);setPos(31, 9);printf("操作规则:");setPos(32, 11);printf("按a或A左移");setPos(32, 12);printf("按d或D右移");setPos(32, 13);printf("按s或S下移");setPos(32, 14);printf("按w或W变形");setPos(32, 15);printf("按空格暂停");setPos(32, 16);printf("按回车直接下落");}void printGradeLevel(int num)
{switch(num){case 0: break;case 1: grade += 10;break;case 2: grade += 25;break;case 3: grade += 50;break;case 4: grade += 70;break;}//等级-->作业setColor(0x09);setPos(3,6);printf("分数:%d", grade);setColor(0x0a);setPos(3,7);printf("等级:%d", level);
}void gameTime(clock_t startTime)
{//clock_t endTime = clock();//clock_t ti = (endTime-startTime)/CLOCKS_PER_SEC;setColor(0x0d);setPos(3,8);printf("本次游戏运行时间:%ld", (clock()-startTime)/CLOCKS_PER_SEC);
}// 打印一个方块
void printBlock(int x, int y, int shape, int status, int color)
{int i,j;setColor(color);for(i=0;i<4;i++){for(j=0;j<4;j++){if(1 == block[shape][status][i][j]){setPos(x+j,y+i);printf("■");}}}
}// 删除一个方块
void delBlock(int x, int y, int shape, int status)
{int i, j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(1 == block[shape][status][i][j]){setPos(x+j,y+i);printf("  ");   //打印两个空格}}}
}//方块左移
void leftBlock()
{//已经显示的方块删除,改变坐标,重新打印if(crash(curBlock.x-1, curBlock.y, curBlock.shape,curBlock.status) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x -= 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块右移
void rightBlock()
{if(crash(curBlock.x+1, curBlock.y, curBlock.shape,curBlock.status) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块下移
int downBlock()
{if(crash(curBlock.x, curBlock.y+1,curBlock.shape,curBlock.status) == -1){//落到游戏池底部,产生新方块saveBlock();lineClear();updateGamePool();copyBlock();return -1;}else if(crash(curBlock.x, curBlock.y+1,curBlock.shape,curBlock.status) == -2){//游戏结束return -2;}else{delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.y += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);return 0;}}//方块变形
void changeBlock()
{if(crash(curBlock.x, curBlock.y, curBlock.shape, (curBlock.status+1)%4) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.status = (curBlock.status+1)%4;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块直接落底
void bottomBlock()
{while(1){//流程参考方块下落if(downBlock() !=0){return;}}
}//游戏暂停
void pause()
{//
}//随机产生游戏第一个方块
void startBlock()
{//设置时间为随机数种子srand((unsigned)time(NULL));//初始化curBlockcurBlock.x = 22;curBlock.y = 1;//rand取一个随机整数curBlock.shape = rand()%7;    //0-6curBlock.status = rand()%4;   //0-3curBlock.color = rand()%0x10;if(0x00 == curBlock.color){curBlock.color = 0x0f;}printBlock(curBlock.x, curBlock.y, curBlock.shape,curBlock.status, curBlock.color);
}//随机产生下一个方块
void blockNext()
{//初始化nextBlockdelBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status);nextBlock.x = 34;nextBlock.y = 2;nextBlock.shape = rand()%7;nextBlock.status = rand()%4;nextBlock.color = rand()%0x10;if(0x00 == nextBlock.color){nextBlock.color = 0x0f;}printBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status,nextBlock.color);
}//拷贝方块:把下一个方块变成当前正在下落的方块
void copyBlock()
{//当前方块=下一个方块curBlock = nextBlock;curBlock.x = 22;curBlock.y = 1;printBlock(curBlock.x, curBlock.y, curBlock.shape,curBlock.status, curBlock.color);blockNext();
}//碰撞检测
//x,y为方块的下一个位置, status下一种形态
//碰撞返回-1,未碰撞返回0, 游戏结束返回-2
int crash(int x, int y, int shape, int status)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(block[shape][status][i][j] == 1){if(windowShape[i+y][j+x-15] == 1){//方块一产生就发生碰撞if(curBlock.x == 22 && curBlock.y == 1){return -2;}return -1;}}}}return 0;
}//保存方块
void saveBlock()
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(block[curBlock.shape][curBlock.status][i][j] == 1){windowShape[i+curBlock.y][j+curBlock.x-15] = 1;}}}
}//刷新游戏池
void updateGamePool()
{int i,j;//从下到上刷新游戏池for(i=23;i>0;i--){for(j=1;j<15;j++){if(windowShape[i][j] == 1){setColor(0x0e);setPos(j+15,i);printf("■");}else{setColor(0x00);setPos(j+15,i);printf("  ");}}}
}//消行检测
//检测满行->这一行所有值都为1
void lineClear()
{int i,j;int num = 0;    //统计一次消行数目for(i=23;i>0;i--){int total = 0;for(j=1;j<15;j++){total += windowShape[i][j];}if(total == 14){//满行lineDown(i);i += 1;num += 1;}}printGradeLevel(num);
}//消行下移
//从满行的这行开始,上面所有行顺序下移
void lineDown(int line)
{int i,j;for(i=line;i>1;i--){for(j=1;j<15;j++){windowShape[i][j] = windowShape[i-1][j];}}
}// 初始化游戏
void gameInit()
{//第一步,必须初始化句柄//clock_t startTime = clock();initHandle();setCursorVisible(FALSE);gamePool(15,0);printRule();printGradeLevel(0);startBlock();blockNext();//定时开始时间,结束时间,通过控制时间差实现定时clock_t start,stop;start = clock();while(1)        //for(;;){//检测是否有按键按下if(kbhit()){switch(getch()){case 'a':case 'A':case 75:leftBlock();break;case 'd':case 'D':case 77:rightBlock();break;case 's':case 'S':case 80:downBlock();break;case 'w':case 'W':case 72:changeBlock();break;case 32:pause();break;case 13:bottomBlock();break;}}//获取时间stop = clock();if(stop-start>0.5*CLOCKS_PER_SEC){downBlock();//重新计时start = stop;}}
}

好,到现在这个游戏也就结束了!


http://chatgpt.dhexx.cn/article/5CucfWBc.shtml

相关文章

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

【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…