当前位置:文档之家› C++模拟2048

C++模拟2048

/*C++ 控制台模拟2048*/

#include
#include
#include
#include
#include
#define MAX 4//最大棋盘格数
using namespace std;
int pane[MAX][MAX];

void showpane() //显示棋盘
{
cout<cout<cout<<"|";
for(int i=0;i<=MAX-1;i++)
{
cout<<"-----|";
}
cout<for(int i=0;i<=MAX-1;i++)
{
cout<for(int j=0;j<=MAX-1;j++)
{
if(pane[i][j]==0)
cout<else
cout<if(j==MAX-1)
{
cout<cout<cout<<"|";
for(int k=0;k<=MAX-1;k++)
{
cout<<"-----|";
}
cout<}
}
}
}
void newgame()//开始游戏
{
int m,n,q,p;
srand((unsigned)time(NULL));
do
{
memset(pane,0,sizeof(pane));
m=rand()%4;
n=rand()%4;
p=rand()%4;
q=rand()%4;
pane[m][n]=pane[p][q]=2;//将棋盘上的两个点,初始化为2
}
while(m==p && n==q);
}
int if2n(int x)//判断x是否是2的n次方
{
int flag=0;
for(int n=1;n<=11;n++)
{
if(x==pow(2.0,n))
{
flag=1;
return flag;
}
}
return flag;
}
void upMove()
{
int temp;
for(int j=0;j<=MAX-1;j++)
for(int i=0;i<=MAX-1;i++)
{
temp=i;
if(pane[temp][j]==pane[temp-1][j] && pane[temp][j]>0)
{
pane[temp-1][j]=pane[temp-1][j]*2;
for(int k=temp+1;k{
pane[k-1][j]=pane[k][j];
}
pane[MAX-1][j]=0;
}
while(pane[temp][j]>0 && pane[temp-1][j]==0 && temp >0)
{
for(int k=temp;k{
pane[k-1][j]=pane[k][j];
}
pane[MAX-1][j]=0;
temp--;
if(pane[temp-1][j]>0)
{
i=j=0;
break;
}
}
}
}
void downMove()
{
int temp;
for(int j=0;j<=MAX-1;j++)
for(int i=0;i<=MAX-1;i++)
{
temp=i;
if(pane[temp][j]==pane[temp+1][j] && pane[temp][j]>0)
{
pane[temp+1][j]=pane[temp+1][j]*2;
for(int k=temp-1;k>=0;k--)
{
pane[k+1][j]=pane[k][j];
}
pane[0][j]=0;
}
while(pane[temp][j]>0 && pane[temp+1][j]==0 && temp{
for(int k=temp;k>=0;k--)
{
pane[k+1][j]=pane[k][j];
}
pane[0][j]=0;
temp++;
if(pane[temp+1][j]>0)
{
i=j=0;
break;
}
}
}
}
void leftMove()
{
int temp;
for(int j=0;j<=MAX-1;j++)
for(int i=0;i<=MAX-1;i++)
{
temp=j;
if(pane[i][temp]==pane[i][temp-1] && pane[i][temp]>0)
{
pane[i][temp-1]=pane[i][temp-1]*2;
for(int k=temp+1;k{
pane[i][k-1]=pane[i][k];
}
pane[i][MAX-1]=0;
}
while(pane[i][temp]>0 && pane[i][temp-1]==0 && temp>0)
{
for(int k=temp;k{
pane[i][k-1]=pane[i][k];
}
pane[i][MAX-1]=0;
temp--;
if(pane[i][temp-1]>0)
{
i=j=0;
break;
}
}
}
}
void rightMove()
{
int

temp;
for(int j=0;j<=MAX-1;j++)
for(int i=0;i<=MAX-1;i++)
{
temp=j;
if(pane[i][temp]==pane[i][temp+1] && pane[i][temp]>0)
{
pane[i][temp+1]=pane[i][temp+1]*2;
for(int k=temp-1;k>=0;k--)
{
pane[i][k+1]=pane[i][k];
}
pane[i][0]=0;
}
while(pane[i][temp]>0 && pane[i][temp+1]==0 && temp{
for(int k=temp;k>=0;k--)
{
pane[i][k+1]=pane[i][k];
}
pane[i][0]=0;
temp++;
if(pane[i][temp+1]>0)
{
i=j=0;
break;
}
}
}
}
bool allNum()
{
for(int i=0;i{
for(int j=0;j{
if(pane[i][j]==0)
{
return false;
}
}
}
return true;
}
int addNewNum()
{
int p,q;
int temp;
if(allNum())
{
return 0;
}
srand((unsigned)time(NULL));
do
{
p=rand()%MAX;
q=rand()%MAX;
}
while(pane[p][q]!=0);
temp=rand()%2;
if(temp==0)
{
pane[p][q]=2;
}
else
{
pane[p][q]=4;
}
return 0;
}
int testup() //能否上移测试
{
int flag=0;
for(int j=0;j<=MAX-1;j++)
for(int i=0;i{
if((if2n(pane[i][j]+pane[i+1][j])==1)&&pane[i+1][j])
{
flag=1;
}
}
return flag;
}
int testdown() //测试能否下移
{
int flag=0;
for(int j=0;j<=MAX-1;j++)
for(int i=MAX-1;i>0;i--)
{
if((if2n(pane[i][j]+pane[i-1][j])==1)&&pane[i-1][j])
{
flag=1;
}
}
return flag;
}
int testleft() //测试能否左移
{
int flag=0;
for(int i=0;i<=MAX-1;i++)
for(int j=0;j{
if((if2n(pane[i][j]+pane[i][j+1])==1)&&pane[i][j+1])
{
flag=1;
}
}
return flag;
}
int testright() //测试能否右移
{
int flag=0;
for(int i=0;i<=MAX-1;i++)
for(int j=MAX-1;j>0;j--)
{
if((if2n(pane[i][j]+pane[i][j-1])==1)&&pane[i][j-1])
{
flag=1;
}
}
return flag;
}
int GetDirection() //读取方向
{
int ret = 0;
do
{
int ch = _getch();
if(isascii(ch))
continue;
ch = _getch();
switch(ch)
{
case 72:
ret = 2; // top
break;
case 75:
ret = 1; // left
break;
case 77:
ret = 3; // right
break;
case 80:
ret = 4; // down
break;
default:
break;
}
} while (ret == 0);
return ret;
}
int ifGameOver()//判断是否游戏结束
{
int flag=0;
if(testup()+ testdown() + testleft() + testright() == 0)
{
cout<flag=1;
}
return flag;
}
int main()
{
newgame();
showpane();
while(ifGameOver()==0)
{
int c=GetDirection();
switch(c)
{
case 1:
leftMove();
break;
case 2:
upMove();
break;
case 3:
rightMove();
break;
case 4:
do

wnMove();
break;
}
addNewNum();
system("cls");
showpane();
}
cout<<"游戏结束"<system("pause");
return 0;
}

相关主题
文本预览
相关文档 最新文档