俄罗斯方块c语言代码及注释,C语言代码实现俄罗斯方块
这里为大家敲写一段怎样用C语言实现俄罗斯方块:
首先推荐大家使用CodeBlocks这个软件,方便添加不同的工程。
代码中有很多注释便于理解!
下面是效果图和全部的代码以及注释,大家可以观看并自己新增内容!
1、首先是main.c文件:
#include
#include
#include "game.h"
int main()
{
gameInit();
return 0;
}
2、然后是mywindows.h文件:
#ifndef MYWINDOWS_H_INCLUDED
#define MYWINDOWS_H_INCLUDED
// 封装系统函数-系统调用模块
#include
// 初始化句柄
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-100
SetConsoleCursorInfo(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,游戏池长度为14
int 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
#include
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
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));
//初始化curBlock
curBlock.x = 22;
curBlock.y = 1;
//rand取一个随机整数
curBlock.shape = rand()%7; //0-6
curBlock.status = rand()%4; //0-3
curBlock.color = rand()%0x10;
if(0x00 == curBlock.color)
{
curBlock.color = 0x0f;
}
printBlock(curBlock.x, curBlock.y, curBlock.shape,
curBlock.status, curBlock.color);
}
//随机产生下一个方块
void blockNext()
{
//初始化nextBlock
delBlock(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;
}
}
}
好,到现在这个游戏也就结束了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
俄罗斯方块c语言代码及注释,C语言代码实现俄罗斯方块相关推荐
- Go语言中的注释类型和代码风格
Go语言中的注释类型 Go的代码风格
- c语言归并排序代码详细注释,C语言实现归并排序算法
C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...
- c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...
- 数组的c语言代码带注释,C语言之数组
1.一维数组 特点:同一数组中的所有元素都属于同种数据类型,数组元素用数组名和相应的下标来确定. 方法:一个数组元素其实就是一个变量,可以称为带下标的变量 1.一维数组的定义和引用(只有一个下标) 1 ...
- c语言删掉注释,c语言删除注释
/* * delete comment in C */ #include #define normal 0 void rcomment(int c); void in_comment(void); v ...
- c语言海伦公式编程注释,c语言 关于海伦公式 求助
满意答案 是刚学C吧?好象对变量的作用域.命名以及命令的使用还要再加强一下. 三个函数中都有错误: 一,看你的程序,似乎是想把变量s作为一个全局变量,在各个函数中使用,可该变量并没有定义.(那个主函数 ...
- ftp服务器搭建类似云盘功能代码(带注释详解代码)
ftp服务器使用说明 运行服务端 ./server 本机IP地址 端口号(使用ifconfig查看本机IP 地址) 运行客户端 ./client 服务器IP地址 相同端口号 运行成功后可执行以下指令, ...
- 【初级C语言】代码版式(空行,空格,对齐,长行代码,注释)
.空行 1. 空行起着分隔程序段落的作用,空行会在预编译阶段被删除不会浪费内存,请放心使用! 2. 每个函数定义结束之后都要加空行 3. 在一个函数体内,逻揖上密切相关的语句之间不加空行(如if-el ...
- c语言表示注释,c语言中注释的位置
匿名用户 1级 2011-10-21 回答 1 注释的原则和目的注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确.易懂.简洁.通过对函数或过程.变量.结 ...
- c语言注释含义,C语言编程规范——注释
前言 制定C语言的编程规范,对代码的清晰.简洁.可测试.安全.程序效率.可移植各个方面有巨大的作用. 良好的注释能让整个代码读起来更加流畅,此乃程序猿出差旅行,通宵熬夜必备良药...... 注释的原则 ...
最新文章
- java导入包写在第二行的吗_使用Java命令行方式导入第三方jar包来运行Java程序的命令...
- python2 python3编码_Python2和Python3编码问题-从底层出发
- AI以假乱真怎么办?TequilaGAN教你轻松辨真伪
- HTML转PDF(C#---itextsharp)(转自别人的文章)
- 【数据结构与算法】之深入解析“Excel表列序号和表列名称”的求解思路与算法示例
- 解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决
- Websocket实现前后台通信,demo小测试
- python两个时间点比较大小_python中如何比较两个时间点
- 如何在Java应用中提交Spark任务?
- c语言c99标准,C语言 1999年标准 (C99)
- itextpdf 超链接
- db2查看数据库端口
- 高德地图天气接口返回天气图标url
- PS案例提升课视频教程
- snmp+mrtg实现对局域网内的linuxServer的监控(转)
- 机器学习进阶-阈值与平滑-图像阈值 1. cv2.threshold(进行阈值计算) 2. 参数type cv2.THRESH_BINARY(表示进行二值化阈值计算)...
- weblogic漏洞总结复现
- 【翻译】国际标准 IEC TR 63145-22-10 |AR类型的特定测量方法. 光学性能
- 学生HTML个人网页作业作品下载 个人主页博客网页设计制作 大学生个人网站作业模板 dreamweaver简单个人网页制作
- 众生谈Cookie色变,我们的隐私在“裸奔”?