(1)游戏简介:
2048是一款程序员对于数字敏感程度训练的一款游戏,简单易上手。可谓是老少皆宜哇。
(2)规则与玩法 :
随机产生2或4,通过方向键或者w/a/s/d键来实现数字移动,相同数字碰撞会相加,不同数字碰撞会出现一个新的随机值2/4,知道数字铺满游戏界面且没有可碰撞的相同数字,则游戏结束。
(3)代码实现:
是不是感(jio)挺简单,不过对于我这种菜鸡刚开始还是有些问题,不过经过几天的思考和调试也还算是比较顺利的完成了。二维数组、循环、简单的交互就可以实现,废话不多说,直接上代码。
不足之处还请多多指教!
#include<iostream>
#include<cstdio>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
using namespace std;
int mp[4][4],score;
bool map[4][4];
bool cal[4][4];
void DeBug()
{
for(int i=0;i<4;++i)//定义二位数组空格子
{
for(int j=0;j<4;++j)
cout<<map[i][j]<<" ";
cout<<endl;
}
cout<<endl;
for(int i=0;i<4;++i)
{
for(int j=0;j<4;++j)
cout<<mp[i][j]<<" ";
cout<<endl;
}
}
void print()//4x4网格
{
for(int j=0;j<4;++j)
printf("----");
printf("\n");
for(int i=0;i<4;++i)
{
for(int j=0;j<4;++j)
{
printf("|");
if(map[i][j])
{
if(score<mp[i][j])
score=mp[i][j];
printf("%3d",mp[i][j]);
}
else
printf(" ");
}
printf("|\n");
for(int j=0;j<4;++j)
{
printf("----");
}
printf("\n");
}
printf("w /W: up s/S : down a/A : left d/D : right\n");
printf("按 'r' 开始新游戏\n按 'e' 退出游戏\n");
}
void MoveUp()//上移
{
bool flag;
for(int i=1;i<4;++i)
{
for(int j=0;j<4;++j)
{
if(!map[i][j])
continue;
flag=false;
int pos=i;
for(int k=i-1;k>=0;--k)
{
if(!map[k][j])
{
pos=k;
continue;
}
if((mp[k][j]==mp[i][j])&&(!cal[k][j]))
{
mp[k][j]+=mp[i][j];
cal[k][j]=true;
flag=true;
map[i][j]=false;
}
else
break;
}
if(!flag){
mp[pos][j]=mp[i][j];
map[i][j]=false;
map[pos][j]=true;
}
}
}
}
void MoveDown()//下移
{
bool flag;
for(int i=2;i>=0;--i)
{
for(int j=0;j<4;++j)
{
if(!map[i][j])
continue;
flag=false;
int pos=i;
for(int k=i+1;k<4;++k)
{
if(!map[k][j])
{
pos=k;
continue;
}
if((mp[k][j]==mp[i][j])&&(!cal[k][j]))
{
mp[k][j]+=mp[i][j];
cal[k][j]=true;
flag=true;
map[i][j]=false;
}
else
break;
}
if(!flag){
mp[pos][j]=mp[i][j];
map[i][j]=false;
map[pos][j]=true;
}
}
}
}
void MoveRight()//右移
{
bool flag;
for(int i=0;i<4;++i)
{
for(int j=2;j>=0;--j)
{
if(!map[i][j])
continue;
flag=false;
int pos=j;
for(int k=j+1;k<4;++k)
{
if(!map[i][k])
{
pos=k;
continue;
}
if((mp[i][k]==mp[i][j])&&(!cal[i][k]))
{
mp[i][k]+=mp[i][j];
cal[i][k]=true;
flag=true;
map[i][j]=false;
}
else
break;
}
if(!flag){
mp[i][pos]=mp[i][j];
map[i][j]=false;
map[i][pos]=true;
}
}
}
}
void MoveLeft()//左移
{
bool flag;
for(int i=0;i<4;++i)
{
for(int j=1;j<4;++j)
{
if(!map[i][j])
continue;
flag=false;
int pos=j;
for(int k=j-1;k>=0;--k)
{
if(!map[i][k])
{
pos=k;
continue;
}
if((mp[i][k]==mp[i][j])&&(!cal[i][k]))
{
mp[i][k]+=mp[i][j];
cal[i][k]=true;
flag=true;
map[i][j]=false;
}
else
break;
}
if(!flag)
{
mp[i][pos]=mp[i][j];
map[i][j]=false;
map[i][pos]=true;
}
}
}
}
void Init()
{
srand(time(NULL));//产生随机值
int x,y,v,now=0;
for(int i=0;i<4;++i)
{
for(int j=0;j<4;++j)
{
if(!map[i][j])
now++;
}
}
if(now==0)
return;
int cnt=rand()%now,n=0;
bool flag=false;
for(int i=0;i<4;++i)
{
flag=false;
for(int j=0;j<4;++j)
if(!map[i][j])
{
if(cnt==n)
{
x=i;
y=j;
flag=true;
break;
}else
n++;
}
if(flag)
break;
}
v=rand()%2;
if(v)
v=4;
else
v=2;
mp[x][y]=v;
map[x][y]=true;
}
bool gameover()
{
for(int i=0;i<4;++i)
{
for(int j=0;j<4;++j)
{
if(!map[i][j])
return false;
if(i>0)
{
if(mp[i-1][j]==mp[i][j])
return false;
}
if(j>0)
if(mp[i][j-1]==mp[i][j])
return false;
}
}
return true;
}
void Lose()
{
char ch;
system("cls");
printf("*******************\n");
printf("****游戏结束 ****\n");
printf("**** 您的得分:%3d ****\n",score);
printf("*******************\n\n");
printf("请按任意键继续...\n");
ch=getch();
return ;
}
void Win()
{
char ch;
system("cls");//清屏
printf("*******************\n");
printf("**** 恭喜您胜利啦 ****\n");
printf("*******************\n\n");
printf("请按任意键继续...\n");
ch=getch();
return ;
}
void start()
{
system("cls");
printf("*************************\n");
printf("* 游戏加载中,请稍后... *\n");
printf("*************************\n");
int x=(int)5e8;
bool flag=false;
while(x--);
memset(mp,0,sizeof(mp));
memset(map,false,sizeof(map));
score=0;
char ch;
while(!gameover())
{
memset(cal,false,sizeof(cal));
int cnt=0;
system("cls");
Init();
print();
// DeBug();
ch=getch();
switch (ch)
{
case 'w':
case 'W':
MoveUp();break;
case 's':
case 'S':
MoveDown();break;
case 'a':
case 'A':
MoveLeft();break;
case 'd':
case 'D':
MoveRight();break;
case 'e':exit(0);
case 'r':return ;
}
if(score>=2048){
flag=true;
break;
}
}
if(flag)
Win();
else
Lose();
return ;
}
int main()
{
char ch;
while(1)
{
system("cls");
printf(" 欢迎来到@阿龙儿的2048\n\n");
printf("按Enter键开始游戏叭\n\n退出请按Esc键\n");
ch=getch();
if(ch==13)
start();
else if(ch==27)
break;
}
return 0;
}