您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > C语言程序设计-俄罗斯方块源程序
其中的主要逻辑有:(1)由于c的随机性函数不好,所以每次游戏开始根据bios时间设置种子。(2)得分越高,方块下降速度越快(每200分为单位)。(3)每下落一个方块加1分,每消除一行加10分,两行加30分,三行加70分,四行加150分。初试分数为100分。游戏控制:up-旋转;空格-下落到底;左右下方向键-控制方向。P-开始或暂停游戏。ESC-退出。特点:(1)由于tc不支持中文,所以基本都是英文注释。(2)函数命名尽可能规范的表达其内部处理目的和过程。(3)代码加上注释仅有577行。(我下载过的两个俄罗斯方块代码一个在1087行,一个在993行,我的比它们代码少)。(4)除了消除空格时算法比较复杂,其他算法都比较简单易读。(5)绘图效率和局部代码效率扔有待提高。(6)FrameTime参数可能依据不同硬件环境进行具体设置,InitGame需要正确的TC路径。俄罗斯方块源于大约9年前上大一时的一个梦,我们在学习c语言时,我的同寝室友邀请我合作一起完成俄罗斯方块(课外作业性质),但是当时限于我们的水平比较菜和学习状态比较懒散,我们没有完成。大一的时候我在机房里无意发现别人留下的俄罗斯方块程序,运行,老师发现后激动的问我是我写的吗,我惭愧的摇摇头。那时看到别人做c的大程序深感羡慕(自己只是写几十行的程序)。数年后我仍然看到有不同样式的实现,但是我一直没有实现它,知道今天忽然有这个想法去做,算是弥补多年前的遗憾和心愿吧。---------------------------------------------Q&A:----------------------------------------------Q:我编译时出现错误:fatalerrorC1083:Cannotopenincludefile:'bios.h':Nosuchfileordirectory,该如何解决?A:正文中的代码,是使用Borland公司的TC2.0编译的,编译结果运行在Windows的16位虚拟机上。bios.h是属于TC的头文件,在VC或者其他编译器中可能没有这个头文件。因此会产生这个错误。解决办法:(1)可以下载附件中的压缩包,是使用VC6.0进行编译的版本,编译结果是Windows程序,运行在windows32系统上。两者之间的算法完全一致,区别仅仅是绘图时采用的接口不同,TC下采用BGI(进入图形模式),VC下采用的是GDI(使用DC进行绘图)。(2)下载TC2.0进行编译。Q:使用TC3.0进行编译时,提示未能初始化图形模式,请使用initgraph函数。A:这是因为TC3.0的BGI文件的路径和TC2.0有所不同。TC2.0的BGI文件位于TC路径下。而TC3.0的BGI文件位于BGI文件夹中。请把initgame函数中的initgraph函数中的第三个参数设置为正确的路径。例如:initgraph(&..,&..,C:\\TC\\BGI);Q:编译后运行时,弹出错误对话框报告16位虚拟机遇到不可执行的指令,点击确定后退出。A:该问题在某些环境中出现,可能是基于软件或者硬件环境造成,具体原因暂时未知。为避免该问题,请加载附件中的压缩包VC6.0版本。-----------------------------------------------------------------TC2.0的代码如下(VC6.0版本代码见附件):程序代码:/*************************************Desc:俄罗斯方块游戏*By:hoodlum1980*Email:jinfd@126.com*Date:2008.03.1222:30************************************/#includestdio.h#includebios.h#includedos.h#includegraphics.h#includestring.h#includestdlib.h#definetrue1#definefalse0#defineBoardWidth12#defineBoardHeight23#define_INNER_HELPER/*innerhelpermethod*//*ScanCodesDefine*/enumKEYCODES{K_ESC=0x011b,K_UP=0x4800,/*upwardarrow*/K_LEFT=0x4b00,K_DOWN=0x5000,K_RIGHT=0x4d00,K_SPACE=0x3920,K_P=0x1970};/*thedatastructureoftheblock*/typedefstructtagBlock{charc[4][4];/*cellfillinfoarray,0-empty,1-filled*/intx;/*blockpositioncx[0,BoardWidht-1]*/inty;/*blockpositioncy[-4,BoardHeight-1]*/charcolor;/*blockcolor*/charsize;/*blockmaxsizeinwidthorheight*/charname;/*blockname(theblock'sshape)*/}Block;/*game'sglobalinfo*/intFrameTime=1300;intCellSize=18;intBoardLeft=30;intBoardTop=30;/*nextblockgrid*/intNBBoardLeft=300;intNBBoardTop=30;intNBCellSize=10;/*scoreboardposition*/intScoreBoardLeft=300;intScoreBoardTop=100;intScoreBoardWidth=200;intScoreBoardHeight=35;intScoreColor=LIGHTCYAN;/*infortextpostion*/intInfoLeft=300;intInfoTop=200;intInfoColor=YELLOW;intBorderColor=DARKGRAY;intBkGndColor=BLACK;intGameRunning=true;intTopLine=BoardHeight-1;/*topemptyline*/intTotalScore=100;charinfo_score[20];charinfo_help[255];charinfo_common[255];/*ourboard,Board[x][y][0]-isFilled,Board[x][y][1]-fillColor*/unsignedcharBoard[BoardWidth][BoardHeight][2];charBufferCells[4][4];/*usedtojudgeifcanrotateblock*/BlockcurBlock;/*currentmovingblock*/BlocknextBlock;/*nextBlocktoappear*//*functionlist*/intGetKeyCode();intCanMove(intdx,intdy);intCanRotate();intRotateBlock(Block*block);intMoveBlock(Block*block,intdx,intdy);voidDrawBlock(Block*block,int,int,int);voidEraseBlock(Block*block,int,int,int);voidDisplayScore();voidDisplayInfo(char*text);voidGenerateBlock(Block*block);voidNextBlock();voidInitGame();intPauseGame();voidQuitGame();/*GetKeyCode*/int_INNER_HELPERGetKeyCode(){intkey=0;if(bioskey(1)){key=bioskey(0);}returnkey;}/*displaytext!*/void_INNER_HELPERDisplayInfo(char*text){setcolor(BkGndColor);outtextxy(InfoLeft,InfoTop,info_common);strcpy(info_common,text);setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common);}/*createanewblockbykeynumber,*theblockanchortothetop-leftcornerof4*4cells*/void_INNER_HELPERGenerateBlock(Block*block){intkey=(random(13)*random(17)+random(1000)+random(3000))%7;block-size=3;/*becausemostblocks'size=3*/memset(block-c,0,16);switch(key){case0:block-name='T';block-color=RED;block-c[1][0]=1;block-c[1][1]=1,block-c[2][1]=1;block-c[1][2]=1;break;case1:block-name='L';block-color=YELLOW;block-c[1][0]=1;block-c[1][1]=1;block-c[1][2]=1,block-c[2][2]=1;break;case2:block-name='J';block-color=LIGHTGRAY;block-c[1][0]=1;block-c[1][1]=1;block-c[1][2]=1,block-c[0][2]=1;break;case3:block-name='z';block-color=CYAN;block-c[0][0]=1,block-c[1][0]=1;block-c[1][1]=1,block-c[2][1]=1;break;case4:block-name='5';block-color=LIGHTBLUE;block-c[1][0]=1,block-c[2][0]=1;block-c[0][1]=1,block-c[1][1]=1;break;case5:block-name='o';block-color=BLUE;block-size=2;block-c[0][0]=1,block-c[1][0]=1;block-c[0][1]=1,block-c[1][1]=1;break;case6:block-name='I';block-color=GREEN;block-size=4;block-c[1][0]=1;block-c[1][1]=1;block-c[1][2]=1;block-c[1][3]=1;break;}}/*getnextblock!*/voidNextBlock(){/*copythenextBlocktocurBlock*/curBlock.size=nextBlock.size;curBlock.color=nextBlock.color;curBlock.x=(BoardWidth-4)/2;curBlock.y=-curBlock.size;memcpy(curBlock.c,nextBlock.c,16);/*generatenextBlockandshowit*/EraseBlock(&nex
本文标题:C语言程序设计-俄罗斯方块源程序
链接地址:https://www.777doc.com/doc-3265867 .html