这里为大家敲写一段怎样用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语言代码实现俄罗斯方块相关推荐

  1. Go语言中的注释类型和代码风格

    Go语言中的注释类型 Go的代码风格

  2. c语言归并排序代码详细注释,C语言实现归并排序算法

    C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...

  3. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...

  4. 数组的c语言代码带注释,C语言之数组

    1.一维数组 特点:同一数组中的所有元素都属于同种数据类型,数组元素用数组名和相应的下标来确定. 方法:一个数组元素其实就是一个变量,可以称为带下标的变量 1.一维数组的定义和引用(只有一个下标) 1 ...

  5. c语言删掉注释,c语言删除注释

    /* * delete comment in C */ #include #define normal 0 void rcomment(int c); void in_comment(void); v ...

  6. c语言海伦公式编程注释,c语言 关于海伦公式 求助

    满意答案 是刚学C吧?好象对变量的作用域.命名以及命令的使用还要再加强一下. 三个函数中都有错误: 一,看你的程序,似乎是想把变量s作为一个全局变量,在各个函数中使用,可该变量并没有定义.(那个主函数 ...

  7. ftp服务器搭建类似云盘功能代码(带注释详解代码)

    ftp服务器使用说明 运行服务端 ./server 本机IP地址 端口号(使用ifconfig查看本机IP 地址) 运行客户端 ./client 服务器IP地址 相同端口号 运行成功后可执行以下指令, ...

  8. 【初级C语言】代码版式(空行,空格,对齐,长行代码,注释)

    .空行 1. 空行起着分隔程序段落的作用,空行会在预编译阶段被删除不会浪费内存,请放心使用! 2. 每个函数定义结束之后都要加空行 3. 在一个函数体内,逻揖上密切相关的语句之间不加空行(如if-el ...

  9. c语言表示注释,c语言中注释的位置

    匿名用户 1级 2011-10-21 回答 1 注释的原则和目的注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确.易懂.简洁.通过对函数或过程.变量.结 ...

  10. c语言注释含义,C语言编程规范——注释

    前言 制定C语言的编程规范,对代码的清晰.简洁.可测试.安全.程序效率.可移植各个方面有巨大的作用. 良好的注释能让整个代码读起来更加流畅,此乃程序猿出差旅行,通宵熬夜必备良药...... 注释的原则 ...

最新文章

  1. java导入包写在第二行的吗_使用Java命令行方式导入第三方jar包来运行Java程序的命令...
  2. python2 python3编码_Python2和Python3编码问题-从底层出发
  3. AI以假乱真怎么办?TequilaGAN教你轻松辨真伪
  4. HTML转PDF(C#---itextsharp)(转自别人的文章)
  5. 【数据结构与算法】之深入解析“Excel表列序号和表列名称”的求解思路与算法示例
  6. 解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决
  7. Websocket实现前后台通信,demo小测试
  8. python两个时间点比较大小_python中如何比较两个时间点
  9. 如何在Java应用中提交Spark任务?
  10. c语言c99标准,C语言 1999年标准 (C99)
  11. itextpdf 超链接
  12. db2查看数据库端口
  13. 高德地图天气接口返回天气图标url
  14. PS案例提升课视频教程
  15. snmp+mrtg实现对局域网内的linuxServer的监控(转)
  16. 机器学习进阶-阈值与平滑-图像阈值 1. cv2.threshold(进行阈值计算) 2. 参数type cv2.THRESH_BINARY(表示进行二值化阈值计算)...
  17. weblogic漏洞总结复现
  18. 【翻译】国际标准 IEC TR 63145-22-10 |AR类型的特定测量方法. 光学性能
  19. 学生HTML个人网页作业作品下载 个人主页博客网页设计制作 大学生个人网站作业模板 dreamweaver简单个人网页制作
  20. 众生谈Cookie色变,我们的隐私在“裸奔”?

热门文章

  1. PreScan、Carsim、Carmaker和VTD联合仿真
  2. 火山软件开发访问网页查找电话号和读写文件应用
  3. Centos7下MySql升级
  4. 100台电脑无盘服务器配置,100台网吧无盘系统配三星840PRO方案解读
  5. 基于ssm校园餐厅订餐管理系统获取(java毕业设计)
  6. Python-变分模态分解(VMD)python代码及其测试用例
  7. Qt制作学生管理系统软件
  8. 分享112个留言聊天PHP源码,总有一款适合你
  9. 经典java算法大全
  10. 利用SQL语句创建数据库