C语言编程小游戏.docx
《C语言编程小游戏.docx》由会员分享,可在线阅读,更多相关《C语言编程小游戏.docx(12页珍藏版)》请在冰豆网上搜索。
C语言编程小游戏
C语言编程2048小游戏
/*ByReason*/
#include
#include
#include
#include
#include
#include//为了读取方向键
#include
usingnamespacestd;//srand((unsigned)time(NULL));//随机数种子不能用在这里intpane[4][4];//棋盘
intN=1;//2的n次方
voidshowpane()//显示棋盘
{
cout<cout<for(inti=0;i<=3;i++)
{
cout<for(intj=0;j<=3;j++)
{
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
cout<(2)<<"|"<if(j==3)
{
cout<(2)<<"|"<cout<}
}
}
}
voidnewgame()//开始游戏
{
N=1;
for(inti=0;i<=3;i++)//初始化棋盘
for(intj=0;j<=3;j++)
pane[i][j]=0;
srand((unsigned)time(NULL));
intm=rand()%4;
intn=rand()%4;
intp=rand()%4;
intq=rand()%4;
pane[m][n]=pane[p][q]=2;
showpane();
}
intif2n(intx)//判断x是否是2的n次方{
intflag=0;
for(intn=1;n<=11;n++)
{
if(x==pow(2,n))
{
flag=1;
if(n>N)
N=n;
returnflag;
}
}
returnflag;
}
intupmove()//上移
{
intflag=0;
for(intj=0;j<=3;j++)
for(inti=0;i<3;i++)
{
if(if2n(pane[i][j]+pane[i+1][j])==1)
{
pane[i][j]=pane[i][j]+pane[i+1][j];
pane[i+1][j]=0;
flag=1;
}
}
returnflag;
}
intdownmove()//下移
{
intflag=0;
for(intj=0;j<=3;j++)
for(inti=3;i>0;i--)
{
if(if2n(pane[i][j]+pane[i-1][j])==1)
{
pane[i][j]=pane[i][j]+pane[i-1][j];
pane[i-1][j]=0;
flag=1;
}
}
returnflag;
}
intleftmove()//左移
{
intflag=0;
for(inti=0;i<=3;i++)
for(intj=0;j<3;j++)
{
if(if2n(pane[i][j]+pane[i][j+1])==1)
{
pane[i][j]=pane[i][j]+pane[i][j+1];
pane[i][j+1]=0;
flag=1;
}
}
returnflag;
}
intrightmove()//右移
{
intflag=0;
for(inti=0;i<=3;i++)
for(intj=3;j>0;j--)
{
if(if2n(pane[i][j]+pane[i][j-1])==1)
{
pane[i][j]=pane[i][j]+pane[i][j-1];
pane[i][j-1]=0;
flag=1;
}
}
returnflag;
}
inttestup()//能否上移测试
{
intflag=0;
for(intj=0;j<=3;j++)
for(inti=0;i<3;i++)
{
if(if2n(pane[i][j]+pane[i+1][j])==1)
{
flag=1;
}
}
returnflag;
}
inttestdown()//测试能否下移
{
intflag=0;
for(intj=0;j<=3;j++)
for(inti=3;i>0;i--)
{
if(if2n(pane[i][j]+pane[i-1][j])==1)
{
flag=1;
}
}
returnflag;
}
inttestleft()//测试能否左移
{
intflag=0;
for(inti=0;i<=3;i++)
for(intj=0;j<3;j++)
{
if(if2n(pane[i][j]+pane[i][j+1])==1)
{
flag=1;
}
}
returnflag;
}
inttestright()//测试能否右移
{
intflag=0;
for(inti=0;i<=3;i++)
for(intj=3;j>0;j--)
{
if(if2n(pane[i][j]+pane[i][j-1])==1)
{
flag=1;
}
}
returnflag;
}
intpanemax()//棋盘最大数
{
intmax=pane[0][0];
for(inti=0;i<=3;i++)
for(intj=0;j<=3;j++)
if(pane[i][j]>max)
max=pane[i][j];
returnmax;
}
intifwin()//判断是否胜利
{
intflag=0;
if(panemax()==2048)
{
cout<"<flag=1;
}
returnflag;
}
intifGameOver()//判断是否游戏结束
{
intflag=0;
if(testup()+testdown()+testleft()+testright()==0)
{
cout<"<flag=1;
}
returnflag;
}
voidaddnewnumberup()//上移后添加新数{
srand((unsigned)time(NULL));
intn;
if(N==1)
n=1;
else
n=(rand()%(N)+1);
intnewnumber=pow(2,n);
for(inti=3;i>=0;i--)
for(intj=0;j<=3;j++)
if(pane[i][j]==0)
{
pane[i][j]=newnumber;
return;
}
}
voidaddnewnumberdown()//下移后添加新数
{
srand((unsigned)time(NULL));
intn;
if(N==1)
n=1;
else
n=(rand()%(N)+1);intnewnumber=pow(2,n);
for(inti=0;i<=3;i++)
for(intj=0;j<=3;j++)
if(pane[i][j]==0)
{
pane[i][j]=newnumber;
return;
}
}
voidaddnewnumberleft()//左移后添加新数{
srand((unsigned)time(NULL));
intn;
if(N==1)
n=1;
else
n=(rand()%(N)+1);
intnewnumber=pow(2,n);
for(intj=3;j>=0;j--)
for(inti=0;i<=3;i++)
if(pane[i][j]==0)
{
pane[i][j]=newnumber;
return;
}
}
voidaddnewnumberright()//右移后添加新数{
srand((unsigned)time(NULL));
intn;
if(N==1)
n=1;
else
n=(rand()%(N)+1);
intnewnumber=pow(2,n);
for(intj=0;j<=3;j++)
for(inti=0;i<=3;i++)
if(pane[i][j]==0)
{
pane[i][j]=newnumber;
return;
}
}
intGetDirection()//读取方向
{
intret=0;
do
{
intch=_getch();
if(isascii(ch))
continue;
ch=_getch();
switch(ch)
{
case72:
ret=2;//top
break;
case75:
ret=1;//left
break;
case77:
ret=3;//right
break;
case80:
ret=4;//down
break;
default:
break;
}
}while(ret==0);
returnret;
}
voidmain()//主函数
{
system("colorf9");
intmakesure=1;
while(makesure)
{
system("cls");
newgame();
while(ifwin()+ifGameOver()==0)
{
intc=GetDirection();
switch(c)
{
case2:
upmove();
addnewnumberup();
system("cls");
showpane();
break;
case4:
downmove();
addnewnumberdown();
system("cls");
showpane();
break;
case1:
leftmove();
addnewnumberleft();
system("cls");
showpane();
break;
case3:
rightmove();
addnewnumberright();
system("cls");
showpane();
break;
default:
break;
}
}
cout<"<cout<"<cin>>makesure;
while(makesure!
=1&&makesure!
=0)
{
cout<<"输入不正确,请重新输入!
"<cin>>makesure;
}
}
cout<<"再见~"<system("pause");
}