|
|
[发布日期]2008-11-9 [浏览次数]266 |
|
![]() |
/*程序功能:C图形模式下的俄罗斯方块游戏. *作者:漏网之鱼 *日期:20080123 *版本:V2.00 *包含:Mover.h *注释: *这个程序是完善了一下去年在学校的一个作业,可能还有些bug. *我愿意现在停下来是因为我觉得继续下去我也不会学到太多东西. *还可以加一些功能,比如说计分,以及提示.但大伙都明白,那些没 *有什么技术含量.非常简单,几乎不需要计算.我也留了右半边的 *空白.如果你发现有更好的实现,我十分愿意知道,并且会十分感谢, *请mail:zhponly@gmail.com */ #include<stdio.h> #include <graphics.h> #include <stdlib.h> #include <dos.h> #include"Mover.h" #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define STEP 20 int key; /*记录按键值*/ const int switchlist[19][2]={1,2,2,1,3,4,4,3,5,6,6,5,7,8,8,9,9,10,10,7,11,12,12,13,13,14,14,11,15,15,16,18,17,16,18,19,19,17}; /*一个常量的转义表,每次按下转换键,都会依本表进行转换,共有十九种不同的方块*/ long int delaytime=123456; /*迟延时间*/ int stateNum; /*状态序号,大于等于一,小于等于十九*/ static int i=0; /*表示一个方块变换的行数*/ static int li=0; /*记录左移的次数*/ static int ri=0; /*记录右移的次数*/ int sRecder[22][12]={0}; /*记录整个画面的数组,它的值代表方块的有无及颜色*/ void Init(void); /*初使化函数*/ void Close(void); /*关闭图形界面*/ void GameOver(void); /*游戏结束提示*/ void GamePlay(void); /*游戏运行过程函数*/ void DrawRec(void); /*画方块的函数*/ void InitDraw(void); /*初使化的一些画线*/ void SwitchIt(int); /*把一个方块由代表数字转变为参数*/ int BorderTestL(int); /*检查是否到了左边界*/ int BorderTestR(int); /*检查是否到了右边界*/ int HaveFallen(int); /*检查是否到了底边*/ void CheckFull(int); /*检查一行是否已经满*/ void RecordIt(int,int); /*记录方块的位置*/ void TestServer(void); /*辅助调试的一个函数,打印sRecder数组的所有值.*/ int TestOver(void); /*检查是否到最上面一行,游戏是否结束*/ void LineIt(void); /*如其名字所示,画线*/ int main() { Init(); GamePlay(); /*主函数比较简单*/ GameOver(); Close(); } void GamePlay(void) { cleardevice(); InitDraw(); LineIt(); /*初使化画几条线*/ while(1) { int o=TestOver(); if(o) break; if(ESC==key) break; srand(time(NULL)); /*不停地产生方块直到抵达最高一行或按下ESC*/ stateNum=rand()%19+1; SwitchIt(stateNum); DrawRec(); } } int first,second,third,forth,matchColor,j; /*四个参数表示每个方块由四个正方形组成,其值代表初使位置.每种方块有不同颜色,j为循环用*/ void DrawRec() { while(1) { int notBorderR,notBorderL,fallen=0; while((!kbhit())&&(!fallen)) { DrawSqu(first+12*i,matchColor); DrawSqu(second+12*i,matchColor); DrawSqu(third+12*i,matchColor); DrawSqu(forth+12*i,matchColor); delay(delaytime); DrawSqu(first+12*i,9); /*画一个方块,一定时间后,用背景色画一个*/ DrawSqu(second+12*i,9); /*然后在它的下面再画一下,表示它是下降的*/ DrawSqu(third+12*i,9); DrawSqu(forth+12*i,9); InitDraw(); i++; fallen=HaveFallen(i-1); if(fallen) { DrawSqu(first+12*(i-1),matchColor); DrawSqu(second+12*(i-1),matchColor); DrawSqu(third+12*(i-1),matchColor); DrawSqu(forth+12*(i-1),matchColor); RecordIt(i-1,matchColor); /*停了以后,把数组中相应位置写为该块的颜色值*/ break; } } if(fallen) { li=0; ri=0; CheckFull(i-1); /*检查一下是否一行满,准备下一方块*/ break; } key=bioskey(0); notBorderR=BorderTestR(i-1); notBorderL=BorderTestL(i-1); if(UP==key) { for(j=1;j<20;j++) { if(switchlist[j][0]==stateNum) { stateNum=switchlist[j][1]; SwitchIt(switchlist[j][1]); first=first-ri+li; second=second-ri+li; /*如果变换,则在相应位置出现变换以后的块*/ third=third-ri+li; forth=forth-ri+li; DrawRec(); break; } } } else if((RIGHT==key)&&(notBorderR)) { first++; second++; /*如果该块右边没有边界或其它块,可以右移*/ third++; forth++; ri++; } else if((LEFT==key)&&(notBorderL)) { first--; second--; third--; /*如果该块左边没有边界或其它块,可以左移*/ forth--; li++; } else if(ESC==key) { break; /*按ESC退出*/ } if(fallen) break; } i=0; } /*********************************************************************************************************/ /*Mover.h*/ #define STEP 20 #define Irow 40 #define Iline 40 #define Erow 280 #define Eline 480 /*以上是对图形初使化时用的一组数据*/ extern long int delaytime; extern int key; extern int matchColor; extern int first; extern int second; extern int third; extern int forth; extern int sRecder[22][12]; void DrawSqu(int a,int b); void DisSqu(int a,int b); void Changer(int); void LineIt(void); void Init(void) { int n; int gd=DETECT,gm; registerbgidriver(EGAVGA_driver); initgraph(&gd,&gm,"f:\\tc"); cleardevice(); setbkcolor(9); setlinestyle(SOLID_LINE,0,THICK_WIDTH); printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t Powered by Library of Hitwh"); for(n=0;n<5;n++) delay(delaytime); } /*上面的函数初使化,宣传一下我们学校:-)*/ void GameOver(void) { getch(); cleardevice(); /*结束游戏*/ setcolor(12); settextstyle(0,0,4); outtextxy(200,200,"GAMEOVER"); } void Close(void) { getch(); closegraph(); /*关闭图形界面*/ } void InitDraw(void) { setcolor(7); /*初使化*/ rectangle(Irow,Iline,Erow,Eline); } void DrawSqu(int position,int color) { int line,num; setfillstyle(1,color); line=position/12; /*把数据转换成行列值,用相就颜色画出*/ num=position%12; bar3d(Irow+num*STEP,Iline+line*STEP,Irow+STEP+num*STEP,Iline+STEP+line*STEP,2,2); } void DisSqu(int position,int color) { int line,num; setfillstyle(1,color); /*把数据转换成行列值,用相就颜色画出*/ line=position/12; num=position%12; bar(Irow+num*STEP,Iline+line*STEP,Irow+STEP+num*STEP,Iline+STEP+line*STEP); } int BorderTestL(int i) { int recI,recS,recT,recF; if((first)&&(second%12)&&(third%12)&&(forth%12)) { recI=sRecder[i+first/12][first%12-1]; recS=sRecder[i+second/12][second%12-1]; recT=sRecder[i+third/12][third%12-1]; recF=sRecder[i+forth/12][forth%12-1]; if((recI)||(recS)||(recT)||(recF)) return 0; return 1; } /*如果到了最左边或左边有方块,则为真*/ return 0; } int BorderTestR(int i) { int recI,recS,recT,recF; if(((first+1)%12)&&((second+1)%12)&&((third+1)%12)&&((forth+1)%12)) { recI=sRecder[i+first/12][first%12+1]; recS=sRecder[i+second/12][second%12+1]; recT=sRecder[i+third/12][third%12+1]; recF=sRecder[i+forth/12][forth%12+1]; if((recI)||(recS)||(recT)||(recF)) return 0; return 1; } /*感觉这个和上个函数可以用不同参数调用同一函数,唉...*/ return 0; } int HaveFallen(int i) { int unfall,recI,recS,recT,recF; unfall=21-(forth/12+i); recI=sRecder[i+1+first/12][first%12]; recS=sRecder[i+1+second/12][second%12]; recT=sRecder[i+1+third/12][third%12]; recF=sRecder[i+1+forth/12][forth%12]; if((!unfall)||(recI)||(recS)||(recT)||(recF)) return 1; return 0; /*本来只用一个函数可以的,我用了三个,好理解些吧*/ } void CheckFull(int i) { int state,isFull=1; for(state=0;state<12;state++) { if(0==sRecder[state]) isFull=0; } if(isFull) Changer(i); /*这个得得多费些口舌,如果first和second是同一行*/ isFull=1; /*消去一次就可以了*/ for(state=0;state<12;state++) { if(0==sRecder[i+second/12][state]) isFull=0; } if(isFull) Changer(i+second/12); isFull=1; for(state=0;state<12;state++) { if(0==sRecder[i+third/12][state]) isFull=0; } /*在一行十二个正方形中,如果有一个为空,则该行不为满*/ if(isFull) Changer(i+third/12); isFull=1; for(state=0;state<12;state++) { if(0==sRecder[i+forth/12][state]) isFull=0; } if(isFull) Changer(i+forth/12); } void Changer(int i) { int l,m; LineIt(); /* printf("changer has been called and i is %d\n",i);本句调试用*/ for(m=0;m<12;m++) DrawSqu(12*i+m,9); /*先用背景色把该行画去*/ for(l=i;l>0;l--) /*这儿不能到第0行,唉,耗了我不少时间*/ { for(m=0;m<12;m++) { DrawSqu(l*12+m,9); sRecder[l][m]=sRecder[l-1][m]; /*根据上一行情况画本行的正方形*/ if(sRecder[l][m]) DrawSqu(l*12+m,sRecder[l][m]); } } } void RecordIt(int i,int color) { sRecder[first]=color; sRecder[i+second/12][second%12]=color; sRecder[i+third/12][third%12]=color; /*用该方块颜色值记录之*/ sRecder[i+forth/12][forth%12]=color; } void TestServer() { int a,b; for(a=0;a<12;a++) { /*调试用函数*/ for(b=0;b<22;b++) { printf("%d",sRecder[a]); } printf("\n"); } getch(); } int TestOver() { int t,o; for(t=0;t<12;t++) if(sRecder[0][t]) o=1; o=0; /*第0行有方块,游戏结束*/ return o; } void LineIt() { int x,y; for(x=0;x<12;x++) for(y=0;y<22;y++) DrawSqu(12*y+x,9); } void SwitchIt(int n) { /*转换表*/ switch (n) { case 1: first=4;second=5;third=6;forth=7; matchColor=5; break; case 2: first=5;second=17;third=29;forth=41; matchColor=5; break; case 3: first=5;second=6;third=16;forth=17; matchColor=6; break; case 4: first=5;second=17;third=18;forth=30; matchColor=6; break; case 5: first=6;second=17;third=18;forth=29; matchColor=10; break; case 6: first=5;second=6;third=18;forth=19; matchColor=10; break; case 7: first=5;second=17;third=28;forth=29; matchColor=11; break; case 8: first=5;second=6;third=7;forth=17; matchColor=11; break; case 9: first=5;second=6;third=18;forth=30; matchColor=11; break; case 10: first=7;second=17;third=18;forth=19; matchColor=11; break; case 11: first=6;second=18;third=29;forth=30; matchColor=13; break; case 12: first=5;second=17;third=18;forth=19; matchColor=13; break; case 13: first=5;second=6;third=17;forth=29; matchColor=13; break; case 14: first=5;second=6;third=7;forth=19; matchColor=13; break; case 15: first=5;second=6;third=17;forth=18; matchColor=2; break; case 16: first=5;second=17;third=18;forth=29; matchColor=14; break; case 17: first=6;second=17;third=18;forth=19; matchColor=14; break; case 18: first=5;second=6;third=7;forth=18; matchColor=14; break; case 19: first=6;second=17;third=18;forth=30; matchColor=14; } } |
www.51xueshu.com |
|
![]() |
|
|
|
|
代写论文网提供最专业的论文服务,凭借深厚的专业知识和丰富的写作经验,为您提供一个专业的论文服务平台。
代写承诺:我们不会在未提供给您关于您课题任何资料和思路前收取任何定金,本站会给你一个关于您课题满意的规划和思路。在您接受本站服务的过程中,我们负责给您提供服务直至您满意为止,包括后期免费修改、免费指导答辩等,让您知道所以然。 |
|
(一) 组成人员实力强,学术层次高,不仅仅提供一篇论文,而是一个论文服务,来更合适你自己的背景和情况。
(二) 专业性强,提供的专业论文不是空谈泛谈,不空洞,更切合您学科发展方向。
(三) 论文原创性强,不是组合,拼凑,剽窃而来,是思想和你的背景结合而来。
(四) 时间响应快,适合处理急活、难活。 |
|
|