C语言简单游戏编程学习入门之俄罗斯方块
2020-01-14 10:53
295 查看
运行截图
源代码
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<conio.h> #include<time.h> //地图信息 #define row 20 #define col 10 int map[row][col]={0}; #define wall "■" //墙壁 #define block "●" //方块 #define BLOCK 1 #define floor " " //空地 #define FLOOR 0 //枚举方块出现的类型,L,反L,O,Z,反Z,I,T enum type { L,FL,O,Z,FZ,I,T }; //枚举方块的状态,上下左右 enum status { UP,RIGHT,DOWN,LEFT }; //俄罗斯方块结构 typedef struct tetris { int data[4][4]; int x,y; }tetris; //定义全局方块变量,目前的和下一个 tetris t_now,t_next; //方块类型 L,反L,O,Z,反Z,I,T int type,type_next; //方块目前的状态 int status; //方块置零 void TetrisToZero(); //定位光标 void gotoxy(int x,int y); //重置地图 void InitializeMap(); //打印地图 void PrintMap(); //方块进地图 void BlockIntoMap(); //根据类型产生方块 void CreateBlock(); //方块下落 int drop(); //方块入驻地图 void TetrisIntoMap(); //移动和变换 void move(); //方块到底后的消除 void DeleteLine(); //判断是否已经结束 int IsOver(); int main() { srand(time(0)); status=UP; CreateBlock(); t_now=t_next; type=type_next; CreateBlock(); while(1){ Sleep(200); BlockIntoMap(); PrintMap(); move(); if(drop()==1) { InitializeMap(); t_now.x++; } else { InitializeMap(); TetrisIntoMap(); DeleteLine(); t_now=t_next; type=type_next; if(IsOver()==1) { BlockIntoMap(); PrintMap(); printf("游戏结束"); break; } status=UP; CreateBlock(); } } return 0; } //判断是否已经结束 int IsOver() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(t_now.data[i][j]==BLOCK&&map[t_now.x+i][t_now.y+j]!=FLOOR) { return 1; } } } return 0; } //方块到底后的消除 void DeleteLine() { int i,j,k,flag; for(i=row-1;i>=0;i--) { flag=1; for(j=0;j<col;j++) { if(map[i][j]!=2*BLOCK) { flag=0; break; } } if(flag==1) { for(k=i;k>=1;k--) { for(j=0;j<col;j++) { map[k][j]=map[k-1][j]; } } i++; } } } //移动和变换 void move() { if(!kbhit()) return; char ch=getch(); int i,j; switch(type) { case L: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][1]=FLOOR; t_now.data[2][2]=FLOOR; t_now.data[1][2]=BLOCK; t_now.data[1][3]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col-1&&map[t_now.x+1][t_now.y+4]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[1][3]=FLOOR; t_now.data[2][1]=FLOOR; t_now.data[2][2]=BLOCK; t_now.data[3][2]=BLOCK; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[1][1]=FLOOR; t_now.data[3][2]=FLOOR; t_now.data[2][0]=BLOCK; t_now.data[2][1]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y-1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[2][0]=FLOOR; t_now.data[1][2]=FLOOR; t_now.data[0][1]=BLOCK; t_now.data[1][1]=BLOCK; status=UP; } break; } break; } break; case FL: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+0][t_now.y+3]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][2]=FLOOR; t_now.data[1][2]=FLOOR; t_now.data[1][1]=BLOCK; t_now.data[2][3]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col-1&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+4]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[2][2]=FLOOR; t_now.data[2][3]=FLOOR; t_now.data[1][2]=BLOCK; t_now.data[3][1]=BLOCK; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[2][1]=FLOOR; t_now.data[3][1]=FLOOR; t_now.data[1][0]=BLOCK; t_now.data[2][2]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+1][t_now.y-1]==FLOOR&&map[t_now.x+2][t_now.y-1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[1][0]=FLOOR; t_now.data[1][1]=FLOOR; t_now.data[0][2]=BLOCK; t_now.data[2][1]=BLOCK; status=UP; } break; } break; } break; case O: switch(ch) { case 'a':case 'A': if(t_now.y>=0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; } break; case Z: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+0][t_now.y+3]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][2]=FLOOR; t_now.data[2][1]=FLOOR; t_now.data[2][2]=BLOCK; t_now.data[2][3]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+4]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.x+3<row&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[1][1]=FLOOR; t_now.data[2][3]=FLOOR; t_now.data[2][1]=BLOCK; t_now.data[3][1]=BLOCK; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[1][2]=FLOOR; t_now.data[3][1]=FLOOR; t_now.data[1][0]=BLOCK; t_now.data[1][1]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+1][t_now.y-1]==FLOOR&&map[t_now.x+2][t_now.y]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[1][0]=FLOOR; t_now.data[2][2]=FLOOR; t_now.data[0][2]=BLOCK; t_now.data[1][2]=BLOCK; status=UP; } break; } break; } break; case FZ: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[0][1]=FLOOR; t_now.data[1][1]=FLOOR; t_now.data[1][3]=BLOCK; t_now.data[2][1]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col-1&&map[t_now.x+1][t_now.y+4]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.x+3<row&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[1][2]=FLOOR; t_now.data[1][3]=FLOOR; t_now.data[1][1]=BLOCK; t_now.data[3][2]=BLOCK; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.data[1][1]=FLOOR; t_now.data[3][2]=FLOOR; t_now.data[1][2]=BLOCK; t_now.data[2][0]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+1][t_now.y]==FLOOR&&map[t_now.x+2][t_now.y-1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col-1&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[2][0]=FLOOR; t_now.data[2][1]=FLOOR; t_now.data[0][1]=BLOCK; t_now.data[2][2]=BLOCK; status=UP; } break; } break; } break; case I: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+2<col&&map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&t_now.y+3<col&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][1]=FLOOR; t_now.data[2][1]=FLOOR; t_now.data[3][1]=FLOOR; t_now.data[1][0]=BLOCK; t_now.data[1][2]=BLOCK; t_now.data[1][3]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y-1>=0&&map[t_now.x+1][t_now.y-1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+4<col&&map[t_now.x+1][t_now.y+4]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.x+3<row&&map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[1][0]=FLOOR; t_now.data[1][1]=FLOOR; t_now.data[1][3]=FLOOR; t_now.data[0][2]=BLOCK; t_now.data[2][2]=BLOCK; t_now.data[3][2]=FLOOR; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>=0&&map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+0][t_now.y+3]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&t_now.y+3<col&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][2]=FLOOR; t_now.data[1][2]=FLOOR; t_now.data[3][2]=FLOOR; t_now.data[2][0]=BLOCK; t_now.data[2][1]=BLOCK; t_now.data[2][3]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+2][t_now.y-1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+4<col&&map[t_now.x+2][t_now.y+4]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.x+3<row&&map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[2][0]=FLOOR; t_now.data[2][2]=FLOOR; t_now.data[2][3]=FLOOR; t_now.data[0][1]=BLOCK; t_now.data[1][1]=BLOCK; t_now.data[1][3]=BLOCK; status=UP; } break; } break; } break; case T: switch(status) { case UP: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+0][t_now.y+1]==FLOOR&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+0][t_now.y+3]==FLOOR&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y+3<col&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { InitializeMap(); t_now.data[0][2]=FLOOR; t_now.data[1][1]=FLOOR; t_now.data[2][1]=BLOCK; t_now.data[2][3]=BLOCK; status=RIGHT; } break; } break; case RIGHT: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+4<col&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+4]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.x+3<row&&map[t_now.x+1][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { InitializeMap(); t_now.data[1][2]=FLOOR; t_now.data[2][3]=FLOOR; t_now.data[1][1]=BLOCK; t_now.data[3][1]=BLOCK; status=DOWN; } break; } break; case DOWN: switch(ch) { case 'a':case 'A': if(t_now.y+1>0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+0]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(t_now.y>=0&&map[t_now.x+1][t_now.y+0]==FLOOR&&map[t_now.x+1][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[2][2]=FLOOR; t_now.data[3][1]=FLOOR; t_now.data[1][0]=BLOCK; t_now.data[1][2]=BLOCK; status=LEFT; } break; } break; case LEFT: switch(ch) { case 'a':case 'A': if(t_now.y>=1&&map[t_now.x+1][t_now.y-1]==FLOOR&&map[t_now.x+2][t_now.y]==FLOOR) { InitializeMap(); t_now.y--; } break; case 'd':case 'D': if(t_now.y+3<col&&map[t_now.x+1][t_now.y+3]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.y++; } break; case ' ': if(map[t_now.x+0][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { InitializeMap(); t_now.data[1][0]=FLOOR; t_now.data[2][1]=FLOOR; t_now.data[0][2]=BLOCK; t_now.data[2][2]=BLOCK; status=UP; } break; } break; } break; } } //方块下落 int drop() { switch(type) { case L: switch(status) { case UP: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+4][t_now.y+2]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { return 1; } break; } break; case FL: switch(status) { case UP: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+4][t_now.y+1]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { return 1; } break; } break; case O: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case Z: switch(status) { case UP: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+4][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+3<row&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { return 1; } break; } break; case FZ: switch(status) { case UP: if(t_now.x+3<row&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+4][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { return 1; } break; } break; case I: switch(status) { case UP: if(t_now.x+4<row&&map[t_now.x+4][t_now.y+1]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+4][t_now.y+2]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+2<row&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR&&map[t_now.x+2][t_now.y+3]==FLOOR) { return 1; } break; } break; case T: switch(status) { case UP: if(t_now.x+3<row&&map[t_now.x+2][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR) { return 1; } break; case DOWN: if(t_now.x+4<row&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+4][t_now.y+1]==FLOOR) { return 1; } break; case LEFT: if(t_now.x+3<row&&map[t_now.x+2][t_now.y+0]==FLOOR&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+2][t_now.y+2]==FLOOR) { return 1; } break; case RIGHT: if(t_now.x+3<row&&map[t_now.x+3][t_now.y+1]==FLOOR&&map[t_now.x+3][t_now.y+2]==FLOOR&&map[t_now.x+3][t_now.y+3]==FLOOR) { return 1; } break; } break; } return 0; } //重置地图 void InitializeMap() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(t_now.data[i][j]==BLOCK) { map[i+t_now.x][j+t_now.y]=FLOOR; } } } } //方块置零 void TetrisToZero() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { t_next.data[i][j]=0; } } t_next.x=0; t_next.y=col/2-2; } //方块入驻地图 void TetrisIntoMap() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(t_now.data[i][j]==BLOCK) map[i+t_now.x][j+t_now.y]=2*BLOCK; } } } //定位光标 void gotoxy(int x,int y) { COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } //打印地图 void PrintMap() { gotoxy(0,0); char nexttype[][10]={"L","FL","O","Z","FZ","I","T"}; int i,j; for(i=0;i<row;i++) { printf("%s",wall); for(j=0;j<col;j++) { if(map[i][j]==FLOOR) { printf("%s",floor); } else { printf("%s",block); } } printf("%s",wall); if(i==row/2-2) { printf("\tnext type : %s \n",nexttype[type_next]); } else { printf("\n"); } } for(i=1;i<=col+2;i++) { printf("%s",wall); } printf("\n"); } //方块进地图 void BlockIntoMap() { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(t_now.data[i][j]==BLOCK) map[i+t_now.x][j+t_now.y]=t_now.data[i][j]; } } } //根据类型产生方块 L,FL,O,Z,FZ,I,T void CreateBlock() { type_next=rand()%7; TetrisToZero(); switch(type_next) { case L: t_next.data[0][1]=BLOCK; t_next.data[1][1]=BLOCK; t_next.data[2][1]=BLOCK; t_next.data[2][2]=BLOCK; break; case FL: t_next.data[0][2]=BLOCK; t_next.data[1][2]=BLOCK; t_next.data[2][1]=BLOCK; t_next.data[2][2]=BLOCK; break; case O: t_next.data[1][1]=BLOCK; t_next.data[1][2]=BLOCK; t_next.data[2][1]=BLOCK; t_next.data[2][2]=BLOCK; break; case Z: t_next.data[0][2]=BLOCK; t_next.data[1][1]=BLOCK; t_next.data[1][2]=BLOCK; t_next.data[2][1]=BLOCK; break; case FZ: t_next.data[0][1]=BLOCK; t_next.data[1][1]=BLOCK; t_next.data[1][2]=BLOCK; t_next.data[2][2]=BLOCK; break; case I: t_next.data[0][1]=BLOCK; t_next.data[1][1]=BLOCK; t_next.data[2][1]=BLOCK; t_next.data[3][1]=BLOCK; break; case T: t_next.data[0][2]=BLOCK; t_next.data[1][1]=BLOCK; t_next.data[1][2]=BLOCK; t_next.data[2][2]=BLOCK; break; } }
设计解析
和之前的小游戏一样,我们需要一个界面,这里定义为二维数组map,定义行row,列col。 我们还需要定义一下方块的类型,总共7类:L、反L、O、Z、反Z、I、T。其中它们都是存于一个二维数组中的,这时候我们设计方块类型结构tetris,其中有三个属性,data[4][4]存储方块、x和y存储方块在地图中的位置横坐标和纵坐标。设置好方块类后我们声明2个方块变量,一个存储当前的方块信息,另一个存储下一个方块信息。同时定义两个类型变量,存储方块的类型名称。最后设置一个状态变量存储当前方块的状态(状态分4种:UP、RIGHT、DOWN、LEFT,例如L型的方块UP状态是L,DOWN状态是7)。 接下来就是设计函数来实现游戏逻辑了,先从简单的说起。 1.打印地图函数,PrintMap(),遍历地图,如果是空白的格子就打印两个空格,否则打印出圆点表示方块的一格。 2.方块进地图函数,TetrisIntoMap(),把方块的data属性的格子写进地图中。 3.方块下落函数,drop(),分别对每种方块的每种状态进行判断,注意不能出地图和撞到其他格子。 4.方块变换和左右移动函数,move(),分别对每种方块的每种状态进行判断,注意不能出地图和撞到其他格子。 5.方块不能下落后,固定进地图中,BlockIntoMap(),将已经不能动的方块烙进地图中。 6.方块烙进地图后,对地图进行判断看是否满足某一行已经满格子的条件,满足则消行,DeleteLine()。 7.随机产生方块函数,CreateBlock(),将新产生的方块存在下一个方块变量中,每次方块消行完成后,将现在进行的方块赋值为下一个方块的信息,重新产生方块。 8.判断是否已经输掉函数,IsOver(),当方块已经堆到不能产生新的的高度时,游戏结束。
设计总结
在设计俄罗斯方块前,我觉得这个应该不难,到了真正动手的时候才知道:虽然思路不难,但是实现较为复杂,其中涉及的多种判断是推箱子不能与之相比的。主要是在分支中又嵌套了分支,繁琐且容易出错。但总体来说,这个小游戏的设计只要细心就可以了,主要的注意地方就是方块的下落和移动、变换。 经过不断的修改和完善,程序总算实现了基本的功能,这里仅供参考。如需增加得分啥的,有兴趣的朋友可以在消行那里添加代码。另外还有保存记录的,可以利用到文件的知识存储到本地磁盘中,那样主函数也需要相对修改,刚进去的时候优先读取本地磁盘就行。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- C语言简单游戏编程入门之四子棋
- c语言是学习编程的一个开始,学习好的c语言,其它语言就容易入门啦!
- 51单片机教程单片机视频教程单片机自学学习入门C语言郭天祥单片机编程入门AD/DA工作原理运放电路
- 网易云课堂程序设计入门--C语言第一周 简单的计算程序学习笔记
- c语言编程实现简单三子棋游戏
- Python编程:从入门到实践 学习笔记 基础知识(一) 变量与简单数据类型
- 爱学习,爱编程,爱咖啡可乐 爱挑战,爱钻研,爱打游戏 爱晚起,也爱工作到深夜 我擅长技术,崇尚简单和懒惰 我神秘而孤僻,沉默而爱憎分明 Don't Panic! I'm a programmer
- C语言三字棋游戏先简单介绍一下三子棋的规则,方便我们接下来的编程和理解。规则如下: 在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
- 游戏编程入门学习笔记34——中场休息——近期的一些心得
- C语言编程 简单展开扫雷游戏
- 游戏编程入门学习笔记26——AI篇——AI的实现
- 【贪吃蛇,C++实现】,由简单游戏开始学习OOP,的编程新手
- 游戏编程入门学习笔记20——网络篇——理清框架、获取字符串输入
- 回归游戏的世界,简单图形编程学习的开始
- C语言编程中实现二分查找的简单入门实例
- c语言编程 :模拟实现简单扫雷游戏
- QT Creater入门编程:学习QT编程后,你会发现界面就像小孩子拼积木那样简单.
- 如何把孩子玩游戏动力转换为学习动力,或是编程入门引导?
- 通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程
- JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_2