/*游戏2048
通过上,下,左,右,四个不同的操作键对屏幕上的数字进行操作。
按上可以将元素都移到上面,并对通过一列相邻且相同的数字进行求和,并
输出。下,左,右的操作类似。
每次操作屏幕上多一个数,直到屏幕填满且无相邻的相同数字,游戏结束。
输出分数*/
#include <iostream>
#include <conio.h>
using namespace std;
bool isfull(int photo[4][4])
{
int line,low,k=0;
for(line=0;line<4;line++)
for(low=0;low<4;low++)
if(photo[line][low]!=0)
k++;
if(k==16)
return false;
else
return true;
}
bool full(int photo[4][4])
{
int line,low,k=0;
for(line=0;line<4;line++)
for(low=0;low<4;low++)
{
if((photo[line][low]!=photo[line][low+1])&&(photo[line][low]!=photo[line][low-1])&&(photo[line][low]!=photo[line+1][low])
&&(photo[line][low]!=photo[line-1][low])&&(photo[line][low]!=0))
k++;
}
if(k==16)
return false;
else
return true;
}
bool success(int photo[4][4])
{
int line,low,k=0;
for(line=0;line<4;line++)
for(low=0;low<4;low++)
if(photo[line][low]==2048)
k=1;
if(k==1)
return true;
else
return false;
}
void left(int photo[4][4])
{
int line,low,k;
int p[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
int q[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
for(line=0;line<4;line++)//左移,且将值给p
for(low=0,k=0;low<4;low++)
{
if(photo[line][low]!=0)
{
p[line][k]=photo[line][low];
k++;
}
}
for(line=0;line<4;line++)//将结果再给photo
for(low=0;low<4;low++)
photo[line][low]=p[line][low];
for(line=0;line<4;line++)//相同值做加法
for(low=0;low<4;low++)
{
if(photo[line][low]==photo[line][low+1])
{
photo[line][low]=photo[line][low]+photo[line][low+1];
photo[line][low+1]=0;
}
}
for(line=0;line<4;line++)//再次左移
for(low=0,k=0;low<4;low++)
{
if(photo[line][low]!=0)
{
q[line][k]=photo[line][low];
k++;
}
}
for(line=0;line<4;line++)//最后结果赋值
for(low=0;low<4;low++)
photo[line][low]=q[line][low];
}
void up(int photo[4][4])
{
int line,low,k;
int p[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
int q[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
for(low=0;low<4;low++)
for(line=0,k=0;line<4;line++)
{
if(photo[line][low]!=0)
{
p[k][low]=photo[line][low];
k++;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=p[line][low];
for(low=0;low<4;low++)
for(line=0;line<4;line++)
{
if(photo[line][low]==photo[line+1][low])
{
photo[line][low]=photo[line][low]+photo[line+1][low];
photo[line+1][low]=0;
}
}
for(low=0;low<4;low++)
for(line=0,k=0;line<4;line++)
{
if(photo[line][low]!=0)
{
q[k][low]=photo[line][low];
k++;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=q[line][low];
}
void right(int photo[4][4])
{
int line,low,k;
int p[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
int q[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
for(line=0;line<4;line++)
for(low=3,k=3;low>=0;low--)
{
if(photo[line][low]!=0)
{
p[line][k]=photo[line][low];
k--;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=p[line][low];
for(line=0;line<4;line++)
for(low=3;low>=0;low--)
{
if(photo[line][low]==photo[line][low-1])
{
photo[line][low]=photo[line][low]+photo[line][low-1];
photo[line][low-1]=0;
}
}
for(line=0;line<4;line++)
for(low=3,k=3;low>=0;low--)
{
if(photo[line][low]!=0)
{
q[line][k]=photo[line][low];
k--;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=q[line][low];
}
void down(int photo[4][4])
{
int line,low,k;
int p[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
int q[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
for(low=0;low<4;low++)
for(line=3,k=3;line>=0;line--)
{
if(photo[line][low]!=0)
{
p[k][low]=photo[line][low];
k--;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=p[line][low];
for(low=0;low<4;low++)
for(line=3;line>=0;line--)
{
if(photo[line][low]==photo[line-1][low])
{
photo[line][low]=photo[line][low]+photo[line-1][low];
photo[line-1][low]=0;
}
}
for(low=0;low<4;low++)
for(line=3,k=3;line>=0;line--)
{
if(photo[line][low]!=0)
{
q[k][low]=photo[line][low];
k--;
}
}
for(line=0;line<4;line++)
for(low=0;low<4;low++)
photo[line][low]=q[line][low];
}
void add(int photo[4][4])
{
int i,j,k=0;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
if(photo[j][i]==0)
{
photo[j][i]=2;
k=1;
break;
}
if(k==1)
break;
}
}
void out(int photo[4][4])
{
int i,j;
for(j=0;j<4;j++)
{
cout<<endl<<"\t\t\t";
for(i=0;i<4;i++)
{
if(photo[j][i]>=0&&photo[j][i]<10)
cout<<photo[j][i]<<" ";
else if(photo[j][i]>10&&photo[j][i]<99)
cout<<photo[j][i]<<" ";
else if(photo[j][i]>100&&photo[j][i]<999)
cout<<photo[j][i]<<" ";
else
cout<<photo[j][i]<<" ";
}
}
}
void main()
{
int photo[4][4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
int num=0;
char op;
cout<<"\t\t\t 欢迎来到2048"<<endl;
out(photo);
cout<<endl<<"任意点击开始"<<endl;
getch();
system("cls");
add(photo);
add(photo);
out(photo);
do
{
cout<<endl<<"请输入你的操作:";
cout<<"向上选8或w,向下选2或s,向左选4或a,向右选6或d"<<endl;
cin>>op;
system("cls");
switch(op)
{
case 'w':
case '8':up(photo);
break;
case 's':
case '2':down(photo);
break;
case 'a':
case '4':left(photo);
break;
case 'd':
case '6':right(photo);
break;
default :cout<<"输入错误。"<<endl;
}
if(isfull(photo))
add(photo);
out(photo);
num++;
}while(full(photo)&&!success(photo));
if(success(photo))
{
cout<<endl<<"你赢了!!!"<<endl;
cout<<"最后得分"<<num<<endl;
}
else
{
cout<<endl<<"游戏结束!!!"<<endl;
cout<<"最后得分"<<num<<endl;
}
}
个人原创,转载注明
C++版2048(控制台)
最新推荐文章于 2024-07-19 09:25:33 发布