linux下c语言俄罗斯方块,c语言做俄罗斯方块

我来对这段程序做一下注释:

#include /*标准库*/

#include /*绘图库*/

#include /*BIOS库,输入输出,BIOS时间等*/

#define mDRAW 5 /*各种消息的宏定义*/

#define mLINE 6

#define mADOWN 7

#define mGEN 8

#define mLEFT 75

#define mRIGHT 77

#define mSPACE 57

#define mDOWN 80

#define mESC 1

#define TIMEINT 2 //下落间隔时间,即下落速度

#define MAXX 9 /*行列数,9×30的区域*/

#define MAXY 30

#define BACKCOLOR BLACK /*背景色*/

#define WINX 50 //游戏box所在的位置,单位为像素,下同

#define WINY 470

#define GAP 6 //间隙宽度

#define AREAX (WINX+GAP)

#define AREAY (WINY-GAP)

#define BOXW 15 //每一小格的宽度

int oldarea[MAXY+1][MAXX]; //为和当前游戏区域进行比较而保存的上一游戏区域信息

int area[MAXY+1][MAXX]; //游戏区域的方块信息,有方块计1,否则计0。

int actW,actH,actX,actY; //方块可活动的X、Y、宽、高信息

int curX,curY,curColor,curW,curH; //方块当前的X、Y、宽、高、颜色信息

int newX,newY,newColor,newW,newH; //方块新的(或称为接受控制消息后计算出的下一状态的)X、Y、宽、高、颜色信息

int active; //游戏是否处于active状态

int box[4][4]; /*方块的二维数组,定义当前方块*/

int FORCOLOR; /*前景色*/

int MESSAGE; //方块位置控制消息

