俄罗斯方块c语言程序带注释
- 格式:doc
- 大小:89.50 KB
- 文档页数:14
#include<stdio.h>#include<graphics.h>#include<conio.h>#include<time.h>#include<dos.h>#include<stdlib.h>#include<math.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bintBox_x[5],Box_y[5],Box_xy[15][10]={0},num,life=1,score,mx,my,key,x[5],y[5],size,g rade=0;int *buf;void Init();void my_ad_1();void my_ad_2();void my_ad_3();void play();void jiang();void De_B_xy();void Draw_Box();void Ad_Box_y();void Mi_Box_x();void Ad_Box_x();void ch_B_xy();void rebuild();void Draw_New();void close();void delay_n(int n);void main(){Init();my_ad_1();my_ad_2();my_ad_3();play();close();}void Init(){int driver=DETECT,mode;initgraph(&driver,&mode,"C:\\Program Files\\CYuYan\\bin");mx=getmaxx();my=getmaxy();setbkcolor(BLUE);size=imagesize(0,0,32,32);if(size!=-1)buf=malloc(size);getimage(0,0,32,32,buf);}void my_ad_1(){intch1[]={100,120,100,300,120,300,120,200,200,200,200,280,180,280,180,300,220,30 0,220,180,120,180,120,140,300,140,300,100,280,120,100,120},ch2[]={240,100,280,300,300,300,260,100,240,100},ch3[]={280,160,264,280,284,280,300,160,280,160},j1[]={300,120,340,160,360,160,320,100,300,120},j2[]={300,180,340,220,360,220,320,160,300,180},j3[]={300,300,340,300,380,220,360,220,300,300},j4[]={380,120,380,140,420,140,420,280,360,280,360,300,500,300,500,280,440,280, 440,140,480,140,480,120,380,120};settextjustify(CENTER_TEXT,CENTER_TEXT);settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);setcolor(WHITE);sleep(2);outtextxy(320,200,"C Program Flash Creation");settextstyle(3,HORIZ_DIR,3);sleep(1);outtextxy(320,300,"Cheng Jiang,Electronic Class 1,Physic Department, GDUT");sleep(1);cleardevice();fillpoly(16,ch1);fillpoly(5,ch2);fillpoly(5,ch3);fillpoly(5,j1);fillpoly(5,j2);fillpoly(5,j3);fillpoly(12,j4);sleep(2);cleardevice();}void my_ad_2(){setfillstyle(SOLID_FILL,LIGHTBLUE);bar(0,0,150,my);bar(450,0,mx,my);setviewport(150,0,450,my,1);}void my_ad_3()int i,j;outtextxy(150,30,"Waitting...");setlinestyle(1,1,1);rectangle(0,60,450,90);setlinestyle(SOLID_LINE,1,THICK_WIDTH); jiang();for(i=0;i<10;i++){bar(30*i,60,30*(i+1),90);rectangle(30*i,60,30*(i+1),90);sleep(1);}clearviewport();outtextxy(150,240,"OK! Press [Enter]");getch();clearviewport();}void play(){int i,j;outtextxy(150,460,"grade:0 score: 0 ");while(1){randomize();num=random(19);De_B_xy();while(1){while(kbhit()){key=bioskey(0);Draw_Box();switch(key){case UP:getch();break;case DOWN:Ad_Box_y();break; case RIGHT:Ad_Box_x();break; case LEFT:Mi_Box_x();break; case ESC:close();break;default:ch_B_xy();break;}if(check()) break;}Draw_Box();if(check()) break;for(i=1;i<5;i++)Box_y[i]+=1;if(!kbhit())delay_n(10-grade);}rebuild();Draw_New();if(!life) break;}}void Draw_Box(){int i;for(i=1;i<5;i++)putimage(x[i]*30-1,30*y[i]-1,buf,COPY_PUT);if(!(y[1]&&y[2]&&y[3]&&y[0]))for(i=4;i<8;i++)putimage(30*i-1,0,buf,COPY_PUT);for(i=1;i<5;i++){x[i]=Box_x[i];y[i]=Box_y[i];bar(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30);rectangle(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30); }}void De_B_xy(){int i;switch(num){case 0: {Box_x[1]=Box_x[2]=Box_x[3]=Box_x[4]=0;Box_y[1]=0;Box_y[2]=1;Box_y[3]=2;Box_y[4]=3;} break;case 1: {Box_y[1]=Box_y[2]=Box_y[3]=Box_y[4]=0;Box_x[1]=0;Box_x[2]=1;Box_x[3]=2;Box_x[4]=3;} break;case 2: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=0;Box_x[4]=1;Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=1;} break;case 3: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1;Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break;case 4: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2;Box_y[1]=2;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break;case 5: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1;Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break;case 6: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break; case 7: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1;Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=2;} break; case 8: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=0;} break; case 9: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1; Box_y[1]=1;Box_y[2]=2; Box_y[3]=0;Box_y[4]=1;} break; case 10:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break; case 11:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break; case 12:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=0;Box_y[4]=1;} break; case 13:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break; case 14:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=0;Box_y[4]=0;} break; case 15:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=2;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break; case 16:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=0;Box_y[2]=0; Box_y[3]=0;Box_y[4]=1;} break; case 17:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=0;} break; case 18:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=1;} break; }for(i=1;i<5;i++)Box_x[i]+=4;}int check(){int i,p=0;for(i=1;i<5;i++)if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13) p=1;return(p);}void Ad_Box_y(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13) p=0;if(p)for(i=1;i<5;i++)Box_y[i]+=1;}void Ad_Box_x(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]][ Box_x[i]+1]||Box_x[i]>8) p=0;if(p)for(i=1;i<5;i++)Box_x[i]+=1;}void Mi_Box_x(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]][ Box_x[i]-1]||Box_x[i]<1) p=0;if(p)for(i=1;i<5;i++)Box_x[i]-=1;}void ch_B_xy(){int i,j,t,maxx=Box_x[1],maxy=Box_y[1];for(i=2;i<5;i++){if(maxx<Box_x[i])maxx=Box_x[i];if(maxy<Box_y[i])maxy=Box_y[i];}switch(num){case 0:num=num+1;break;case 1:num=num-1;case 2: ;break;case 3:num=num+1;break;case 4:num=num+1;break;case 5:num=num+1;break;case 6:num=num-3;break;case 7:num=num+1;break;case 8:num=num-1;break;case 9:num=num+1;break;case 10:num=num-1;break;case 11:num=num+1;break;case 12:num=num+1;break;case 13:num=num+1;break;case 14:num=num-3;break;case 15:num=num+1;break;case 16:num=num+1;break;case 17:num=num+1;break;case 18:num=num-3;break;}De_B_xy();for(i=1;i<5;i++){Box_x[i]=Box_x[i]+maxx-Box_x[4]; Box_y[i]=Box_y[i]+maxy-2;}}void rebuild(){int i,j,p,t[4]={0},k=0;for(i=1;i<5;i++)Box_xy[Box_y[i]][Box_x[i]]=1;for(i=0;i<15;i++){p=1;for(j=0;j<10;j++)if(!Box_xy[i][j])p=0;if(p)t[k]=i;k++;score+=10*k;}}for(k=0;k<4;k++){if(t[k]){for(i=t[k];i>0;i--)for(j=0;j<10;j++)Box_xy[i][j]=Box_xy[i-1][j]; }}for(i=0;i<10;i++)if(Box_xy[0][i])life=0;setfillstyle(1,4);for(i=0;i<4;i++)if(t[i])bar(0,30*t[i],300,30*(t[i]+1)); setfillstyle(1,9);for(i=1;i<5;i++){x[i]=0;y[i]=0;}grade=(score-score%100)/100 ; delay(30000);void Draw_New(){int i,j;char text[20];clearviewport();for(i=0;i<15;i++)for(j=0;j<10;j++)if(Box_xy[i][j]){bar(30*j,30*i,30*j+30,30*i+30);rectangle(30*j,30*i,30*j+30,30*i+30);}sprintf(text,"grade: %d score: %d",grade,score); gotoxy(100,460);outtextxy(150,460,text);}void close(){int i,j;for(i=14;i>=0;i--){for(j=0;j<10;j++){bar(30*j,30*i,30*(j+1),30*(i+1));rectangle(30*j,30*i,30*(j+1),30*(i+1));}delay(20000);}clearviewport();jiang();outtextxy(150,60,"game over");getch();closegraph();}void delay_n( int n){int i;for(i=0;i<n;i++) delay(50000);}void jiang(){int jx=0,jy=4;for(jx=0;jx<3;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));bar(30*jx,30*(jy+3),30*(jx+1),30*(jy+4));rectangle(30*jx,30*(jy+3),30*(jx+1),30*(jy+4)); jy++;}jy=14;for(jx=0;jx<4;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));jy--;}jy=4;for(jx=4;jx<9;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }jy=14;for(jx=3;jx<11;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }jx=6;for(jy=5;jy<15;jy++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }}。
C语⾔实现俄罗斯⽅块(转)原⽂地址如下:在图书馆看到⼀本书有俄罗斯⽅块的源程序⾃⼰当年也是俄罗斯⽅块的爱好者便想分析分析这个⼩游戏的源代码这⼏天有空就看了看发现读源码对编程领悟很有帮助读完深深的感觉到程序的确是好的数据结构加上好的算法这段程序定义了两个数据结构分别是//游戏底板结构,表⽰每个⼩⽅块所具有的属性struct BOARD{//当前状态,只有0或1,1表⽰次⼩⽅块已被占⽤int var;//⼩⽅块的颜⾊int color;}Table_board[Vertical_boxs][Horizontal_boxs];//游戏跳出的⽅块结构struct SHAPE{//⼀个字节等于8位,每四位来表⽰⼀个游戏⽅块的⼀⾏//如box[0]="0x88",box[1]="oxc0"表⽰的是://1000//1000//1100//0000//以此来表⽰游戏⽅块的各种形状char box[2];//游戏⽅块的颜⾊int color;//下⼀个游戏⽅块的编号int next;//这个next设计的也是相当妙啊};该源码的算法更确切的说是游戏的逻辑读完也是很有体会把握好⼤的系统强⼤的逻辑能⼒是必要的平时⾃⼰还是要再数据结构和算法这些⽅⾯加强学习、锻炼这段程序还有就是中断不是很理解还需要时间领悟⼀下下⾯贴⼀下我的程序注释这个游戏的层次描述:1预览功能2控制功能俄罗斯⽅块 3显⽰更新功能4分数更新功能5游戏帮助功能下⾯是源码:(该程序⽤到了TC的图形库,所以VC下是运⾏不了的,不过VC做代码编辑阅读⽐较⽅便,所以代码注释采⽤了VC下的//)//加载头⽂件#include <stdio.h>#include <stdlib.h>#include <dos.h>#include <graphics.h>//加载tc图形库//定义按键码#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_ESC 0x011b//设置中断号 1c:时钟中断时得到控制权,若要固定时间发⽣事件,可以通过修改1c中断来得到#define TIMER 0x1c//共有19种形态的游戏⽅块#define MAX_BOX 19//⽅块的边长为20#define BSIZE 20//显⽰游戏界⾯的左上⾓x坐标#define Sys_x 160//显⽰游戏界⾯的左上⾓y坐标#define Sys_y 25//⽔平⽅向的⽅块数量#define Horizontal_boxs 10//垂直⽅向的⽅块数量#define Vertical_boxs 15//第⼀个游戏⽅块的产⽣起始位置#define Begin_boxs_x Horizontal_boxs/2//前景⾊#define FgColor 3//背景⾊#define BgColor 0//右边状态栏的x坐标#define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46#define false 0#define true 1//移动的⽅向#define MoveLeft 1#define MoveRight 2#define MoveDown 3#define MoveRoll 4//保存当前游戏⽅块编号int current_box_numb;//保存游戏⽅块的当前坐标int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;//是否要产⽣新游戏⽅块int flag_newbox=false;//下落速度int speed=1;//游戏得分int score=0;//每等级所需要分数int speed_step=30;//指向原来时钟中断处理过程⼊⼝的中断处理函数指针关键字interrupt指定⼀个函数应该被看成⼀个中断函数void interrupt(*oldtimer)(void);//游戏底板结构,表⽰每个⼩⽅块所具有的属性struct BOARD{//当前状态,只有0或1,1表⽰次⼩⽅块已被占⽤int var;//⼩⽅块的颜⾊int color;}Table_board[Vertical_boxs][Horizontal_boxs];//游戏跳出的⽅块结构struct SHAPE{//⼀个字节等于8位,每四位来表⽰⼀个游戏⽅块的⼀⾏//如box[0]="0x88",box[1]="oxc0"表⽰的是://1000//1000//1100//0000//以此来表⽰游戏⽅块的各种形状char box[2];//游戏⽅块的颜⾊int color;//下⼀个游戏⽅块的编号int next;};//初始化游戏⽅块的内容,包括形状颜⾊和下⼀个游戏⽅块编号struct SHAPE shapes[MAX_BOX]={{0x88,0xc0,CYAN,1},{0xe8,0x0,CYAN,2},{0xc4,0x40,CYAN,3},{0x2e,0x0,CYAN,0},{0x44,0xc0,MAGENTA,5},{0x8e,0x0,MAGENTA,6},{0xc8,0x80,MAGENTA,7},{0xe2,0x0,MAGENTA,4},{0x8c,0x40,YELLOW,9},{0x6c,0x0,YELLOW,8},{0x4c,0x80,BROWN,11},{0xc6,0x0,BROWN,10},{0x4e,0x0,WHITE,13},{0x8c,0x80,WHITE,14},{0xe4,0x0,WHITE,15},{0x4c,0x40,WHITE,12},{0x88,0x88,RED,17},{0xf0,0x0,RED,16},{0xcc,0x0,BLUE,18},};//定时计数器变量unsigned int TimerCounter=0;//以下为函数声明void initialize(int,int,int,int);void interrupt newtimer(void);void SetTimer(void interrupt(*IntProc)(void));void KillTimer(void);void ShowScore(int);void ShowSpeed(int);void show_help(int,int);void setFullRow(int);int DelFullRow(int);void show_box(int,int,int,int);void EraseBox(int,int,int);void ErasePreBox(int,int,int);int MkNextBox(int);int MoveAble(int,int,int,int);//主函数void main(){int GameOver=0;int key,nextbox;int Currentaction=0;int gd=VGA,gm=VGAHI,errorcode;initgraph(&gd,&gm,"");errorcode=graphresult();if(errorcode!=grOk){printf("\nNotice:Graphics error: %s\n",grapherrormsg(errorcode));printf("Press any key to quit!");getch();exit(1);}setbkcolor(BgColor);setcolor(FgColor);randomize();SetTimer(newtimer);initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);//初始化nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); show_box(LeftWin_x,Curbox_y+320,nextbox,shapes[nextbox].color);show_help(Sys_x,Curbox_y+320);getch();while (1){Currentaction=0;flag_newbox=false;//int bioskey(int cmd)//完成直接键盘操作,cmd的值决定执⾏什么操作//cmd=0,返回下⼀个键盘键⼊的值//cmd=1,查询是否按下⼀个键,若按下⼀个键返回⾮零值,否则返回0if(bioskey(1)){key=bioskey(0);}else{key=0;}switch(key){case VK_LEFT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft;}break;case VK_RIGHT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight;}break;case VK_DOWN:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown;}elseflag_newbox=true;break;case VK_UP:if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll)){EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].next;Currentaction=MoveLeft;}break;case VK_ESC:GameOver=1;break;default:break;}if (Currentaction)//当前有动作就执⾏{show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); Currentaction=0;}if(flag_newbox)//按了向下键,但不能下移就产⽣新的游戏⽅块{ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(nextbox);show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)){show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); GameOver=1;}else{flag_newbox=false;}Currentaction=0;}else//⾃由下落{if(Currentaction==MoveDown||TimerCounter>(20-speed*2)){if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); }TimerCounter=0;}}if(GameOver){printf("game over,thank you! your score is %d",score);getch();break;}}getch();KillTimer();closegraph();}//******************************************************************** //显⽰帮助,提⽰⽤户如何进⾏游戏的相关操作//void show_help(int xs,int ys){char stemp[50];setcolor(15);//void far rectangle(int x0,int y0,int x1,int y1)//以(x0,y0)为左上⾓,(x1,x2)为右下⾓画⼀个矩形框rectangle(xs,ys,xs+239,ys+100);//sprintf()//将字串格式化到字符串sprintf(stemp," -Roll -Downwards");stemp[0]=24;stemp[8]=25;setcolor(14);//void far outtextxy(int x,int y,char far *text)//将⽂本输出到指定位置outtextxy(xs+40,ys+30,stemp);sprintf(stemp," -Turn Left -Turn Right");stemp[0]=27;stemp[13]=26;outtextxy(xs+40,ys+45,stemp);outtextxy(xs+40,ys+60,"Esc-Exit");setcolor(FgColor);}//******************************************************************* //对游戏界⾯的初始化void initialize(int x,int y,int m,int n){int i,j,oldx;oldx=x;for(j=0;j<n;j++){for(i=0;i<m;i++){Table_board[j][i].var=0;Table_board[j][i].color=BgColor;line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE;}y+=BSIZE;x=oldx;}Curbox_x=x;Curbox_y=y;flag_newbox=false;speed=1;score=0;ShowScore(score);ShowSpeed(speed);}//*************************************************************//显⽰当前⽤户的成绩void ShowScore(int score){int x,y;char score_str[5];setfillstyle(SOLID_FILL,BgColor);y=100;//确定⼀个以(x0,y0)为左上⾓,(x1,x2)为右下⾓的矩形窗⼝,再按规定图形和颜⾊填充bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);sprintf(score_str,"%3d",score);outtextxy(x,y,"SCORE");outtextxy(x,y+10,score_str);}//**********************************************************//显⽰当前下落速度void ShowSpeed(int speed){int x,y;char speed_str[5];setfillstyle(SOLID_FILL,BgColor);x=LeftWin_x;y=150;bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);sprintf(speed_str,"%3d",speed);outtextxy(x,y,"Level");outtextxy(x,y+10,speed_str);outtextxy(x,y+50,"Nextbox");}//**********************************************************//定义新的时钟中断处理函数void interrupt newtimer(void){//调⽤原来的例程(*oldtimer)();//全局计数器变量加1TimerCounter++;}//********************************************************//设置新的时钟中断处理void SetTimer(void interrupt (*IntProc)(void)){//获取中断号为TIMER的中断处理函数的⼊⼝地址oldtimer=getvect(TIMER);//设置新的时钟中断处理过程时,禁⽌所有中断disable();//将中断号为TIMER的中断处理函数⼊⼝地址改为IntProc()函数的⼊⼝地址setvect(TIMER,IntProc);//开启中断enable();}//*********************************************************//恢复原有的时钟中断处理过程void KillTimer(){disable();setvect(TIMER,oldtimer);enable();}//********************************************************//在(x,y)位置开始,⽤指定的颜⾊显⽰编号为box_num的游戏⽅块void show_box(int x,int y,int box_num,int color){int i,ii,ls_x=x;//指定的游戏⽅块不存在if(box_num<0||box_num>=MAX_BOX)box_num=MAX_BOX/2;//void far setfillstyle(int pattern,int color)//以pattern为填充模式以color为填充颜⾊对指定图形进⾏填充setfillstyle(SOLID_FILL,color);{int mask=128;//掩码,⽤于位运算//单个⽅块填充for(i=0;i<8;i++){if(i%4==0&&i!=0)//表⽰转到游戏⽅块的下⼀⾏了{y+=BSIZE;x=ls_x;}if((shapes[box_num].box[ii])&mask){bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);}x+=BSIZE;mask/=2;}y+=BSIZE;x=ls_x;}}//***************************************************************//清除(x,y)位置开始的编号为box_num的boxvoid EraseBox(int x,int y,int box_num){int mask=128,t_boardx,t_boardy,n,m;setfillstyle(SOLID_FILL,BgColor);for(n=0;n<4;n++){for (m=0;m<4;m++){if(((shapes[box_num].box[n/2])&mask)){bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE);line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE,y+n*BSIZE+BSIZE);line(x+m*BSIZE,y+n*BSIZE+BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE+BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); }mask/=2;if(mask==0)mask=128;}}}//*******************************************************//同EraseBox()void ErasePreBox(int x,int y,int box_numb){int mask=128,t_boardx,t_boardy,n,m;setfillstyle(SOLID_FILL,BgColor);for(n=0;n<4;n++){for(m=0;m<4;m++){if(((shapes[box_numb].box[n/2])&mask)){bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);}mask/=2;if(mask==0)mask=128;}}}//***************************************************************//将新图形的游戏⽅块放置在游戏板上,并返回此游戏⽅块号int MkNextBox(int box_numb){int mask=128,t_boardx,t_boardy,n,m;t_boardx=(Curbox_x-Sys_x)/BSIZE;t_boardy=(Curbox_y-Sys_y)/BSIZE;for(n=0;n<4;n++){for(m=0;m<4;m++){if(((shapes[current_box_numb].box[n/2])&mask)){//设置游戏⽅块Table_board[t_boardy+n][t_boardx+m].var=1;Table_board[t_boardy+n][t_boardx+m].color=shapes[current_box_numb].color;}mask=mask/2;if(mask==0)mask=128;}}setFullRow(t_boardy);//初始化坐标Curbox_x=Sys_x+Begin_boxs_x*BSIZE;Curbox_y=Sys_y;if(box_numb==-1)box_numb=rand()%MAX_BOX;//随机产⽣游戏⽅块current_box_numb=box_numb;flag_newbox=false;return (rand()%MAX_BOX);}//***********************************************************//⽤于找到满⾏,参数t_boardy表⽰当前的游戏⽅块号void setFullRow(int t_boardy){int n,full_numb=0,top=0;//top保存当前游戏主板在消除满⾏后的最⾼点,⽤于游戏主板的重绘register m;//寄存器类型,存取速度快for(n=t_boardy+3;n>=t_boardy;n--){if(n<0||n>=Vertical_boxs)continue;for(m=0;m<Horizontal_boxs;m++){if(!Table_board[n+full_numb][m].var)//发现有⼀个是空的就跳过break;}if(m==Horizontal_boxs)//找到满⾏{if(n==t_boardy+3)top=DelFullRow(n+full_numb);//清除该⾏,并保存最⾼点elseDelFullRow(n+full_numb);full_numb++;//保存满⾏的⾏数}}if(full_numb)//存在满⾏{int oldx,x=Sys_x,y=BSIZE*top+Sys_y;oldx=x;score=score+full_numb*10;for(n=top;n<t_boardy+4;n++){if(n>=Vertical_boxs)continue;//重绘游戏主板for(m=0;m<Horizontal_boxs;m++){if(Table_board[n][m].var){setfillstyle(SOLID_FILL,Table_board[n][m].color);}elsesetfillstyle(SOLID_FILL,BgColor);bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE;}y+=BSIZE;x=oldx;}ShowScore(score);if(speed!=score/speed_step){speed=score/speed_step;ShowSpeed(speed);}elseShowSpeed(speed);}}//************************************************************//处理删除⾏,参数y指明具体哪⼀⾏为满⾏int DelFullRow(int y){int n,top=0;register m,totoal;for (n=y;n>=0;n--){totoal=0;for(m=0;m<Horizontal_boxs;m++){if(!Table_board[n][m].var)totoal++;//没有⽅格,对计数器加1//上⾏不等于下⾏就把上⾏传给下⾏,此处为程序优化部分,也可不优化 if(Table_board[n][m].var!=Table_board[n-1][m].var){Table_board[n][m].var=Table_board[n-1][m].var;Table_board[n][m].color=Table_board[n-1][m].color;}}//发现上⾯有连续的空⾏,提前结束if (totoal==Horizontal_boxs){top=n;break;}}return top;//返回最⾼点}//********************************************************8//判断⽅块是否可以移动,(x,y)为当前游戏⽅块位置,box_numb为游戏⽅块号,direction为动作标识int MoveAble(int x,int y,int box_numb,int direction){int n,m,t_boardx,t_boardy;int mask;if(direction==MoveLeft)//如果向左移动{mask=128;x-=BSIZE;t_boardx=(x-Sys_x)/BSIZE;t_boardy=(y-Sys_y)/BSIZE;for(n=0;n<4;n++){for(m=0;m<4;m++){if((shapes[box_numb].box[n/2])&mask){if((x+BSIZE*m)<Sys_x)//碰到最左边return false;else if(Table_board[t_boardy+n][t_boardx+m].var)//左移⼀个单位后,与游戏主板冲突return false;}mask/=2;if(mask==0)mask=128;}}return true;}else if(direction==MoveRight)//右移动{x+=BSIZE;t_boardx=(x-Sys_x)/BSIZE;t_boardy=(y-Sys_y)/BSIZE;mask=128;for(n=0;n<4;n++){for(m=0;m<4;m++){if((shapes[box_numb].box[n/2])&mask){if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs))//碰到最右边return false;else if(Table_board[t_boardy+n][t_boardx+m].var)//与游戏主板冲突return false;}mask/=2;if(mask==0)mask=128;}}return true;}else if(direction==MoveDown)//下移动{mask=128;y+=BSIZE;t_boardx=(x-Sys_x)/BSIZE;t_boardy=(y-Sys_y)/BSIZE;for(n=0;n<4;n++){for(m=0;m<4;m++){if((shapes[box_numb].box[n/2])&mask){if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs)||Table_board[t_boardy+n][t_boardx+m].var)//碰到最下边或向下有冲突 {flag_newbox=true;break;}}mask/=2;if(mask==0)mask=128;}}if(flag_newbox)return false;elsereturn true;}else if(direction==MoveRoll)//旋转{mask=128;t_boardx=(x-Sys_x)/BSIZE;t_boardy=(y-Sys_y)/BSIZE;for(n=0;n<4;n++){for(m=0;m<4;m++){if((shapes[box_numb].box[n/2])&mask){if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs))//碰到最下边return false;if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs))//碰到最左边return false;if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs))//碰到最右边return false;else if (Table_board[t_boardy+n][t_boardx+m].var)//向下有冲突{return false;}}mask/=2;if(mask==0)mask=128;}}return true;}elsereturn false;}。
俄罗斯方块变形c语言在C语言中实现俄罗斯方块游戏是一项复杂的任务,涉及到图形界面、游戏逻辑和事件处理等多个方面。
以下是一个简化版的俄罗斯方块游戏示例,使用字符在控制台中显示游戏界面。
c复制代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#define WIDTH 20#define HEIGHT 10typedef enum {BLOCK_EMPTY,BLOCK_I,BLOCK_J,BLOCK_L,BLOCK_O,BLOCK_S,BLOCK_Z} BlockType;typedef struct {BlockType type;int x;int y;} Block;Block board[WIDTH][HEIGHT];BlockType currentBlock = BLOCK_I;int rotation = 0;int x = WIDTH / 2;int y = HEIGHT - 1;void drawBoard() {for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < HEIGHT; j++) { char ch = ' ';switch (board[i][j].type) {case BLOCK_EMPTY:ch = '.';break;case BLOCK_I:ch = 'I';break;case BLOCK_J:ch = 'J';break;case BLOCK_L:ch = 'L';break;case BLOCK_O:ch = 'O';break;case BLOCK_S:ch = 'S';break;case BLOCK_Z:ch = 'Z';break;}printf("%c", ch);}printf("\n");}}void updateBoard() {for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {if (board[i][j].type != BLOCK_EMPTY) {board[i][j].y--; // Move block down one row.} else { // Place new block.switch (currentBlock) { // Place based on current block type.case BLOCK_I: // Place full I-block.board[i][j].type = BLOCK_I; // Column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column j Y n Row Y j Columns n - j 1 -- i 1 i - i j Row i Row i - 1 i Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i - - - - - - - - - - - - - - -。
#define LEFT 0x4b#define RIGHT 0x4d#define DOWN 0x50#define CHANGE 0x20#define ESC 0x1b#define INTR 0x1C#define DefaultX 5#define DefaultY 1static unsigned counter=0;static unsigned shape[7][4][4][4]={{{{0,1,1,0},{0,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,1,1,0},{0,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,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}, {{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}}, {{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}, {{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}}, },{{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}}, {{0,1,0,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}, {{0,0,0,0},{1,1,1,0},{0,1,0,0},{0,0,0,0}}, {{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, },{{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, {{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}, {{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}, {{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}, },{{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}, {{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}}, {{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}, {{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}}, },{{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}}, {{0,0,0,0},{1,1,1,0},{1,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,1,0},{1,1,1,0},{0,0,0,0}},},{{{0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}},{{0,0,0,0},{1,0,0,0},{1,1,1,0},{0,0,0,0}},{{1,1,0,0},{1,0,0,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}},},};unsigned back[22][14] ={{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,0,0,0,0,0,0,0,0,0,0,1,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1}};char ShapeColor[7]={8,10,11,12,13,14,15};char DigitalShape[10]={128+119,3,62,31,128+75,128+93,128+125,19,128+127,128+95}; char ZodiacBack[11]={4,6,12,13,11,10,2,3,9,1,8};char ZodiacSoft[18][14]={{0,0,0,0,96,0,0,0,0,0,0,0,60,0},{255,248,0,0,96,0,0,0,0,248,0,0,124,0},{255,248,0,0,97,128,0,0,3,248,0,0,192,0},{0,112,0,0,97,128,0,0,7,0,0,1,128,48},{0,224,0,0,96,0,0,0,14,0,0,1,128,48},{1,192,0,0,96,0,0,0,12,0,0,1,128,48},{3,128,120,15,97,128,240,60,12,0,15,15,249,255},{7,0,252,31,225,131,248,127,14,0,31,143,249,255},{7,1,142,48,225,135,24,227,7,240,49,193,128,48},{14,3,134,96,97,142,24,192,3,252,112,193,128,48},{28,3,6,96,97,140,25,192,0,28,96,193,128,48},{56,3,6,96,97,140,25,128,0,6,96,193,128,48},{56,3,6,96,97,140,25,128,0,6,96,193,128,48},{120,3,6,96,97,140,25,128,0,6,96,193,128,48},{224,1,140,48,225,142,25,195,24,14,49,129,128,48},{255,249,252,63,225,135,252,255,28,28,63,129,128,48},{255,248,240,15,97,131,236,60,15,248,30,1,128,48},{0,0,0,0,0,0,0,0,7,224,0,1,128,0}};unsigned long TotalMark=0;unsigned int Erasered=0,ETimes=0;int Speed=0;int CEr=0;int NumOfLev[5]={0,0,0,0,0};int TimeDelay[10]={21,18,17,15,13,11,9,7,5,3};char NewShape[2];unsigned PerOnce[4];void interrupt ( *oldhandler)(__CPPARGS);void interrupt handler(__CPPARGS){++counter;oldhandler();}//******************************************************* void DrawBackground(){//setlinestyle}void DrawDigital(int x,int y,int a){int i=7;setcolor(((DigitalShape[a]>>i)&1)*7+4);//printf("%d",(DigitalShape[a]>>i)&1);i--;line(x,y+1,x,y+15);line(x+1,y+2,x+1,y+14);line(x+2,y+3,x+2,y+13);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x,y+17,x,y+31);line(x+1,y+18,x+1,y+30);line(x+2,y+19,x+2,y+29);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x,y+17,x,y+31);line(x+1,y+18,x+1,y+30);line(x+2,y+19,x+2,y+29);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x+1,y,x+16,y);line(x+2,y+1,x+15,y+1);line(x+3,y+2,x+14,y+2);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x+2,y+15,x+15,y+15);line(x+1,y+16,x+16,y+16);line(x+2,y+17,x+15,y+17);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x+3,y+30,x+14,y+30);line(x+2,y+31,x+15,y+31);line(x+1,y+32,x+16,y+32);setcolor(((DigitalShape[a]>>i)&1)*7+4);i--;line(x+15,y+3,x+15,y+13);line(x+16,y+2,x+16,y+14);line(x+17,y+1,x+17,y+15);setcolor(((DigitalShape[a]>>i)&1)*7+4);line(x+15,y+19,x+15,y+29);line(x+16,y+18,x+16,y+30);line(x+17,y+17,x+17,y+31);}//******************************************************* void ArtClear(){for(int i=480;i>=0;i-=2){setcolor(3);line(0,i-6,639,i-6);setcolor(9);line(0,i-4,639,i-4);setcolor(1);line(0,i-2,639,i-2);setcolor(getbkcolor());line(0,i,639,i);delay(1);}for(i=1;i<480;i+=2){setcolor(3);line(0,i+6,639,i+6);setcolor(9);line(0,i+4,639,i+4);setcolor(1);line(0,i+2,639,i+2);setcolor(getbkcolor());line(0,i,639,i);delay(1);}}//******************************************************* void end(){for(int j=0;j<4;j++){for(int i=j;i<480;i+=4){setcolor(3);line(0,i+8,639,i+8);setcolor(9);line(0,i+4,639,i+4);setcolor(1);line(0,i,639,i);setcolor(getbkcolor());line(0,i,639,i);delay(1);}delay(5);}setcolor(YELLOW);outtextxy(260,200,"[ Game Over ]");gotoxy(14,16);printf("This freeware is written by Daniel.Qu ZodiacSoft 2000"); gotoxy(12,17);printf("Please e-mail to swami@ or visit my homepage at"); gotoxy(12,18);printf(" if you have question.");gotoxy(14,20);printf("I will soon provide something new,please wait...");gotoxy(14,22);printf("We hold these truths to be self-evident,that all codes"); gotoxy(12,23);printf("are created FREE.");getch();clrscr();closegraph();exit(0);}//******************************************************* void ShowTitle(){int gdriver=DETECT,gmode,errorcode,i,j,k;initgraph(&gdriver,&gmode,"");errorcode=graphresult();if (errorcode!=grOk){printf("Graphics error: %s\n\007",grapherrormsg(errorcode));exit(1);}setbkcolor(9);//This line needs to be changedfor(i=0;i<11;i++){setcolor(ZodiacBack[i]);line(200,i*8+100,440,i*8+100);}delay(1000);for(j=0;j<17;j++)for(i=0;i<11;i++){setcolor(ZodiacBack[(i+j)%16]);line(200,i*8+100,440,i*8+100);delay(4);}for(j=0;j<18;j++){for(i=0;i<14;i++){for(k=7;k>=0;k--)if((ZodiacSoft[j][i]>>k)&1){putpixel(i*8-k+271,j+122,14);}}delay(10);}for(j=17;j>=0;j--){for(i=0;i<14;i++)for(k=7;k>=0;k--){if((ZodiacSoft[j][i]>>k)&1)putpixel(i*8-k+271,158-j,5);}delay(10);}setcolor(15);outtextxy(295,171,"Present");getch();ArtClear();}//******************************************************* void DrawShape(int x,int y,int color){//if(x<2||x>12||y>19)// return;setcolor(color);/*line(x<<4,y<<4,x<<4,(y<<4)+14);line(x<<4,(y<<4)+14,(x<<4)+14,(y<<4)+14);line((x<<4)+14,(y<<4)+14,(x<<4)+14,y*16);line((x<<4)+14,y<<4,x<<4,y*16);line((x<<4)+1,y<<4,(x<<4)+1,(y<<4)+14);line((x<<4)+1,(y<<4)+13,(x<<4)+14,(y<<4)+13);line((x<<4)+13,(y<<4)+13,(x<<4)+13,(y<<4)+1);line((x<<4)+13,(y<<4)+1,x<<4,(y<<4)+1); */for(int i=0;i<15;i++)line(x<<4,(y<<4)+i,(x<<4)+14,(y<<4)+i);setcolor(8);line((x<<4)+15, y<<4)+1,(x<<4)+15,(y<<4)+15);line((x<<4)+1,(y<<4)+15,(x<<4)+15,(y<<4)+15);setcolor(color-8);line((x<<4)+2,(y<<4)+2,(x<<4)+12,(y<<4)+2);line((x<<4)+2,(y<<4)+2,(x<<4)+2,(y<<4)+12);}//******************************************************* void DrawNull(int x,int y){setcolor(getbkcolor());for(int i=0;i<16;i++)line(x<<4,(y<<4)+i,(x<<4)+15,(y<<4)+i);}//******************************************************* void show(int x,int y,int CurrentShape,int Status){int temp;for(int i=0;i<20;i++)for(int j=2;j<12;j++){if(back[i][j]==1)DrawShape(6+j,4+i,8);elseDrawNull(6+j,4+i);} //no matter what the status be,I will draw the backgroundfor(int l=0;l<4;l++)for(int p=0;p<4;p++){if(l+x<2||x+l>11||p+y>19)continue;//if(shape[CurrentShape][Status][p][l]+back[y+p][x+l]==1)// DrawShape(3+l+x,3+p+y,8+CurrentShape);//else//cout<<''O'';// DrawNull(3+j,3+i);if(shape[CurrentShape][Status][p][l]==1)DrawShape(6+l+x,4+p+y,ShapeColor[CurrentShape]);if(back[y+p][x+l]==1)DrawShape(6+l+x,4+p+y,8);}}//******************************************************* void DrawScore(){int temp=TotalMark;for(int i=0;i<7;i++){DrawDigital(477-i*20,65,temp%10);temp/=10;}temp=Erasered;for(i=0;i<4;i++){DrawDigital(491-i*20,111,temp%10);temp/=10;}if(Erasered==0)return;for(i=1;i<5;i++){setfillstyle(1,8);bar(378,163+i*14,508,170+i*14);setfillstyle(1,5);bar(378,163+i*14,378+130*NumOfLev[i]/ETimes,170+i*14);}DrawDigital(466,293,Speed);return;}//******************************************************* int CreateNewShape(){NewShape[1]=NewShape[0];NewShape[0]=rand()%7;setfillstyle(1,0);bar(447,240,514,288);for(int l=0;l<4;l++)for(int p=0;p<4;p++)if(shape[NewShape[0]][0][p][l]==1)DrawShape(28+l,15+p,ShapeColor[7]);return NewShape[1];}//******************************************************* int Possible(int x,int y,int CurrentShape,int Status){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[CurrentShape][Status][i][j]+back[y+i][x+j]==2)//this line can also write as the following type://if(shape[CurrentShape][Status][i][j]&&back[y+i][x+j])return 0;}}return 1;}//*******************************************************void GoLeft(int&x,int&y,int&CurrentShape,int&Status){if(Possible(x-1,y,CurrentShape,Status))x--;show(x,y,CurrentShape,Status);}//******************************************************* void GoRight(int&x,int&y,int&CurrentShape,int&Status){if(Possible(x+1,y,CurrentShape,Status))x++;show(x,y,CurrentShape,Status);}//******************************************************* void GoDown(int&x,int&y,int&CurrentShape,int&Status){int AllAreOne=1,temp=0;if(Possible(x,y+1,CurrentShape,Status)){y++;show(x,y,CurrentShape,Status);return;}TotalMark+=3*CurrentShape;for(int i=0;i<4;i++)for(int j=0;j<4;j++)back[i+y][j+x]+=shape[CurrentShape][Status][i][j];for(int r=1;r<20;r++){for(int l=2;l<13;l++){if(back[r][l]==0)AllAreOne=0;}if(AllAreOne==1){for(int rr=r;rr>0;rr--)for(int ll=2;ll<13;ll++)back[rr][ll]=back[rr-1][ll];Erasered++;CEr++;temp++;}AllAreOne=1;}CurrentShape=CreateNewShape();x=DefaultX;y=DefaultY;Status=0;NumOfLev[temp]++;TotalMark+=5*temp;show(x,y,CurrentShape,Status);counter=0;if(!Possible(x,y,CurrentShape,Status)){getch();end();}if(CEr>=30){Speed=(Speed+1)%10;CEr/=30;}if(temp)ETimes++;DrawScore();return;}void ChageShape(int&x,int&y,int&CurrentShape,int&Status){if(Possible(x,y,CurrentShape,(Status+1)%4))Status=(Status+1)%4;show(x,y,CurrentShape,Status);}//******************************************************* void DrawFace(){int temp;setcolor(15);line(351,59,519,59);line(351,60,518,60);line(351,59,351,156);line(352,59,352,155);setcolor(7);line(518,61,518,154);ine(519,60,519,154);line(353,155,519,155);line(352,156,519,156);setcolor(8);for(int i=61;i<155;i++)line(353,i,517,i);setcolor(7);line(427,106,512,106);line(428,107,511,107);line(427,106,427,147);line(428,106,428,146);setcolor(15);line(512,106,512,147);line(511,107,511,146);line(428,146,511,146);line(427,147,512,147);settextstyle(DEFAULT_FONT,HORIZ_DIR,1); setcolor(14);outtextxy(357,119,"Erasered");outtextxy(370,130,"Level:");setcolor(15);line(352,167,519,167);line(352,168,518,168);line(352,169,352,407);line(353,169,353,406);setcolor(7);line(519,167,519,407);line(518,168,518,406);line(352,407,519,407);line(353,406,519,406);line(524,55,89,55); //outter border 1stline(524,55,524,411);line(89,411,524,411);line(89,55,89,411);line(524,56,89,56); //outter border 2ndline(525,55,525,411);line(89,410,524,410);line(88,55,88,411);setfillstyle(8,7);bar(94,59,336,406);//setfillstyle(1,3);//bar(128,78,296,386);for(i=0;i<8;i++)DrawDigital(357+i*20,65,0);for(i=0;i<4;i++)DrawDigital(431+i*20,111,0);setfillstyle(1,8);setcolor(12);for(i=0;i<4;i++){temp=i+''1'';outtextxy(364,177+14*i,(char*)&temp);bar(378,177+i*14,508,184+i*14);}setcolor(14);outtextxy(366,250,"Next Shape");setcolor(10);outtextxy(366,294,"Current");outtextxy(382,309,"Level");setcolor(6);outtextxy(366,334,"Message:");bar(362,348,509,398);DrawDigital(466,293,Speed);}//******************************************************* void WannaQuit(){int choise=0,temp;setfillstyle(1,8);bar(362,348,509,398);setcolor(15);outtextxy(378,355,"Are you sure to");outtextxy(368,368,"quit game?");outtextxy(410,388,"Y es");outtextxy(470,388,"No");setcolor(14);circle(399,392,4);while((temp=bioskey(0))!=7181){if(temp==19200){setcolor(8);circle(459,392,4);choise=0;setcolor(14);circle(399,392,4);}if(temp==19712){setcolor(8);circle(399,392,4);choise=1;setcolor(14);circle(459,392,4);}}if(choise==0){end();}setfillstyle(1,8);bar(362,348,509,398);return;}//******************************************************* void main(){ShowTitle();unsigned c;int CurrentShape,x=6,y=0,Status=0;oldhandler=getvect(INTR);setvect(INTR,handler);randomize();NewShape[0]=rand()%7;DrawFace();CurrentShape=CreateNewShape();show(x,y,CurrentShape,Status);while(1){if(kbhit()){c=getch();if(c==0)c=getch();switch(c){case ''s'' :Speed=(Speed+1)%10;DrawDigital(466,293,Speed);break; case DOWN :GoDown(x,y,CurrentShape,Status);break;case LEFT :GoLeft(x,y,CurrentShape,Status);break;case RIGHT :GoRight(x,y,CurrentShape,Status);break;case CHANGE :ChageShape(x,y,CurrentShape,Status);break;case ESC :WannaQuit();}}if((counter%=TimeDelay[Speed])==(TimeDelay[Speed]-1)){GoDown(x,y,CurrentShape,Status);counter=0;}}}//*******************************************************。
//俄罗斯方块#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "windows.h"#include "time.h"#define N 17#define M 13#define K 19int s[N][M]={{0,0,0},{0,0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, {1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,0,0,1,1}};/*当前状态*/inta[K][3][3]={{0,2,0,2,2,2},{0,2,0,2,2,0,0,2},{0,2,0,0,2,2,0,2},{2,2,2,0,2},{2,2,2,0,0,2 ,0},{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{0,0,2,0,0,2,0,2,2},{0,0,2,2,2,2},{2,2,2,2,0,0}, {2,2,0,0,2,0,0,2,0},{0,2,2,0,2,0,0,2,0},{{2},{2},{2}},{2,2,2},{2,2,0,2,2,0},{2,0,0,2,2,0,0,2},{0,0,2,0,2,2,0,2},{2,2,0,0,2,2},{0,2,2,2,2,0}};void Disp(){int i,j;for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%c",s[i][j]?48+s[i][j]:' ');printf("┃\n");}printf("━━━━━━━━");printf("\n\n操作说明:A-->左移,D-->右移,W-->变形,ESC-->退出\n");}void Down(){int i,j,k;for(j=0;j<M;j++)if(s[N-1][j]==2)break;/*判断是否在下边界*/if(j<M)/*若方块在下边界则将方块由2变1;因为用两种不同的符号,容易判断方块是否“着陆”及左右移动时,是否碰壁*/{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)//判断第i行是否有空格if(s[i][j]==0)break;if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)//?for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=0;i<N-1;i++){for(j=0;j<M;j++)if(s[i][j]==2)if(s[i+1][j]!=0&&s[i+1][j]!=2)break;/*方块下方不空说明触到1了退出内循环*/ if(j<M)break;/*方块下方不空退出外循环*/}if(i<N-1||j<M){for(i=0;i<N;i++)//若已触到1则将方块由 2变1*/for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=N-1;i>=0;i--)for(j=0;j<M;j++)if(s[i][j]==2)s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/}void Right(){int i,j;for(i=0;i<N;i++)if(s[i][M-1]==2)return;/* 已经在右边界退出 */for(i=0;i<N;i++)for(j=0;j<M-1;j++)if(s[i][j]==2)if(s[i][j+1]!=0&&s[i][j+1]!=2)return;/* 方块右方不空,即方块右边有1 退出 */ for(j=M-2;j>=0;j--)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j+1]=s[i][j],s[i][j]=0;/* 方块右移 */}void Left(){int i,j;for(i=0;i<N;i++)if(s[i][0]==2)return;/* 已经在左边界退出 */for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)if(s[i][j-1]!=0&&s[i][j-1]!=2)return;/* 方块左方不空退出 */ for(j=1;j<M;j++)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j-1]=s[i][j],s[i][j]=0;/* 方块左移 */}int Have()/*判断是否有可移动方块,没有返回1,否则返回0*/{int i,j;for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)return 0;return 1;}int Add()/*随机生成方块*/{int t,x;/*生成两随机数t和x分别作为第t种方块和第x位置出现*/int i,j;srand((unsigned int)time(NULL));t=rand()%K;x=rand()%(M-3);if(x<0) x=-x%(M-3);//?for(i=0;i<3;i++)for(j=x;j<x+3;j++)//把生成的方块存到初状态中s[i][j]=a[t][i][j-x];}void bianxing(int t,int n){int i,j,k,m,x,y;for(i=0;i<N;i++)//首先扫描是否有移动方块;及方块变形前的位置“行、列”{m=-1;for(j=0;j<M;j++)if(s[i][j]==2){m=i,x=j,y=i;break;//y,x记录所在行、列;并退出内循环}if(m!=-1)//m!=-1证明有移动方块break;//退出外循环}if(m!=-1)//m!=-1证明有移动方块{if(x+3>M||y+3>N) return;//判断是否有可变形空间,没有就返回for(i=y;i<y+3;i++)//判断是否有3*3的变形空间,没有就返回for(j=x;j<x+3;j++)if(s[i][j]==1) return;/*擦除当前移动方块;因为上面判断3*3的移动空间,是从上面开始扫描,遇到第一个小格子时,依他为基点向右下方扫描是否有3*3的空间;显然只进行下面的变形--存储是不行的;如:002002022-->2220020时,显然前面的方格倒数第二个2,留在了3*3变形空间的外面,输出图形将多一个格子,所以要在变形-->存储操作前进行擦除操作*/for(i=y;i<y+3;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=0;//变形并把它存储到当前状态中if(t<=3&&t>=0){static int h1;if(h1>n)h1=0;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h1][i-y][j-x];h1++;}else if(t<=11&&t>=4){static int h2=4;if(h2>n)h2=4;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h2][i-y][j-x];h2++;}else if(t<=13&&t>=12){static int h3=12;if(h3>n)h3=12;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h3][i-y][j-x];h3++;}else if(t<=18&&t>=15){static int h4=15;if(h4>n)h4=0;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h4][i-y][j-x];h4++;}}void main(){char c;int i=0,t;char str[][50]={" ((`'-\"``\"\"-'`))"," ) - - ( "," / (o _ o) \ "," \ ( 0 ) /"," _'-.._'='_..-'_ "," /`;#'#'#.-.#'#'#;`\ "," \_)) '#' ((_/ "," #. ☆ Game ☆ # "," '#. Over! .#' "," / '#. .#' \ "," _\ \'#. .#'/ /_"," (((___) '#' (___) ",""};system("color 0a");while(1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/{if(!kbhit())/*kbhit用来判断是否有按键输入,若有按键返回非零值,否则返回零;没有按键时c被赋予一个“非操作键值”,它将一直下移;有按键是调用getch函数,读取键值*/c='2';elsec=getch();if(c=='p')//停止键;按任意键可解除停止getch();system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/if(Have())//Have()判断是否有可移动方块,没有返回1,否则返回0t=Add();switch(c){case 'a':Left();break; /*左移*/case 'd':Right();break; /*右移*/case 27: system("pause");return; /*按Esc(=27)另存后退出*/default:;}//变形if(c=='w')if(t>=0&&t<=3) bianxing(t,3);else if(t>=4&&t<=11) bianxing(t,11);else if(t==12||t==13) bianxing(t,13);else if(t>=15&&t<=18) bianxing(t,18);c='2';Down();//判断方块的停、走和消除//判断顶层是否有1 有:游戏结束for(i=0;i<M;i++)if(s[0][i]==1){system("CLS");i=0;while(1){if(strlen(str[i])==0)break;printf("%s\n",str[i++]);}system("pause");exit(0);}Disp();//刷屏Sleep(500);/*睡眠ms,windows.h*/}}***********************************************************。
#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef__cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸*/#define BGCOLOR 7 /* 背景着色*/#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI 3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril[22][16]; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*//* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,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},{1,1,0,0,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}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);}/*初始化图形模试*/void init(int gdrive,int gmode){int errorcode;initgraph(&gdrive,&gmode,"e:\\tc");errorcode=graphresult();if(errorcode!=grOk){printf("error of: %s",grapherrormsg(errorcode));exit(1);}}/* 在图形模式下的清屏*/void cls(){setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);}/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color){setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);}/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor){int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR){setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }}/*游戏中出现的文字*/void txt(int a,int b,char *txt,int font,int color){setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);}/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/* 当前方块的绘制*/void funbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); }/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);}/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)){oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a){int i,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);}/*消掉所有都有最小方块的行*/ void delete(){int i,j,zero,delgx=0;char *nm="00000";for(i=1;i<21;i++){zero=0;for(j=1;j<15;j++)if(gril[j]==0)zero=1;if(zero==0){delcol(i);delgx++;}}num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,"Number:",1,15);txt(456,193,nm,1,15);}/*时间中断结束*/void KillTimer(){disable();setvect(TIMER,oldhandler); enable();}/* 测试当前方块是否可以向下落*/ int downok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i+1][row+j])k=0;return(k);/* 测试当前方块是否可以向左行*/int leftok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j-1])k=0;return(k);}/* 测试当前方块是否可以向右行*/int rightok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j+1])k=0;return(k);}/* 测试当前方块是否可以变形*/int upok(){int i,j,k=1,a[4][4];for(i=0;i<4;i++)for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];for(i=3;i>=0;i--)for(j=3;j>=0;j--)if(a[j] && gril[col+i][row+j])k=0;return(k);}/*当前方块落下之后,给屏幕坐标作标记*/ void setgril(){int i,j,a[4][4];funbox(0,0,minboxcolor,0);for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j])gril[col+i][row+j]=1;col=1;row=7;}/*游戏结束*/void gameover(){int i,j;for(i=20;i>0;i--)for(j=1;j<15;j++)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);}/*按键的设置*/void call_key(int keyx){switch(keyx){case VK_DOWN: { /*下方向键,横坐标加一。
#include <stdlib.h>#include <graphics.h>#include <bios.h>#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#define MAXY 30#define BACKCOLOR BLACK#define WINX 50#define WINY 470#define GAP 6#define AREAX (WINX+GAP)#define AREAY (WINY-GAP)#define BOXW 15int oldarea[MAXY+1][MAXX];int area[MAXY+1][MAXX];int actW,actH,actX,actY;int curX,curY,curColor,curW,curH;int newX,newY,newColor,newW,newH; int active;int box[4][4];int FORCOLOR;int MESSAGE;int BOX[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}, {0,1,0,0}, {0,0,0,0}, {0,0,0,0}},{{1,1,0,0}, {0,1,1,0}, {0,0,0,0}, {0,0,0,0}},{{0,1,1,0}, {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();closegraph();}void getMessage(){if(MESSAGE) return;if(timeCome()){MESSAGE=mADOWN; return;}if(bioskey(1)){MESSAGE=bioskey(0)>>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){moveDown(); draw();}MESSAGE=mLINE;}int timeCome(){static long tm, old;tm=biostime(0,tm);if(tm-old<TIMEINT) return 0;else{old=tm; return 1;}}void init(){int i,j,x1,y1,x2,y2;int driver=DETECT, mode=0; randomize();registerbgidriver(EGAVGA_driver);initgraph(&driver,&mode,"");cleardevice();setfillstyle(SOLID_FILL,BLUE);bar(0,0,639,479);x1=AREAX;y1=AREAY-BOXW*MAXY;x2=AREAX+MAXX*BOXW;y2=AREAY;rectangle(--x1,--y1,++x2,++y2);setfillstyle(SOLID_FILL,BLACK);bar(++x1,++y1,--x2,--y2);y1=AREAY-MAXY*BOXW; y2=AREAY; setcolor(DARKGRAY);for(i=0;i<MAXX;i++){x1=AREAX+i*BOXW;line(x1,y1,x1,y2);}x1=AREAX; x2=x1+MAXX*BOXW;for(j=0;j<MAXY;j++){y1=AREAY-j*BOXW;line(x1,y1,x2,y1);}for(j=0;j<MAXY;j++)for(i=0;i<MAXX;i++)area[j][i]=oldarea[j][i]=0;actX=0; actY=0; actW=MAXX-1; actH=MAXY-1; draw();MESSAGE=mGEN;}int genBox(){int i,j,boxidx;boxidx=random(7); FORCOLOR=random(7)+1; for(j=0;j<4;j++)for(i=0;i<4;i++)box[j][i]=BOX[boxidx][j][i];curW=getW(); curH=getH();curX=(MAXX+curW)/2;if(curX+curW>=MAXX)curX=MAXX-1-curW;curY=MAXY-1-curH;newX=curX; newY=curY; actX=curX;actY=curY;actW=newW=curW; actH=newH=curH;active=1;if(collision(box)) return 0;putNewBox();draw(); MESSAGE=0;return 1;}void lineFull(){int row,col, rowEnd,full,i,j;rowEnd=newY+newH;if(rowEnd>=MAXY-1) rowEnd=MAXY-2;for(row=newY; row<=rowEnd;){full=1;for(col=0;col<MAXX;col++)if(!area[row][col]){full=0; break;}if(!full){++row; continue;}for(j=row; j<MAXY-1;j++)for(i=0;i<MAXX;i++)area[j][i]=area[j+1][i];actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;draw(); rowEnd--;}MESSAGE=mGEN;}void draw(){int row,col,x1,y1,x2,y2;for(row=actY;row<=actY+actH;row++)for(col=actX;col<=actX+actW;col++)if(area[row][col]!=oldarea[row][col]){if(area[row][col]==0)setfillstyle(SOLID_FILL,BACKCOLOR);elsesetfillstyle(SOLID_FILL,FORCOLOR);x1=AREAX+col*BOXW; x2=x1+BOXW;y1=AREAY-(row+1)*BOXW; y2=y1+BOXW;bar(++x1,++y1,--x2,--y2);oldarea[row][col]=area[row][col];}MESSAGE=0;}int moveLeft(){newX=curX-1; clearOldBox();if(collision(box)){newX=curX;putNewBox();MESSAGE=0;return 0;}putNewBox();actW=curW+1; actX=curX=newX;MESSAGE=mDRAW;return 1;}int moveRight(){newX=curX+1; clearOldBox();if(collision(box)){newX=curX;putNewBox();MESSAGE=0;return 0;}putNewBox();actW=curW+1; actX=curX; curX=newX; MESSAGE=mDRAW;return 1;}int moveDown(){int i,j;newY=curY-1;clearOldBox();if(collision(box)){newY=curY;putNewBox();active=0;MESSAGE=mLINE;return 0;}putNewBox();actH=curH+1; actY=newY; curY=newY;MESSAGE=mDRAW;return 1;}int rotate(){int newBox[4][4];int i,j;clearOldBox();for(j=0;j<4;j++)for(i=0;i<4;i++)newBox[j][i]=0;for(j=0;j<4;j++)for(i=0;i<4;i++)newBox[curW-i][j]=box[j][i];newW=curH; newH=curW;if(collisionRotate(newBox)){newW=curW; newH=curH; newX=curX; newY=curY;putNewBox();MESSAGE=0;return 0;}for(j=0;j<4;j++)box[j][i]=newBox[j][i];putNewBox();actH=newH>curH? 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;j<4;j++)if(box[j][i]) return i;return 0;}int getH(){int i,j;for(j=3;j>0;j--)for(i=0;i<4;i++)if(box[j][i]) return j;return 0;}void clearOldBox(){int i,j;for(j=0;j<=curH; j++)for(i=0;i<=curW; i++)if(box[j][i])area[curY+j][curX+i]=0;}void putNewBox(){int i,j;for(i=0;i<=newW;i++)if(box[j][i])area[newY+j][newX+i]=FORCOLOR;}int collision(int cbox[][4]){int i,j;if(newX<0) return 1;if(newX+newW>=MAXX) return 1;if(newY<0) return 1;for(j=0;j<=newH;j++)for(i=0;i<=newW;i++)if(area[newY+j][newX+i]&&cbox[j][i]) return 1;return 0;}int collisionRotate(int cbox[][4]){int i,j;if(newX+newW>=MAXX) newX=MAXX-1-newW; if(newY+newH>=MAXY) newY=MAXY-1-newH; if(collision(cbox)) return 1;for(i=0;i<=newW;i++)for(j=0;j<=newH;j++)if(area[newY+j][newX+i]){newX-=newW-i+1; goto L;}L: return collision(cbox);}int gameOver(){if(!active &&(curY+curH>MAXY-3)) return 1; else return 0;}。
#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef__cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸*/#define BGCOLOR 7 /* 背景着色*/#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI 3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril[22][16]; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*//* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,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},{1,1,0,0,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}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);}/*初始化图形模试*/void init(int gdrive,int gmode){int errorcode;initgraph(&gdrive,&gmode,"e:\\tc");errorcode=graphresult();if(errorcode!=grOk){printf("error of: %s",grapherrormsg(errorcode));exit(1);}}/* 在图形模式下的清屏*/void cls(){setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);}/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color){setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);}/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor){int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR){setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }}/*游戏中出现的文字*/void txt(int a,int b,char *txt,int font,int color){setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);}/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/* 当前方块的绘制*/void funbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); }/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);}/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)){oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a){int i,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR); gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);}}/*消掉所有都有最小方块的行*/void delete(){int i,j,zero,delgx=0;char *nm="00000";for(i=1;i<21;i++){zero=0;for(j=1;j<15;j++)if(gril[j]==0)zero=1;if(zero==0){delcol(i);delgx++;}}num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,"Number:",1,15);txt(456,193,nm,1,15);}/*时间中断结束*/void KillTimer(){disable();setvect(TIMER,oldhandler);enable();}/* 测试当前方块是否可以向下落*/int downok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i+1][row+j])k=0;return(k);}/* 测试当前方块是否可以向左行*/ int leftok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j-1])k=0;return(k);}/* 测试当前方块是否可以向右行*/ int rightok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j+1])k=0;return(k);}/* 测试当前方块是否可以变形*/int upok(){int i,j,k=1,a[4][4];for(i=0;i<4;i++)for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx+1][i]; for(i=3;i>=0;i--)for(j=3;j>=0;j--)if(a[j] && gril[col+i][row+j])k=0;return(k);}/*当前方块落下之后,给屏幕坐标作标记*/void setgril(){int i,j,a[4][4];funbox(0,0,minboxcolor,0);for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j])gril[col+i][row+j]=1;col=1;row=7;}/*游戏结束*/void gameover(){int i,j;for(i=20;i>0;i--)for(j=1;j<15;j++)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);}/*按键的设置*/void call_key(int keyx){switch(keyx){case VK_DOWN: { /*下方向键,横坐标加一。
C语言俄罗斯方块截图:源码:#include<Windows.h>#include<stdio.h>#include<stdarg.h>#include<time.h>//for ……HWND hWnd; //global handle of Window LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);#define CELL 20#define COLS 15#define ROWS 25bool ExportBlock(); //输出方块,该函数会直接修改全局变量block,width_block,height_block,cur_left和cur_top#define ID_TIMER 1UINT timer_id = 0; //保存计时器的IDint interval_base = 300; //时间间隔的基量int interval_unit = 25; //随级数递增时间间隔的增量int level = 0; //级数bool isPause = false;void DoLeftShift(HDC);void DoRightShift(HDC);void DoDownShift(HDC);/*void DoUpShift(HDC);*/void DoRedirection(HDC);void DoAccelerate(HDC);int cur_left, cur_top; //记录方块当前的位置int width_block, height_block; //方块的宽带和高度static byte *block = NULL; //方块,方块为随机大小,采用动态分配内存方式,所以这里是指针变量void DrawPanel(HDC hdc); //绘制表格void RefreshPanel(HDC hdc); //刷新面板bool IsTouchBottom(HDC); //判断是否到达底部void ClearRow(HDC); //消行byte g_panel[ROWS][COLS] = { 0 };int score = 0; //分数//升级所需分数值#define SCORE_LEVEL_INC 80//int main(){int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){//HINSTANCE hInstance=GetModuleHandle(NULL);WNDCLASS wndClass;MSG uMsg;wndClass.style = CS_HREDRAW | CS_VREDRAW;wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndClass.lpfnWndProc = WndProc;wndClass.hInstance = hInstance;wndClass.lpszClassName = TEXT("Tetris");wndClass.lpszMenuName = NULL;if (!RegisterClass(&wndClass)){printf("Register Class Occur Error!");exit(1);}hWnd = CreateWindow(wndClass.lpszClassName,TEXT("Tetris Demo"),WS_OVERLAPPEDWINDOW,0, 0, 0, 0,NULL,NULL,hInstance,NULL);ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);while (GetMessage(&uMsg, NULL, 0, 0)){TranslateMessage(&uMsg);DispatchMessage(&uMsg);}return uMsg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc;PAINTSTRUCT ps;//int x,y; //在这个函数块中没有用到,其实switch (message){case WM_CREATE:MoveWindow(hwnd, 400, 10, CELL*COLS + 8, CELL*COLS + 32, FALSE);//这里CELL*COLS+8表示的意义是窗口的宽,CELL*COLS+32表示的高;该句补上宽和高srand((unsigned int)time(NULL));ExportBlock(); //根据上面的随机种子生成一个输出的俄罗斯方块(落下来的)timer_id = SetTimer(hwnd, ID_TIMER, interval_base - level*interval_unit, NULL);//参数2:触发计时器的事件,参数3:计时器的时间间隔return 0;//既然有计时器,当然就要对计时器消息进行处理case WM_TIMER:hdc = GetDC(hwnd);DoDownShift(hdc); //生成的方块下落ReleaseDC(hwnd, hdc);return 0;case WM_KEYDOWN:hdc = GetDC(hwnd);switch (wParam){case VK_LEFT: //左方向键——左移?if (!isPause) DoLeftShift(hdc);break;case VK_RIGHT:if (!isPause) DoRightShift(hdc);//右方向键——右移?break;case VK_UP:if (!isPause) /*DoUpShift(hdc);*/DoRedirection(hdc);//转向?break;case VK_DOWN://DoDownShift(hdc);if (!isPause) DoAccelerate(hdc);break;case VK_SPACE:isPause =/*true;*/!isPause; //这里一个细节,差点弄错啊,还需要多注意、多头脑风暴下if (isPause){if (timer_id) KillTimer(hwnd, ID_TIMER);timer_id = 0;}else{timer_id = SetTimer(hwnd, ID_TIMER, interval_base - level*interval_unit,FALSE);}break;}ReleaseDC(hwnd, hdc);return 0;case WM_DESTROY:if (block) free(block); //block表示每次往下掉的方块if (timer_id) KillTimer(hwnd, ID_TIMER);PostQuitMessage(0);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);DrawPanel(hdc); //绘制面板RefreshPanel(hdc); //刷新EndPaint(hwnd, &ps);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);}//下面,按照我们在WndProc()函数中需要用到的子函数来写出其定义bool ExportBlock(){ //输出方块int sel;if (block){free(block); //释放之前分配的内存block = NULL;}sel = rand() % 7;switch (sel){case 0: //水平条width_block = 4;height_block = 1;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 1; //可以理解为*(block+0*width_block+0)=1,即第一行的第一个方格,下面同理*(block + 1) = 1; //*(block+0*width_block+1)=1*(block + 2) = 1; //*(block+0*width_block+2)=1*(block + 3) = 1; //*(block+0*width_block+3)=1,作者实际是用的渲染的想法cur_top = 0 - height_block; //奇怪,作者的坐标系到底是怎样的观念,这里怎么用0-height_block,表示方块还未完全显示cur_left = (COLS - width_block) / 2;break;case 1: //三角width_block = 3;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 0; //可以理解为*(block+0*width_block+0)=0,即第一行的第一个方格,下面同理*(block + 1) = 1; //*(block+0*width_block+1)=1*(block + 2) = 0; //*(block+0*width_block+2)=0*(block + 3) = 1; //*(block+1*width_block+0)=1,第二行开始*(block + 4) = 1; //*(block+1*width_block+1)=1*(block + 5) = 1; //*(block+1*width_block+2)=1cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;case 2: //左横折width_block = 3;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 1; //可以理解为*(block+0*width_block+0)=1,下面同理|*(block + 1) = 0; //*(block+0*width_block+1)=0 | | |*(block + 2) = 0; //*(block+0*width_block+2)=0*(block + 3) = 1; //*(block+1*width_block+0)=1*(block + 4) = 1; //*(block+1*width_block+1)=1*(block + 5) = 1; //*(block+1*width_block+2)=1cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;case 3: //右横折width_block = 3;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 0; //可以理解为*(block+0*width_block+0)=0,下面同理|*(block + 1) = 0;//*(block+0*width_block+1)=0 |||*(block + 2) = 1; //*(block+0*width_block+2)=1*(block + 3) = 1; //*(block+1*width_block+0)=1*(block + 5) = 1; //*(block+1*width_block+2)=1cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;case 4: //左闪电width_block = 3;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 1; //可以理解为*(block+0*width_block+0)=1,下面同理||*(block + 1) = 1;//*(block+0*width_block+1)=1 ||*(block + 2) = 0; //*(block+0*width_block+2)=0*(block + 3) = 0; //*(block+1*width_block+0)=0*(block + 4) = 1; //*(block+1*width_block+1)=1*(block + 5) = 1; //*(block+1*width_block+2)=1cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;case 5: //右闪电width_block = 3;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 0; //可以理解为*(block+0*width_block+0)=0,下面同理||*(block + 1) = 1; //*(block+0*width_block+1)=1 *(block + 2) = 1; //*(block+0*width_block+2)=1 ||*(block + 3) = 1; //*(block+1*width_block+0)=1*(block + 4) = 1; //*(block+1*width_block+1)=1*(block + 5) = 0; //*(block+1*width_block+2)=0cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;case 6: //石头width_block = 2;height_block = 2;block = (byte *)malloc(sizeof(byte)*width_block*height_block);*(block + 0) = 1; //可以理解为*(block+0*width_block+0)=1,下面同理*(block + 1) = 1; //*(block+0*width_block+1)=1*(block + 2) = 1; //*(block+1*width_block+0)=1cur_top = 0 - height_block;cur_left = (COLS - width_block) / 2;break;}return block != NULL;}void DoDownShift(HDC hdc){ //下移if (NULL == block)return;//判断是否到达底部if (IsTouchBottom(hdc)){ //到底部//消行处理ClearRow(hdc);ExportBlock(); //输出下一个方块}cur_top++;RefreshPanel(hdc);}void DoLeftShift(HDC hdc){ //左移int x, y;if (NULL == block)return;if (0 == cur_left)return;if (cur_top<0)return; //方块没有完整显示前,不能左移for (y = 0; y<height_block; y++){for (x = 0; x<width_block; x++){ //从左边开始扫描,获取该行最左边的实心方格块if (*(block + y*width_block + x)){//判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移if (g_panel[cur_top + y][cur_left + x - 1]) return;break; //只判断最左边的一个实心方格,之后直接扫描下一行}}}cur_left--;RefreshPanel(hdc);}void DoRightShift(HDC hdc){ //右移int x, y;if (NULL == block)return;if (COLS - width_block == cur_left)return;if (cur_top<0)return; //方块完整显示前不能右移for (y = 0; y<height_block; y++){for (x = width_block - 1; x >= 0; x--){ //从右边开始扫描,获取该行最右边的实心方格块if (*(block + y*width_block + x)){//判断当前方格在面板上右边一个方格是否为实心,是就代表不能再右移if (g_panel[cur_top + y][cur_left + x + 1])return;break; //只判断最右边的一个实心方格}}}cur_left++;RefreshPanel(hdc);}void DoRedirection(HDC hdc){ //改变方向int i, j;byte * temp = NULL;if (NULL == block)return;if (cur_top<0)return; //方块完整显示前不能转向temp = (byte *)malloc(sizeof(byte)*width_block*height_block);for (i = 0; i<width_block; i++){for (j = 0; j<height_block; j++){//temp[i][j]=block[height_block-j-1][i];*(temp + i*height_block + j) = *(block + (height_block - j - 1)*width_block + i);}}//给方块重新定位int incHeight = width_block - height_block;int incWidth = height_block - width_block;int temp_cur_top = cur_top - incHeight / 2;int temp_cur_left = cur_left - incWidth / 2;//system("cls");//printf("temp_top=%d, temp_left=%d",temp_cur_top,temp_cur_left);//判断当前空间是否足够让方块改变方向int max_len = max(width_block, height_block);//防止下标访问越界if (temp_cur_top + max_len - 1 >= ROWS || temp_cur_left<0 || temp_cur_left + max_len - 1 >= COLS){free(temp); //退出前必须先释放内存return;}for (i = 0; i<max_len; i++){for (j = 0; j<max_len; j++){//转向所需的空间内有已被占用的实心方格存在,即转向失败if (g_panel[temp_cur_top + i][temp_cur_left + j]){free(temp); //退出前必须先释放内存return;}}}//把临时变量的值赋给block,只能赋值,而不能赋指针值for (i = 0; i<height_block; i++){for (j = 0; j<width_block; j++){//block[i][j]=temp[i][j];*(block + i*width_block + j) = *(temp + i*width_block + j);}}//全局变量重新被赋值cur_top = temp_cur_top;cur_left = temp_cur_left;//交换i = width_block;width_block = height_block;height_block = i;free(temp); //释放为临时变量分配的内存RefreshPanel(hdc);}void DoAccelerate(HDC hdc){ //加速if (NULL == block)return;//消行处理ClearRow(hdc);ExportBlock();}cur_top++;RefreshPanel(hdc);}void RefreshPanel(HDC hdc){ //刷新int x, y;RECT rect;HBRUSH h_bSolid = (HBRUSH)GetStockObject(GRAY_BRUSH), h_bEmpty = (HBRUSH)GetStockObject(WHITE_BRUSH);if (NULL == block)return;//先刷屏for (y = 0; y<ROWS; y++){for (x = 0; x<COLS; x++){//为避免刷掉方块的边框,rect范围必须比边框范围小1rect.top = y*CELL + 2;rect.bottom = (y + 1)*CELL - 2;rect.left = x*CELL + 2;rect.right = (x + 1)*CELL - 2;if (g_panel[y][x])FillRect(hdc, &rect, h_bSolid);elseFillRect(hdc, &rect, h_bEmpty);}}//再定位方块for (y = 0; y<height_block; y++){for (x = 0; x<width_block; x++){if (*(block + y*width_block + x)){ //实心rect.top = (y + cur_top)*CELL + 2;rect.bottom = (y + cur_top + 1)*CELL - 2;rect.left = (x + cur_left)*CELL + 2;rect.right = (x + cur_left + 1)*CELL - 2;FillRect(hdc, &rect, h_bSolid);}}}}int x, y;int i, j;if (NULL == block) return false;if (ROWS == cur_top + height_block){//固定方块for (i = 0; i<height_block; i++){for (j = 0; j<width_block; j++){if (*(block + i*width_block + j)) g_panel[cur_top + i][cur_left + j] = 1;}}return true;}for (y = height_block - 1; y >= 0; y--){ //从底行开始扫描//判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部for (x = 0; x<width_block; x++){if (*(block + y*width_block + x)){if (cur_top + y + 1<0)return false;if (g_panel[cur_top + y + 1][cur_left + x]){//判断是否gameoverif (cur_top <= 0){if (timer_id){KillTimer(hWnd, ID_TIMER);timer_id = 0;}MessageBox(hWnd, "游戏结束", "MSG", MB_OK |MB_ICONEXCLAMATION);SendMessage(hWnd, WM_CLOSE, 0, 0);}////固定方块for (i = 0; i<height_block; i++){for (j = 0; j<width_block; j++){if (*(block + i*width_block + j)) g_panel[cur_top +i][cur_left + j] = 1;}}return true;}}}}return false;}void ClearRow(HDC hdc){ //消行int i, j, k;int count = 0; //消行次数bool isFilled;//消行处理for (i = ROWS - 1; i >= 0; i--){isFilled = true;for (j = 0; j<COLS; j++){if (!g_panel[i][j]){isFilled = false;break;}}if (isFilled){for (j = 0; j<COLS; j++){g_panel[i][j] = 0;}//所有方块往下移for (k = i - 1; k >= 0; k--){for (j = 0; j<COLS; j++){g_panel[k + 1][j] = g_panel[k][j];}}i = i + 1;count++;}}//最高级别为9级,所以分数极限为(9+1)*SCORE_LEVEL_INC-1if (score >= 10 * SCORE_LEVEL_INC - 1)return;//加分规则:消除行数,1行加10分,2行加15分,3行加20分,4行加30分switch (count){case 1:score += 10;break;case 2:score += 15;break;case 3:score += 20;break;case 4:score += 30;break;}int temp_level = score / SCORE_LEVEL_INC;if (temp_level>level){level = temp_level;//撤销当前计时器,然后重设if (timer_id)KillTimer(hWnd, ID_TIMER);timer_id = SetTimer(hWnd, ID_TIMER, interval_base - level*interval_unit, NULL);}system("cls");printf("score: %d, level: %d ", score, level);}void DrawPanel(HDC hdc){ //绘制游戏面板int x, y;RECT rect;for (y = 0; y<ROWS; y++){for (x = 0; x<COLS; x++){//计算方块的边框范围rect.top = y*CELL + 1;rect.bottom = (y + 1)*CELL - 1;rect.left = x*CELL + 1;rect.right = (x + 1)*CELL - 1;FrameRect(hdc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));}}}。
俄罗斯方块全注释超精简版(流程清晰,适于初学者,欢迎各位交流:****************,作者:XSH)游戏截图:主程序:Main.cpp#include<windows.h>#include <mmsystem.h>#include<stdio.h>#include<time.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include "colorConsole.h"#define LEFT 75#define RIGHT 77#define DOWN 80#define SPACE 32//全局变量//屏幕#define m_W 12#define m_H 22 //屏幕高和宽bool map[100][100]; //界面数组//结构struct Cube //方块结构为4*4矩阵{bool c[4][4];};//得分int level; //关卡数int score; //分数//难度bool newGame; //检测是否需要重新开始游戏int dif; //速度//颜色HANDLE handle; //当前窗口句柄WORD wColors[8];//颜色WORD newColor; //绘制方块的颜色WORD nextColor; //下一方块颜色//位置int posx, posy; //当前方块(相对map)左上角坐标//方块Cube myCube; //游戏者所控制的方块Cube NextCube; //显示下一个方块Cube trCube; //旋转后的方块//样式int style; //方块样式int nextStyle;//下一个方块的样式Cube baseCube[15]={ //基本方块{0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0},//凸形{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0},//方形{0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0},//Z1形{0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0},//Z2形{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},//条形{0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0},//L1形{0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}//L2形};//功能函数//打印绘制图形void InitFrame();//边框初始化void draw_frame(); //打印边框void draw_map(WORD color); //以颜色color扫描打印界面//记录void Get(Cube cube); //获取当前方块的记录void redraw(); //擦去当前方块的记录//检测功能bool meet;bool check_meet(int x, int y, Cube cube);//检测在map中以x,y为左上角的cube是否遇到map 中对应方块bool gameOver;bool check_gameOver();//检测游戏是否结束void remove();//扫描检测并消去当前界面中满行//显示void showScore();//显示得分void showNext();//显示下一个方块//按键信息处理void goDown();void goLeft();void goRight();void transfer(int style); //按space键使方块顺时针旋转90度的算法void kh_Space();//主函数void main(){while(1){PlaySound("俄罗斯方块.wav",NULL,SND_LOOP|SND_ASYNC);handle = initiate(); //绘图初始化wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;//红色wColors[1]=FOREGROUND_BLUE|FOREGROUND_INTENSITY;//蓝色wColors[2]=FOREGROUND_GREEN|FOREGROUND_INTENSITY;//绿色wColors[3]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;//黄色wColors[4]=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY;//青色wColors[5]=FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY;//紫色wColors[6]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUN D_INTENSITY;//白色wColors[7]=FOREGROUND_RED&FOREGROUND_BLUE&FOREGROUND_GREEN;//黑色newGame=false;memset(map,0,sizeof(map));//界面初始化if(gameOver) return;system("cls");//游戏变量初始化level=1; //关卡数初始化score=0; //分数初始化showScore();//显示分数,关卡数srand((unsigned)time(NULL)); //随机化种子InitFrame(); //界面边框初始化draw_frame(); //绘制边框nextColor=wColors[rand()%7];nextStyle=rand()%7;NextCube=baseCube[nextStyle];//游戏开始while(!newGame){posx=m_W/2-2; //初始坐标posy=1;meet=false;style=nextStyle;//获取样式newColor=nextColor;//获取颜色myCube=NextCube;//获取方块信息Get(myCube);draw_map(newColor);//绘制界面showScore();//获取下一个方块的信息并显示nextStyle=rand()%7;NextCube=baseCube[nextStyle]; nextColor=wColors[rand()%6]; showNext();//处理按键信息char key;while(1){//若没有按键且没到底,则一直下落while(!_kbhit()&&!meet){goDown();Sleep(500);}//若发生按键且没到底if (!meet){key=_getch();//接收按键switch(key){case DOWN: //下键goDown();break;case LEFT: //左键goLeft();break;case RIGHT: //右键goRight();break;case SPACE: //空格键kh_Space();break;case 'p': //暂停键_getch();break;case 'n': //新局键newGame=true;break;case '0' : //结束游戏return;default: break;}//switchif(newGame) break;}//若已经到底else{remove(); //扫描界面,消除满行showScore(); //显示得分if(check_gameOver()) return; //检查游戏是否结束break;}}//while(1)}//while(!newGame)}}//end of main()//各函数定义void InitFrame(){for(int i=0; i<m_W; i++){map[i][0]=1;map[i][m_H-1]=1;}for(int j=0; j<m_H; j++){map[0][j]=1;map[m_W-1][j]=1;}}//边框赋值初始化void Get(Cube cube){for(int i=0; i<4; i++)for(int j=0; j<4; j++)if(cube.c[i][j]==1&&map[posx+i][posy+j]==0)map[posx+i][posy+j]=1;}//获取当前方块void draw_map(WORD color){WORD c[1];c[0]=color;draw_frame();for(int j=1; j<m_H-1; j++)for(int i=1; i<m_W-1; i++)if(map[i][j]==1)textout(handle,20+i*2,j,c,1,"■");elsetextout(handle,20+i*2,j,c,1," ");}//以颜色color扫描打印界面中的方块void draw_frame(){WORD c[1],d[1];c[0]=wColors[rand()%7];d[0]=wColors[3];for(int i=0; i<m_W; i++){if(i%2==0){textout(handle,20+i*2,0,wColors+i%6,1,"◆");}else{textout(handle,20+i*2,0,wColors+i%6,1,"◇");}textout(handle,20+i*2,m_H-1,wColors+i%6,1,"□");}for(int j=1; j<m_H-1; j++){if(j%2==0){textout(handle,20,j,wColors+j%6,1,"★");textout(handle,20+(m_W-1)*2,j,wColors+i%6,1,"☆");}else{textout(handle,20,j,wColors+j%6,1,"☆");textout(handle,20+(m_W-1)*2,j,wColors+j%6,1,"★");}}textout(handle,1,2,c,1,"按键提示:");textout(handle,1,4,d,1,"n--开始新局");textout(handle,1,6,d,1,"p--暂停游戏");textout(handle,1,8,d,1,"方向键-控制方向");textout(handle,1,10,d,1,"空格键-旋转");textout(handle,1,12,d,1,"0--退出游戏");textout(handle,1,14,c,1,"作者:XSH ");}//打印边框void redraw(){for(int j=0; j<4; j++)for(int i=0; i<4; i++)if(myCube.c[i][j]==1)map[posx+i][posy+j]=0;}//擦去当前方块在map中的记录void remove(){int i,j,x,y;WORD c[1];c[0]=wColors[3];for(j=1; j<=m_H-2; j++){for(i=1; i<=m_W-2; i++)if(!map[i][j]) break;if(i>m_W-2){c[0]=wColors[rand()%7];for(int k1=1; k1<=m_W-2; k1++)textout(handle,20+k1*2,j,c,1,"■");Sleep(200);for(int k2=1; k2<m_W-1; k2++){textout(handle,20+k2*2,j,c,1," ");}Sleep(200);score=score+10;for(x=j-1; x>=1; x--){for(y=1; y<=m_W-2; y++){map[y][x+1]=map[y][x];}}draw_map(wColors[1]);}}}//扫描并消去当前界面中满行bool check_meet(int x, int y, Cube cube){for(int i=0; i<4; i++){for(int j=0; j<4; j++){if((cube.c[i][j]==1)&&(map[x+i][y+j]==1)){return true;}}}return false;}//检测在当前方块(map中以x,y为左上角的cube)是否遇到其他方块或墙壁(map中对应方块)bool check_gameOver(){char key;for(int i=1; i<=m_W-2; i++){if(map[i][1]==1){while(1){textout(handle,28,8,wColors+rand()%6,1,"GAME OVER!");textout(handle,15,9,wColors+rand()%6,1,"开始新局请按“n”结束游戏请按“0”");if(_kbhit()){key=_getch();if(key=='n') {newGame=true; return false;}if(key=='0') return true;}}}}return false;}//检测游戏是否结束void showScore(){char string[10];WORD c[1],d[1];c[0]=wColors[rand()%7];d[0]=wColors[rand()%7];for(int i=0; i<=1000; i++){if(score>=i*200&&score<(i+1)*200)break;}if(i!=level-1){level++;if(dif>=0){dif-=10;//每关加速}}textout(handle,20+m_W*2,10,c,1,"Your Score:");textout(handle,20+m_W*2,11,d,1,itoa(score,string,10));textout(handle,20+m_W*2+7,11,d,1,"分");textout(handle,20+m_W*2,0,c,1,"Level:");textout(handle,20+m_W*2,1,d,1,itoa(level,string,10));textout(handle,20+m_W*2+7,1,c,1,"关");}//显示当前分数,关卡数void showNext(){WORD d[1];d[0]=nextColor;textout(handle,20+m_W*2,3,d,1,"Next:");for(int i=0; i<4; i++){for(int j=0; j<4; j++){if(NextCube.c[i][j]==1)textout(handle,20+m_W*2+i*2,5+j,d,1,"■");elsetextout(handle,20+m_W*2+i*2,5+j,d,1," ");}}}//显示下一个方块void goDown(){redraw();if(!check_meet(posx,posy+1,myCube)){posy++;Get(myCube);draw_map(newColor);}else{Get(myCube);draw_map(newColor);meet=true;}}//下键void goLeft(){redraw();if(!check_meet(posx-1,posy,myCube)){posx--;Get(myCube);draw_map(newColor);}else goDown();}//左键void goRight(){redraw();if(!check_meet(posx+1,posy,myCube)){posx++;Get(myCube);draw_map(newColor);}else goDown();}//右键void transfer(int style){for(int i=0; i<4; i++)for(int j=0; j<4; j++)trCube.c[i][j]=myCube.c[j][3-i];} //按space键使方块顺时针旋转90度void kh_Space(){redraw();transfer(style);if(!check_meet(posx, posy, trCube)){myCube=trCube;Get(myCube);draw_map(newColor);}else goDown();}//空格键附件(可以用于任何游戏绘图):(注:附带声音文件俄罗斯方块.wav请自行下载,或发我邮箱~)ColorConsole.h#include <windows.h>#include <iostream.h>HANDLE initiate();BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString);ColorConsole.cpp#include "colorConsole.h"HANDLE initiate(){HANDLE hOutput;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);return hOutput;}BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString) {DWORD cWritten;BOOL fSuccess;COORD coord;coord.X = x; // start at first cellcoord.Y = y; // of first rowfSuccess = WriteConsoleOutputCharacter(hOutput, // screen buffer handlelpszString, // pointer to source stringlstrlen(lpszString), // length of stringcoord, // first cell to write to&cWritten); // actual number writtenif (! fSuccess)cout<<"error:WriteConsoleOutputCharacter"<<endl;for (;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors){fSuccess = WriteConsoleOutputAttribute(hOutput, // screen buffer handlewColors, // pointer to source stringnColors, // length of stringcoord, // first cell to write to&cWritten); // actual number written}if (! fSuccess)cout<<"error:WriteConsoleOutputAttribute"<<endl;return 0;}。
C语言小游戏源代码《俄罗斯方块》#include <stdlib.h>#include <stdio.h>#include <graphics.h>#define ESC 27#define UP 328#define DOWN 336#define LEFT 331#define RIGHT 333#define BLANK 32#define BOTTOM 2#define CANNOT 1#define CAN 0#define MAX 30#define F1 315#define ADD 43#define EQUAL 61#define DEC 45#define SOUNDs 115#define SOUNDS 83#define PAUSEP 80#define PAUSEp 112void Init();void Down();void GoOn();void ksdown();void Display(int color);void Give();int Touch(int x,int y,int dx,int dy);int GeyKey();void Select();void DetectFill();void GetScores();void Fail();void Help();void Quit();void DrawBox(int x,int y,int Color);void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch);void DrawNext(int Color);int Heng=12,Shu=20; /*横竖*/int Position[MAX][MAX];int middle[MAX][MAX];int ActH,ActS;int Act,Staus;int i,j,k;int Wid=10;int NoPass=CAN;float Delays=15000;int BeginH=250,BeginS=7;float Seconds=0;int Scores=0;int flag=1;int Sounds=CAN;int PreAct,NextAct;int a[8][4][4][4]={{{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0}, {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},{1,1,1,1,0,0,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},{1,1,0,0,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},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}},{{1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}},{{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}}, {{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}, {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}}, {{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}; int b[4][4];main(int argc,char *argv[]){if (argc!=1){if (argv[1]!="")Heng=atoi(argv[1]);if (argv[2]!="")Shu=atoi(argv[2]);}Init(); /*初始化界面*/PreAct=random(8); /*取得当前的方块*/ for(;;) /*以下是游戏流程*/{NextAct=random(8); /*取得下一个方块*/ DrawNext(1); /*画出下一个方块*/Act=PreAct;if (Heng%2==0) ActH=Heng/2;else ActH=(Heng-1)/2;ActS=0; /*方块开始从游戏空间的中间下落*/Staus=0; /*取开始的状态*/NoPass=CAN; /*物体可以下落*/Give(); /*取得当前的方块*/Display(Act+1); /*显示当前的方块,每种方块的颜色不同*/ GoOn(); /*游戏的算法精髓所在*/PreAct=NextAct; /*方块下落完毕,取得下一个方块*/ DrawNext(0);}}void Init(){int GraphDriver=DETECT,GraphMode;registerbgidriver(EGAVGA_driver);initgraph(&GraphDriver,&GraphMode,"");if (kbhit()) Sounds=CANNOT;setcolor(1);OutTextXY(10,10,"Tetris");OutTextXY(30,30,"Version 2.0");OutTextXY(10,120,"Help:");OutTextXY(20,140,"+ :Faster");OutTextXY(20,160,"- :Slower");OutTextXY(20,180,"Esc :Quit");OutTextXY(20,200,"F1 :Help");OutTextXY(10,310,"Copyright(c) 1998.2.22");OutTextXY(10,320,"By Mr. Unique");outtextxy(10,250,"Score: 00000");rectangle(BeginH-3,BeginS-3,BeginH+Heng*(Wid+2)+2,BeginS+Shu*(Wid+2)+2);rectangle(BeginH-5,BeginS-5,BeginH+Heng*(Wid+2)+4,BeginS+Shu*(Wid+2)+4);rectangle(BeginH+(Heng+4)*(Wid+2)-2,BeginS+10,BeginH+(Heng+8)*(Wid+2)+2,BeginS+12+4*( Wid+2));for (i=0;i<MAX;i++)for (j=0;j<MAX;j++){Position[i][j]=1;middle[i][j]=-1;}for (i=0;i<Heng;i++)for (j=0;j<Shu;j++)Position[i][j]=0;for (i=0;i<Heng;i++)for (j=0;j<Shu;j++)DrawBox(i,j,0);randomize();}void GoOn(){for(;;){Seconds+=0.2; /*控制方块的下落速度*/if (Seconds>=Delays){Down();Seconds=0;if (NoPass==BOTTOM){DetectFill();middle[ActH][ActS]=Act;if (ActS==0)Fail();return;}}if (kbhit())Select();}}void Down() /*方块下降*/{Display(0);if (Touch(ActH,ActS,0,1)==CAN) ActS++;elsemiddle[ActH][ActS]=Act; Display(Staus+1);}int Touch(int x,int y,int dx,int dy) {NoPass=CAN;for (i=0;i<4;i++)for (j=0;j<4;j++)Position[x+dx+i][y+dy+j]+=b[i][j];for (i=0;i<MAX;i++)for (j=0;j<MAX;j++)if (Position[i][j]>1)NoPass=CANNOT;for (i=0;i<4;i++)for (j=0;j<4;j++){Position[x+dx+i][y+dy+j]-=b[i][j]; middle[x+dx+i][y+dy+j]=Act;}if (NoPass==CANNOT && dx==0 && dy==1) {for (i=0;i<4;i++)for (j=0;j<4;j++)Position[x+i][y+j]+=b[i][j];NoPass=BOTTOM;}return NoPass;}int GetKey(void){int Ch,Low,Hig;Ch=bioskey(0);Low=Ch&0x00ff;Hig=(Ch&0xff00)>>8;return(Low==0?Hig+256:Low);}void Select(){int OldStaus,acts=ActS;switch(GetKey()){case ESC :Quit();break;case DOWN :Seconds+=14500;break;case LEFT :Display(0);if (ActH>0 && Touch(ActH,ActS,-1,0)==CAN) { ActH--;}Display(Act+1);break;case RIGHT :Display(0);if (ActH<Heng && Touch(ActH,ActS,1,0)==CAN) { ActH++;}Display(Act+1);break;case BLANK : Display(0);ksdown();Display(Act+1);break;case F1 :Help();break;case EQUAL :case ADD :if (Delays>300) Delays-=100;break; case DEC :if (Delays<3000) Delays+=100;break; case PAUSEP :case PAUSEp :getch();break;case SOUNDS :case SOUNDs :if (Sounds==CAN)Sounds=CANNOT;elseSounds=CAN;break;case UP :if(Act==7){while(acts<Shu-1&&Position[ActH][acts]!=1) acts++;Position[ActH][acts]=0;DrawBox(ActH,acts,0);acts=ActS;break;}else{Display(0);OldStaus=Staus;switch(Act){case 0:case 3:case 4:if (Staus==1) Staus=0;else Staus=1;break; case 1:break;case 2:case 5:case 6:if (Staus==3) Staus=0;else Staus++;break; }Give();if (Touch(ActH,ActS,0,0)==CANNOT){Staus=OldStaus;Give();}Display(Act+1);break;}}}void ksdown(){while(flag){if(Touch(ActH,ActS,0,0)==CAN){ActS++;}else {ActS--;flag=0;}}flag=1;}void Quit(){int ch,TopScore;FILE *fp;if ((fp=fopen("Russian.scr","r+"))!=NULL) {fscanf(fp,"%d",&TopScore);if (Scores>TopScore){setcolor(1);outtextxy(470,80,"Hello !");outtextxy(470,100,"In all the players,"); outtextxy(470,120,"You are the First !"); outtextxy(470,140,"And your score will"); outtextxy(470,160,"be the NEW RECORD !"); fseek(fp,0L,0);fprintf(fp,"%d",Scores);}fclose(fp);}setcolor(1);OutTextXY(470,220,"Are You Sure (Yes/no)?");ch=getch();if (ch=='y'||ch=='Y'){closegraph();delay(20);exit(0);}setcolor(0);outtextxy(470,220,"Are You Sure (Yes/no)?"); }void OutTextXY(int x,int y,char *String) {int i=0;char a[2];moveto(x,y);a[1]='\0';while (*(String+i)!='\0'){a[0]=*(String+i);outtext(a);if (Sounds==CAN && a[0]!=' '){sound(3000);delay(50);nosound();}i++;}}void Help(){unsigned Save;void *Buf;Save=imagesize(160,120,500,360);Buf=malloc(Save);getimage(160,120,500,360,Buf);setfillstyle(1,1);bar(160,120,500,280);setcolor(0);OutTextXY(170,130," About & Help");OutTextXY(170,150," # # # ########## # # # "); OutTextXY(170,160," # ## # # # # # # ###### ### "); OutTextXY(170,170," ########## ########## ## # # "); OutTextXY(170,180," # # # # # # # ## #### "); OutTextXY(170,190," # ## # #### ## # # # "); OutTextXY(170,200," # ## # # # # # ## # # # "); OutTextXY(170,210," # # # ## ## # ###### # # # "); OutTextXY(170,220," ## # ## # ## # # # # "); OutTextXY(170,230," # ## # #### # ## # "); OutTextXY(170,260," Good Luckly to You !!! ");getch();putimage(160,120,Buf,0);free(Buf);}void GetScores(){int Sec10000,Sec1000,Sec100,Sec10,Sec1; setfillstyle(0,1);bar(60,250,109,260);Sec1=Scores%10;Sec10=(Scores%100-Scores%10)/10;Sec100=(Scores%1000-Scores%100)/100;Sec1000=(Scores%10000-Scores%1000)/1000; Sec10000=(Scores%100000-Scores%10000)/10000; DispScore(60,250,'0'+Sec10000);DispScore(70,250,'0'+Sec1000);DispScore(80,250,'0'+Sec100);DispScore(90,250,'0'+Sec10);DispScore(100,250,'0'+Sec1);DispScore(110,250,'0');DispScore(120,250,'0');}void DispScore(int x,int y,char Ch){char a[2];a[1]='\0';a[0]=Ch;outtextxy(x,y,a);void Give(){for (i=0;i<4;i++)for (j=0;j<4;j++)b[i][j]=a[Act][Staus][i][j];}void Display(int color){for (i=0;i<4;i++)for (j=0;j<4;j++)if (b[i][j]==1) DrawBox(ActH+i,ActS+j,color); }void DrawBox(int x,int y,int Color){x=BeginH+x*(Wid+2);y=BeginS+y*(Wid+2);setfillstyle(1,Color);bar(x+2,y+2,x+Wid-1,y+Wid-1);if (Color==0)setcolor(9);elsesetcolor(Act+1);rectangle(x+4,y+4,x+Wid-4,y+Wid-4);}void DrawNext(int Color)for (i=0;i<4;i++)for (j=0;j<4;j++)if (a[NextAct][0][i][j]==1) DrawBox(Heng+4+i,1+j,Color); }void DetectFill(){int Number,Fall,FallTime=0;for (i=Shu-1;i>=0;i--){Number=0;for (j=0;j<Heng;j++)if (Position[j][i]==1) Number++;if (Number==Heng){FallTime++;if (Sounds==CAN){sound(500);delay(500);nosound();}for (Fall=i;Fall>0;Fall--)for (j=0;j<Heng;j++){Position[j][Fall]=Position[j][Fall-1];middle[j][Fall]=middle[j][Fall-1];if (Position[j][Fall]==0) DrawBox(j,Fall,0); else DrawBox(j,Fall,middle[j][Fall]+1);}i++;}}switch(FallTime){case 0:break;case 1:Scores+=1;break;case 2:Scores+=3;break;case 3:Scores+=6;break;case 4:Scores+=10;break;}if (FallTime!=0){GetScores();if (Scores%100==0) Delays-=100;}}void Fail(){if (Sounds==CAN){for (k=0;k<3;k++){sound(300);delay(200);nosound();}}setcolor(1);OutTextXY(440,200,"Game over!"); Quit();closegraph();exit(0);}。
#include <windows.h>#include <conio.h>#include <ctime>#include <cmath>#include <iostream>using namespace std;class Game{public:Game();~Game() { }void Init();void Print();void CreateBox(); //生成方块void ChangeBox(char control); //改变方块旋转或者左右移动bool Move();bool CollisionDetection(); //碰撞检测void DeleteLine(); //消行private:enum { N = 12 };int frame[N*2][N]; //游戏框架10*22的游戏空间int speed; //方块掉落速度struct Point{Point(): x(0), y(0) { }int x;int y;};Point box[4]; //方块Point temp[4]; //用来判断是否可以移动的临时变量};int main(){Game tetris;tetris.Init();tetris.CreateBox();tetris.Print();cout << "1 ←2 ↓3 →5 变形";while (true){if (_kbhit()){char control = _getch();tetris.ChangeBox(control);}tetris.Move();tetris.Print();}return 0;}Game::Game(){memset(frame, 0, sizeof(frame));srand(unsigned int(time(0)));}void Game::Init(){for (int i = 0; i < N; ++i){frame[0][i] = frame[N*2-1][i] = 1;}for (int j = 0; j < N * 2; ++j){frame[j][0] = frame[j][N-1] = 1;}}bool Game::Move() //方块下落{for (int i = 0; i < 4; ++i){temp[i].x = box[i].x + 1;temp[i].y = box[i].y;}if (CollisionDetection() == false) //方块到达底部{for (int i = 0; i < 4; ++i){frame[box[i].x][box[i].y] = 1;box[i].x = box[i].y = 0;}DeleteLine(); //判断消行CreateBox();return false;}return true;}bool Game::CollisionDetection(){for (int i = 0; i < 4; ++i){if (temp[i].y < 0 || temp[i].y > N-1 || 1 == frame[temp[i].x][temp[i].y]){return false;}}for (int i = 3; i >= 0; --i){frame[box[i].x][box[i].y] = 0;}for (int i = 3; i >= 0; --i){box[i].x = temp[i].x;box[i].y = temp[i].y;frame[box[i].x][box[i].y] = 2;}return true;}void Game::DeleteLine(){for (int row = 2; row < N * 2 - 1; ++row) //判断落下方块之后是否会消行{int count = 0;for (int col = 0; col < N; ++col){count += frame[row][col];}if (N == count){for (int i = row; i > 1; --i){for (int j = 1; j < N - 1; ++j){frame[i][j] = frame[i-1][j];}}}}}void Game::ChangeBox(char control){switch (control){case '1': //左移{for (int i = 0; i < 4; ++i){temp[i].x = box[i].x;temp[i].y = box[i].y - 1;}CollisionDetection();}break;case '3': //右移{for (int i = 0; i < 4; ++i){temp[i].x = box[i].x;temp[i].y = box[i].y + 1;}CollisionDetection();}break;case '5': //旋转{for (int i = 1; i < 4; ++i){temp[i].x = box[0].x + (box[i].y - box[0].y);temp[i].y = box[0].y - (box[i].x - box[0].x);}CollisionDetection();}break;case '2': //加速{while (Move());}break;}}void Game::CreateBox(){speed = 50;box[0].x = 1;box[0].y = N / 2;frame[box[0].x][box[0].y] = 2;// x-1,y// x,y-1 x ,y x, y+1// x+1,yfor (int i = 1; i < 4; ++i) //剩下的三个点随机生成{int temp = rand() % i;while (2 == frame[box[i].x][box[i].y] || 1 == frame[box[i].x][box[i].y]){box[i].x = box[temp].x + (rand()%3 - 1); //-1, 0, 1if (box[i].x == box[temp].x){box[i].y = box[temp].y + (int)pow(-1.0f, rand()%2); //-1, 1 }else{box[i].y = box[temp].y;}}frame[box[i].x][box[i].y] = 2;}}void Game::Print(){COORD coord = {0, 0};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);for (int i = 0; i < N * 2; ++i){for (int j = 0; j < N; ++j){if (1 == frame[i][j]){cout << "* ";}else if (2 == frame[i][j]){cout << "% ";}else{cout << " ";}}cout << endl;}Sleep(speed);}。
1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,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,}; /*方块模板*/int shape,dir,next_shape,next_dir;struct position{int x;int y;} now_position; /*纪录现在方块的位置*/int speed_level=1;int fall_to_land,be_lined; /*判断方块是否着地的*/ /*----------------------------------------*/void clscreen();void setxy(int x,int y);void display_back();void display_interface();void display_fk(int x,int y,int shape,int dir);void init();//int getkey();/*取键盘的扫描码*/void getinput();void m_sound(int freq,int time);void eras_fk(int x,int y,int shape,int dir);/*擦除方块*/void fk_down(bool quickly = false);bool is_illegal(int x,int y,int changed_dir);/*判断方块移动后坐标是否非法,非法1,合法0*/int get_random(int n); /*生成一个0----n-1的随机数*/void check_line(); /*检查是否有行可以消去,如果有就消去*/void game_over();/*----------------------------------*/int main(){int i;init();while (true){display_back();now_position.x=10;now_position.y=2;/*复原初始坐标*/be_lined=0; /*一个方块刚出现时没有成行*/shape=next_shape;dir=next_dir;next_shape=get_random(7);next_dir=get_random(4);eras_fk(55,5,shape,dir);/*擦去前一个方块*/display_fk(55,5,next_shape,next_dir);/*显示下一个方块*/display_fk(now_position.x,now_position.y,shape,dir);/*显示目前方块*/fall_to_land=0;while (!fall_to_land){for (i=15000-1500*speed_level;i>0;i--){getinput();}/*接受键盘输入*/fk_down(); /*方块自动下落*/}//m_sound(350,500); /*块落下的声音*/ check_line(); /*检查有没有可消去的行*/if (be_lined)m_sound(250,1000);elsem_sound(350,500);}return0;}/*------------------------------------*/void init(){int i,j;for (i=0;i<20;i++)for (j=0;j<10;j++)background[i][j]=0;/*背景数组赋初值0*/next_shape=(get_random(7)+5)/7;next_dir=(get_random(4)+2)/4;/*预先产生一个方块*/display_interface();/*画界面*/}void display_interface(){clscreen();setxy(40,5);printf("The Next: ");setxy(1,1);}/*-----------------------------------------*/void display_back()/*显示背景*/{int i,j;for (i=0;i<20;i++){for (j=0;j<10;j++){setxy(2*(j+1),i+2); /*数组下标到屏幕坐标的变换*/if (!background[i][j])/*背景数组中值为0*/printf(" ");elseprintf("[]");}}}/*---------------------------------------*/void display_fk(int x,int y,int shape,int dir)/*显示方块*/{int i,j;for (i=0;i<4;i++){for (j=0;j<4;j++){if (fang_kuai[shape][dir][i][j]){setxy((x+2*j),(y+i));/*结合现在方块的位置*/printf("[]");}}}}/*-----------------------------------*/void getinput(){if(GetAsyncKeyState(VK_LEFT)){if (!is_illegal(now_position.x-2,now_position.y,dir)){eras_fk(now_position.x,now_position.y,shape,dir);now_position.x=now_position.x-2;display_fk(now_position.x,now_position.y,shape,dir);Sleep(1000);}elsem_sound(440,500);/*如果没有遇阻,方块位置左移一格*/}else if(GetAsyncKeyState(VK_RIGHT)){if (!is_illegal(now_position.x+2,now_position.y,dir)){eras_fk(now_position.x,now_position.y,shape,dir);now_position.x=now_position.x+2;display_fk(now_position.x,now_position.y,shape,dir);Sleep(1000);}elsem_sound(440,500);/*如果没有遇阻,方块位置右移一格*/}else if(GetAsyncKeyState(VK_UP)){if (!is_illegal(now_position.x,now_position.y,(dir+1)%4)){eras_fk(now_position.x,now_position.y,shape,dir);dir=(dir+1)%4;display_fk(now_position.x,now_position.y,shape,dir);Sleep(1000);}}else if(GetAsyncKeyState(VK_DOWN)){fk_down(true);}else if(GetAsyncKeyState(VK_SPACE)){game_over();}}/*------------------------------------*/void m_sound(int freq,int time){Beep(freq,time);}/*--------------------------------*/void eras_fk(int x,int y,int shape,int dir)/*擦除方块*/{int i,j;for (i=0;i<4;i++){for (j=0;j<4;j++){if (fang_kuai[shape][dir][i][j]){setxy((x+2*j),(y+i));/*结合现在方块的位置*/printf(" ");}}}}/*----------------------------------------------------*/ void fk_down(bool quickly) /*方块下落*/{int i,j,x,y;if (!is_illegal(now_position.x,now_position.y+1,dir))/*下落没有阻碍*/{eras_fk(now_position.x,now_position.y,shape,dir);now_position.y=now_position.y+1;display_fk(now_position.x,now_position.y,shape,dir);if(quickly){Sleep(10);}else{Sleep(1000);}}else/*不可再下落了*/{/*方块并入背景*/x=now_position.x;y=now_position.y; /*x,y表示方便*/for (i=0;i<4;i++){for (j=0;j<4;j++){if (fang_kuai[shape][dir][i][j]==1) background[(y-2+i)][(x/2-1+j)]=1;}}fall_to_land=1; /*告诉主程序方块着地*/}}/*-----------------------------------------------------*/ bool is_illegal(int x,int y,int changed_dir){int i,j;bool illegal=false;/*先判断有没有出界,如果有x,y在界外并且此x,y处方块数组为1,就返回1*/for (i=0;i<4;i++)for (j=0;j<4;j++)if (fang_kuai[shape][changed_dir][i][j]==1&&((x+j*2)>21 || (x+j*2)<2 || (y+i)>21 || (y+i)<2))illegal=true;/*再判断是否有原方块阻碍*/if (!illegal){for (i=0;i<4;i++)for (j=0;j<4;j++)if (fang_kuai[shape][changed_dir][i][j]==1&&background[(y-2+i)][(x/2-1+j)]==1)illegal=true;/*有阻碍返回一*/}return illegal;}/*-----------------------------------------------------*/int get_random(int n){int x;Sleep(500);/*randomize();x=random(n);*/srand( (unsigned)time(NULL));x=rand()%n;return(x);}/*--------------------------------------------------------------*/void check_line() /*待修改*/{/*检查背景数组*/int i,j,k;int line,n;for (i=19;i>=0;i--){k=1; /*开始默认成行*/for (j=9;j>=0;j-- ){if (background[i][j]==0) /*不成行的条件*/k=0;}if (k==1) /*如果成行*/{be_lined=1; /*成行标志*/for (line=i;line>0;line--)for (n=9;n>=0;n--)background[line][n]=background[line-1][n];/*逐次下移一行*/i=i+1; /*把下一次待检的行重新设定*/}}}/*--------------------------------------------------------------*/void game_over(){clscreen();setxy(35,1);printf("GAME OVER");exit(0);}void clscreen(){system("cls");}void setxy(int x,int y){HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);COORD place;place.X = x;place.Y = y;SetConsoleCursorPosition(hConsole, place);}/* Colors defined for SetColor(int) */enum {BLACK = 0,DARK_BLUE = 1,DARK_GREEN = 2,TEAL = 3,DARK_RED = 4,DARK_PURPLE = 5,GOLD = 6,GREY = 7,DARK_WHITE = 8,BLUE = 9,GREEN = 10,CYAN = 11,RED = 12,PURPLE = 13,YELLOW = 14,WHITE = 15};void SetColor(const int foreground, const int background) {int Color = foreground + (background * 16);HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);}你把这段拿回去看哈吧,这是一个俄罗斯方块的程序,就是在控制台运行的,就是用你所说的纯数字和字符所运行,你现在只能在dos 下显示那些纯数字的东西,是因为你很多技术性的手法,你还不会,但你学习到一定程度后,你就会有所领悟,也不要太心急,当你练好内功后,修炼招数,应该会很快的!希望对你有帮助。