c++2048代码
case 'w':case 'W'://是否存在下面一个数字和自己的相同且不是0。case 's':case 'S'://是否存在上面一个数字和自己的相同且不是0。case 'a':case 'A'://是否存在右面一个数字和自己的相同且不是0。case 'd':case 'D'://是否存在左面一个数字和自己的相同且不是0。case 'w':case 'W'://有空位则下面的非空位往上移。ca
·
废话不多说,上代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
//过关数字
#define win_number 2048
//定义地图行、列、以及本身
#define row 4
#define col 4
int map[row][col]={0};
//初始化地图
void InitializeMap();
//打印地图
void PrintMap();
//判断是否已经存在2048
int IsWin();
//随机生成一个2或者4,生成2的概率是生成4的概率的3倍
void CreateANumber();
//移动数字
int Move(char turn);
//合并数字
int Combine(char turn);
//gotoxy函数的实现,把光标移到到指定位置
void gotoxy(int x,int y);
int main()
{
srand(time(0)); //时间种子
InitializeMap(); //初始化地图,只有两个数字
char turn;
while(1)
{
PrintMap(); //展示地图
if(IsWin()) //判断是否过关
{
printf("恭喜通关!\n");
break;
}
turn=getch(); //获取用户的移动请求,若移动有效则再次生成一个随机2或4
if(Move(turn)==1)
{
if(Combine(turn))
{
Move(turn);
}
CreateANumber();
}
else if(Combine(turn))
{
Move(turn);
CreateANumber();
}
}
return 0;
}
//初始化地图
void InitializeMap()
{
CreateANumber();
CreateANumber();
}
//打印地图
void PrintMap()
{
int i,j,k;
gotoxy(0,0);
for(i=0;i<row;i++)
{
for(k=1;k<=5*col+1;k++)
{
printf("-");
}
printf("\n|");
for(j=0;j<col;j++)
{
if(map[i][j]>0)
{
printf("%4d|",map[i][j]);
}
else
{
printf("%4s|"," ");
}
}
printf("\n");
}
for(k=1;k<=5*col+1;k++)
{
printf("-");
}
printf("\n");
}
//判断是否已经存在2048
int IsWin()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(map[i][j]==win_number)
{
return 1;
}
}
}
return 0;
}
//随机生成一个2或者4,生成2的概率是生成4的概率的3倍
void CreateANumber()
{
int number=rand()%4+1;
if(number!=4)
{
number=2;
}
int i,j;
while(1)
{
i=rand()%row;
j=rand()%col;
if(map[i][j]==0)
{
map[i][j]=number;
break;
}
}
}
//移动数字
int Move(char turn)
{
int flag=0; //是否移动或者合并成功。0:否 1:是
int i,j,k;
switch(turn)
{
case 'w':case 'W'://有空位则下面的非空位往上移
for(i=0;i<row-1;i++)
{
for(j=0;j<col;j++)
{
if(map[i][j]==0)
{
for(k=i+1;k<row;k++)
{
if(map[k][j]>0)
{
map[i][j]=map[k][j];
map[k][j]=0;
flag=1;
break;
}
}
}
}
}
break;
case 's':case 'S'://有空位则上面的非空位往下移
for(i=row-1;i>=1;i--)
{
for(j=0;j<col;j++)
{
if(map[i][j]==0)
{
for(k=i-1;k>=0;k--)
{
if(map[k][j]>0)
{
map[i][j]=map[k][j];
map[k][j]=0;
flag=1;
break;
}
}
}
}
}
break;
case 'a':case 'A'://有空位则右面的非空位往左移
for(j=0;j<col-1;j++)
{
for(i=0;i<row;i++)
{
if(map[i][j]==0)
{
for(k=j+1;k<col;k++)
{
if(map[i][k]>0)
{
map[i][j]=map[i][k];
map[i][k]=0;
flag=1;
break;
}
}
}
}
}
break;
case 'd':case 'D'://有空位则左面的非空位往右移
for(i=0;i<row;i++)
{
for(j=col-1;j>=1;j--)
{
if(map[i][j]==0)
{
for(k=j-1;k>=0;k--)
{
if(map[i][k]>0)
{
map[i][j]=map[i][k];
map[i][k]=0;
flag=1;
break;
}
}
}
}
}
break;
default:
break;
}
return flag;
}
//合并数字
int Combine(char turn)
{
int flag=0; //是否合并成功
int i,j;
switch(turn)
{
case 'w':case 'W'://是否存在下面一个数字和自己的相同且不是0
for(i=0;i<row-1;i++)
{
for(j=0;j<col;j++)
{
if(map[i][j]>0&&map[i][j]==map[i+1][j])
{
map[i][j]*=2;
map[i+1][j]=0;
flag=1;
}
}
}
break;
case 's':case 'S'://是否存在上面一个数字和自己的相同且不是0
for(i=row-1;i>=1;i--)
{
for(j=0;j<col;j++)
{
if(map[i][j]>0&&map[i][j]==map[i-1][j])
{
map[i][j]*=2;
map[i-1][j]=0;
flag=1;
}
}
}
break;
case 'a':case 'A'://是否存在右面一个数字和自己的相同且不是0
for(i=0;i<row;i++)
{
for(j=0;j<col-1;j++)
{
if(map[i][j]>0&&map[i][j]==map[i][j+1])
{
map[i][j]*=2;
map[i][j+1]=0;
flag=1;
}
}
}
break;
case 'd':case 'D'://是否存在左面一个数字和自己的相同且不是0
for(i=0;i<row;i++)
{
for(j=col-1;j>=1;j--)
{
if(map[i][j]>0&&map[i][j]==map[i][j-1])
{
map[i][j]*=2;
map[i][j-1]=0;
flag=1;
}
}
}
break;
default:
break;
}
return flag;
}
//gotoxy函数的实现,把光标移到到指定位置
void gotoxy(int x,int y)
{
COORD pos;
pos.X=y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
更多推荐
已为社区贡献10条内容
所有评论(0)