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;

} 。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值