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 //下...全部
我来对这段程序做一下注释:
#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;
} 。收起