int BOX[7][4][4]={ /*7个不同的方块定义成4×4的数组,可以看成产生方块的模板*/

{

{1,1,1,1}, /*直棍*/

{0,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0},/*右弯*/

{1,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0}, /*左弯*/

{0,0,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0}, /*T型*/

{0,1,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,0,0}, /*左Z*/

{0,1,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{0,1,1,0}, /*右Z*/

{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}

}

};

//子函数下面详细说明

void init(); //初始化

void draw(); //绘图

int genBox();

int getKey();

void lineFull();

int moveLeft();

int moveRight();

int moveDown();

int rotate();

int getW();

int getH();

void clearOldBox();

void putNewBox();

int collisionRotate(int box[][4]);

void getMessage();

void dispatchMessage();

int timeCome();

void fallDown();

int gameOver();

/*------------主函数----------------*/

main()

{

int i;

init();

do //循环

{

getMessage(); //获得方块位置控制消息

dispatchMessage(); //根据不同的消息做出不同的动作

}

while(!gameOver()); //直到游戏结束

getch(); //使用getch()让程序停在这里,按下任意键后

closegraph(); //就可关闭图形,结束游戏

}

/*------------子函数--------------*/

void getMessage()

{

if(MESSAGE) return; //除接受键盘消息外,方块的动作函数也会产生一些消息如果有一个消息尚未处理,则直接返回处理它

if(timeCome()) //计时时间到

{

MESSAGE=mADOWN; //控制消息=mADOWN,自动落下一格

return;

}

if(bioskey(1)) //查询是否有键盘消息

{

MESSAGE=bioskey(0)>>8;/*bioskey(0)返回键盘按键低8位数的ASCII码,因此右移8位,生成消息*/

return;

}

}

void dispatchMessage() //根据不同的消息做出不同的动作

{

switch(MESSAGE)

{

case mLEFT: moveLeft();break; //以下分别代表左、右、

case mRIGHT: moveRight();break;//下、旋转、落下、绘图、行满、生成方块等动作

case mADOWN: moveDown();break;

case mSPACE: rotate();break;

case mDOWN: fallDown(); break;

case mDRAW: draw();break;

case mLINE: lineFull();break;

case mGEN: genBox();break;

case mESC: closegraph(); exit(0);//退出

default: MESSAGE=0;

}

}

void fallDown()

{

while(active)//如果游戏active

{

moveDown(); draw(); //向下落,绘图

}

MESSAGE=mLINE;

}

int timeCome() //计时函数

{

static long tm, old; //两个时间,一个从BIOS中取得的新时间,一个上一次获得的时间

tm=biostime(0,tm);

if(tm-old=MAXX)curX=MAXX-1-curW;//如果当前方块的宽度+方块的位置大于最大值,调整位置。

我认为这种情况是不会发生的,唯一的可能是直棍。

curY=MAXY-1-curH; //当前块Y位置,开始总是从最上端落下

newX=curX; newY=curY; actX=curX;actY=curY;

actW=newW=curW; actH=newH=curH;

active=1;//游戏actice

if(collision(box)) return 0;//如果方块一下来发生碰撞,返回0,游戏结束

putNewBox();//重构游戏区域

draw(); MESSAGE=0; //绘图,清空消息

return 1;//产生成功,返回1

}

void lineFull()//每次有方块落下后,都对方块那几行进行判断

{

int row,col, rowEnd,full,i,j;

rowEnd=newY+newH; //计算方块落在哪几行

if(rowEnd>=MAXY-1) rowEnd=MAXY-2;

for(row=newY; rowcurH? newH:curH;

actW=curX+actH-newX;

actX=newX; actY=newY; curX=newX;

curY=newY; curW=newW; curH=newH;

MESSAGE=mDRAW;

return 1;

}

int getW() //获得一个方块的宽度

{

int i,j;

for(i=3;i>0;i--)

for(j=0;j0;j--)

for(i=0;i=MAXX) return 1;

if(newY=MAXX) newX=MAXX-1-newW;

if(newY+newH>=MAXY) newY=MAXY-1-newH;

if(collision(cbox)) return 1;

for(i=0;iMAXY-3)) return 1; //如果大于当前Y坐标+当前高度>最大Y坐标-3,游戏结束

else return 0;

} 。

全部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8款JVM性能调优监控工具(提高开发效率)

在平时的开发当中我们总是会遇到各种各样的问题,比如说内存泄漏、死锁、CPU等。遇到问题不可怕,关键是我们如何去排查这些错误,对症下药才是根本。不过对于很多人来说,往往找不到这些问题的根本所在,因此这篇文章主要是…

linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...

自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie15PB在上一节中,你已经听说了DWARF调试格式,它是程序的调试信息,是一种可以更好理解源码的方式,而不只是解析程序。今天我们将讨论源代码级调试信息的细…

SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity、dao、mapper,写下第一个Controller准备试一下,结果却发现一条简单的查询报错了。 {"timestamp…

Linux检查wlan0是否存在,linux - airmon-ng将wlan0更改为wlan0mon但不恢复[​​关闭] - 堆栈内存溢出...

我有同样的问题关闭wlan0mon(但在Kali Linux,而不是Ubuntu),我相信我的一位同事因此而锁定了几个适配器。 但是,从2016年4月14日开始,Colin在2016年4月14日的优秀答案中纠正了我的硬件问题(ALFA AWUS036NHA),而无需两次…

Java中switch参数传null会引起异常——Java 语法糖

问题 switch 参数不能是null,swicth(null)会报java.lang.NullPointerException异常 查找原因 为什么会这样呢,查找一下原因: 找到编译后的class文件,就明白了 总结: switch 是一个语法糖。switch语句是先计算 par…

linux head命令作用,Linux查看文件内容之head命令

1. head命令简介本文主要介绍head命令的作用与常用使用方法,该命令和tail命令相反,head默认显示用来显示文本开头,而tail默认显示结尾某个数量的文字区块。2. head命令选项-q 隐藏文件名-v 显示文件名-c 显示字节数-n 显示的行数3. 常见使用方…

java.util.concurrent.TimeUnit

JavaAPI:https://docs.oracle.com/javase/8/docs/api/index.html 1 TimeUnit api:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html TimeUnit是java.util.concurrent包下面的一个类;TimeUnit 是Java枚举应用场…

c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

目录预编译值传递、指针传递、引用传递数组typedef 函数指针预编译预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。#define 和 #include 一样,都是以“#”开头的。凡是以“#”开头的均为预处理指令。#d…

凑钱系统C语言,C语言课程设计报告书凑钱程序.doc

C语言课程设计报告书凑钱程序西北师范大学知行学院计算机与电子信息工程系课程设计报告书课程名称: C语言程序设计专 业: 电子信息工程课题名称: 凑钱程序班 级: 13电本班学 号: 201392170114姓 名: 秦波指导教师: 柴西林二○一三 ——二○一四 学年 第一学期基于C语…

SpringBoot使用jasypt加解密密码

在我们的服务中不可避免的需要使用到一些秘钥(数据库、redis等);使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些。打开application.properties或application.yml&…

android 写字体投影,android-给字体设置投影

1,在代码中添加文字阴影TextView 有一个方法/*** Gives the text a shadow of the specified radius and color, the specified* distance from its normal position.** attr ref android.R.styleable#TextView_shadowColor* attr ref android.R.styleable#TextView…

Java包装类中的equals方法

基本数据类型包装类中的equals方法用于比对相同包装类中的值是否相等,如果两者比较的包装类类型不同则返回false; 1、基本型和基本型封装型进行“”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较, 2.两个包裝类型…

android 开源图表动画,Android 图表开发开源库MPAndroidChart-Go语言中文社区

上面是APP中实现的效果图(点击可以放大查看)图1的效果不是用这个实现的,如果感兴趣可以参考我这篇文章 Android渐变圆环总体来说,MPAndroidChart可能是目前Android 开发最好用的一个三方库了,功能非常强大,集成简单。直接导入作为…

电脑开启防火墙后ping不通 及 开启防火墙后,不能远程的解决办法

有些情况下电脑需要开防火墙但是又希望能被远程或者ping通。 一、先查看电脑的网络类型(第二步中打开对应网络类型下的协议) 二、控制面板 - Windows防火墙 - 高级设置-入站规则 (1)开启防火墙后,能ping通设置。 &…

android 时间应用程序,Android在首次启动时需要更多时间启动应用程序

在我的项目中,我使用了需要multidex支持的库。 根据我的研究,我发现它会导致应用启动时出现延迟。我在gradle中启用了multidexfunction。 defaultConfig {multiDexEnabled true}我曾经为kitkat设备获得NoClassDefFound Exception,所以我添加了…

Mysql中用between...and...查询日期时注意事项

select count(1) from user where regist_date between 2017-07-25 00:00:00 and 2017-07-25 24:00:00;这条sql语句查询出结果为0。实际上数据库有一条符合该查询条件的数据。 错误原因:2017-07-25 24:00:00 晚上24点即为下一天00点 2017-07-26 00:00:00&#xff0…

android core log,Android 日志系统(Logcat)的实现分析

这篇说一下Android 日志系统的实现:1. Android中的打印分为4个缓冲区和6个打印等级,在frameworks\base\core\java\android\util\Log.java中有定义:四缓冲:public static final int LOG_ID_MAIN 0;public static final int LOG_ID…

Java接口的几种常见用法

接口(interface)对于面向对象编程来说是一个非常重要的概念。它是一系列方法的声明,却没有具体实现。有些编程语言,比如swift,把接口解释成“协议(protocol)”,我觉得也是非常的恰当…

android矢量图 内存大,Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。...

先上一个 位图和矢量图的 说明。外链网址已屏蔽维基百科里面有更详细的说明 我就不贴地址了。简单来说就是位图 比 矢量图要大。但是位图可以适用于各种场景。但是矢量图就只能显示一些有规律的图形。复杂的做不了或者是很难做。对于android来说,我们一般app里面 会…

linux下利用nohup后台运行jar文件包程序

Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 java -jar XXX.jar & &am…