您的位置:首页 > 编程语言 > C语言/C++

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(),当方块已经堆到不能产生新的的高度时,游戏结束。

设计总结

在设计俄罗斯方块前,我觉得这个应该不难,到了真正动手的时候才知道:虽然思路不难,但是实现较为复杂,其中涉及的多种判断是推箱子不能与之相比的。主要是在分支中又嵌套了分支,繁琐且容易出错。但总体来说,这个小游戏的设计只要细心就可以了,主要的注意地方就是方块的下落和移动、变换。
经过不断的修改和完善,程序总算实现了基本的功能,这里仅供参考。如需增加得分啥的,有兴趣的朋友可以在消行那里添加代码。另外还有保存记录的,可以利用到文件的知识存储到本地磁盘中,那样主函数也需要相对修改,刚进去的时候优先读取本地磁盘就行。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
qq_36694133 发布了8 篇原创文章 · 获赞 3 · 访问量 307 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