c语言最简单的程序流程图,高手帮忙画个流程图简单的俄罗斯方块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;//游戏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; } 。收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* *游戏说明:此为我边学边做的,但有很多的BUG,参照了我从网上下载的游戏方块设计 * 一、游戏的BUG * 1、提示分数那地方,玩过游戏后,长了分数后,再玩时,后面的数据没清掉 * 2、重级BUG:当在游戏过中,切换了一个旁边的后,再切换回来后, * 刚才的方块不显了,而且游戏区的数据也不见了。 * 3、我在刚开始做时,没有要窗口上的关闭,现在想要,但不知道怎么加。 * 4、如果用鼠标点了菜单后,再回到游戏区,数据方块又不见了。 * * 二、此游戏没有版权,可以乱改,反正我也是在学习,谢谢那些无私的网友们,不过 * 请你们下次提交上来的源程序有个说明好不好,看得我头都大了,流程图也没得, * 设计说明也没有,完全看源代码,很费力的!谢谢对新人的支持。 * * 三、如果那位高手愿意,请收我为徒弟吧,我学过c/c++、数据结构、编译原理、操作系统等( * 计算机专业的),但对于VC这个大东西来说,,好像一点用也没有,现在在边学边做,门不好入呀! * * 四、请高手们帮帮我,请给分析一下问题在哪,谢谢,我对VC还不是很清楚,在文件目录下 * 有设计时的流程图。设计说明我没有写,我是针对每一个流程图模块来设计和编码的。 * * 五、在游戏中,我加了很多注释,以方便理解,主要的代码都在CChileView.h、CChileView.CPP中 * 我想的是,如果新人也想看看的话,可能理解起来快点。不过有点乱,编码中有些冗余。没来 * 得及改。如果你改好了,请给我一份,我想学学。谢谢! * *================================================================================================ * *编译环境: * 1、操作系统 :WindowsXP SP2 * 2、编译器 :Visual C++ 8.0 * *包含文件:所有源文件都在此。 * * *编译参考:此目录下有一个文件名为:Russia.sln的文件,用Visual C++ 8.0 打开,直接就可编译 * 此游戏是我编译通过后,才压缩的。如果编译不了,请联系我,下面有我的QQ和email。 * * *其它事宜:如果还有什么问题我没有提到的,请联系我,愿向你学习。 * *================================================================================================ * *Version :BUG Edtion * *Aauthor :lin_liu60 * *E-mail :lin_liu60@163.com * *QQ :994165 (网名:刘羽峰) * *Date :2006/9/27 * */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值