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;//游戏acticeif(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; } 。收起