这篇文章主要介绍了C语言代码如何实现2048游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
我是大一新生,在寒假的实训课上老师让我们用c语言分组编程一个小游戏,我们组选的是“2048”。由于我们组上有一个大神,于是我们把大部分的工作交给了大神做,但是实训完成之后我感觉到碌碌无为,什么也没学到,自己对于c语言的理解也仅仅局限于书本之上,想到那些大神们已经基本可以自己编程一些小游戏了,心里就非常着急。于是利用这个寒假,我自己独立完成了“2048”小游戏的编程。
游戏代码我是用Xcode编的,我是IOS小白,有些头文件在Xcode中不能使用而我又找不到可以替代的,所以一些功能就不能实现比如清屏功能和储存数据的功能还有音乐功能,不仅如此还存在数字对不齐的问题。希望可以有大神能够指导我,万分感激!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<curses.h>
/*头文件*/
int i,j,a[4][4]={};/*二维数组a[4][4]全为0*/
void kaishi()/*生成开始界面*/
{
printf("Welcome to 2048\n");
printf(" 1).新游戏\n");
printf(" 2).帮助\n");
}
int defen(int a[][4])/*计分函数*/
{
int max=a[0][0];
int static sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
max=a[i][j];
sum+=max;
return sum;/*以最大数的累加作为得分*/
}
void jiemian(int a[][4])
{
int b[2]={2,4},c[4]={0,1,2,3},sum,n,m;
do
{
srand((int)time(NULL));/*以时间作为随机数种子*/
m=c[rand()%4];
n=c[rand()%4];
/*随机生成坐标*/
if(a[m][n]==0)/*判断是否为空格*/
{
a[m][n]=b[rand()%2];/*随机生成2或4*/
break;/*跳出循环*/
}
}while(1);
printf("%d %d %d\n",m,n,a[m][n]);
for(i=0;i<4;i++)
{
printf("-------------------------\n");
for(j=0;j<4;j++)
{
if((m==i)&&(n==j))
printf("| %d ",a[m][n]);/*输出随机生成的2或4*/
else
{
if(a[i][j]>0)
printf("| %d ",a[i][j]);/*如果a[i][j]有数字,则输出数字*/
else
printf("| ");/*如果a[i][j]无数字则输出空格*/
}
}
printf("|\n");
}
printf("-------------------------\n");
printf(" 得分:%d\n",sum=defen(a));
}
void hebingup(int a[][4])/*向上合并*/
{
int m;
for(j=0;j<4;j++)
for(i=0;i<3;i++)
if(a[i][j]>0)/*若a[i][j]不为0则进行判断,否则直接跳到下一项*/
if(a[i][j]==a[i+1][j]&&a[i][j]!=0)/*判读相邻两项是否相等*/
{
a[i][j]=2*a[i][j];/*上面一项变成两倍*/
if(i==2)
a[i+1][j]=0;
else
for(m=i+1;m<3;m++)
{
a[m][j]=a[m+1][j];
a[m+1][j]=0;
}
/*将下面的数整体上移,再循环*/
}
}
void hebingdown(int a[][4])/*向下合并*/
{
int m;
for(j=0;j<4;j++)
for(i=3;i>0;i--)
if(a[i][j]>0)
if(a[i][j]==a[i-1][j])
{
a[i][j]=2*a[i][j];
if(i==1)
a[i-1][j]=0;
else
for(m=i-1;m>0;m--)
{
a[m][j]=a[m-1][j];
a[m-1][j]=0;
}
}
}
void hebingleft(int a[][4])/*向左合并*/
{
int m;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
if(a[i][j]>0)
if(a[i][j]==a[i][j+1])
{
a[i][j]=2*a[i][j];
if(j==2)
a[i][j+1]=0;
else
for(m=j+1;m<3;m++)
{
a[i][m]=a[i][m+1];
a[i][m+1]=0;
}
}
}
void hebingright(int a[][4])/*向右合并*/
{
int m;
for(i=0;i<4;i++)
for(j=3;j>0;j--)
if(a[i][j]>0)
if(a[i][j]==a[i][j-1])
{
a[i][j]=2*a[i][j];
if(j==1)
a[i][j-1]=0;
else
for(m=j-1;m>0;m--)
{
a[i][m]=a[i][m-1];
a[i][m-1]=0;
}
}
}
void yidong(char b)
{
int x,m;
switch(b)
{
case 'w' :
for(j=0;j<4;j++)
for(i=1;i<=3;i++)
for(x=i,m=i;x>0;x--,m--)/*x为循环次数,m替代i使循环继续*/
{
if(a[m-1][j]>0)
break;/*若上一位非0,则跳到下一位*/
else
{
a[m-1][j]=a[m][j];
a[m][j]=0;
}
}
hebingup(a);
break;
case 's' :
for(j=0;j<4;j++)
for(i=2;i>=0;i--)
for(x=3-i,m=i;x>0;x--,m++)
{
if(a[m+1][j]>0)
break;
else
{
a[m+1][j]=a[m][j];
a[m][j]=0;
}
}
hebingdown(a);
break;
case 'a' :
for(i=0;i<4;i++)
for(j=1;j<=3;j++)
for(x=j,m=j;x>0;x--,m--)
{
if(a[i][m-1]>0)
break;
else
{
a[i][m-1]=a[i][m];
a[i][m]=0;
}
}
hebingleft(a);
break;
case 'd' :
for(i=0;i<4;i++)
for(j=2;j>=0;j--)
for(x=3-j,m=j;x>0;x--,m++)
{
if(a[i][m+1]>0)
break;
else
{
a[i][m+1]=a[i][m];
a[i][m]=0;
}
}
hebingright(a);
break;
}
}
int main(int argc,char *argv[])
{
int flag=1;
char c,k;
system("stty -icanon");
outloop:;
kaishi();
k=getchar();
printf("\n");
if(k=='1')
{
while(flag==1)
{
jiemian(a);
c=getchar();
printf("\n");
yidong(c);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(a[i][j]==0)
{
flag=1;
goto end;/*如果棋盘中存在一个空格,则跳出判断,继续生成随机数*/
}
else
flag=0;
}
end:;
}
}
if(k=='2')
{
do
{
printf("游戏规则:通过点击<w>,<s>,<a>,<d>键来实现数字的上下左右的移动,使相同的数字相加,每个格子中的数的累加将作为得分,当格子填满且无法移动时,游戏结束。\n");
printf(" 3).返回\n");
k=getchar();
}while(k!=3);
goto outloop;/*跳到开始界面*/
}
printf(" 游戏结束\n");
return 0;
}
感谢你能够认真阅读完这篇文章,希望小编分享的“C语言代码如何实现2048游戏”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。