2048c语言程序,C语言代码实现2048游戏

我是大一新生,在寒假的实训课上老师让我们用c语言分组编程一个小游戏,我们组选的是“2048”。由于我们组上有一个大神,于是我们把大部分的工作交给了大神做,但是实训完成之后我感觉到碌碌无为,什么也没学到,自己对于c语言的理解也仅仅局限于书本之上,想到那些大神们已经基本可以自己编程一些小游戏了,心里就非常着急。于是利用这个寒假,我自己独立完成了“2048”小游戏的编程。

游戏代码我是用Xcode编的,我是IOS小白,有些头文件在Xcode中不能使用而我又找不到可以替代的,所以一些功能就不能实现比如清屏功能和储存数据的功能还有音乐功能,不仅如此还存在数字对不齐的问题。希望可以有大神能够指导我,万分感激!

#include

#include

#include

#include

/*头文件*/

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("游戏规则:通过点击,,,键来实现数字的上下左右的移动,使相同的数字相加,每个格子中的数的累加将作为得分,当格子填满且无法移动时,游戏结束。\n");

printf(" 3).返回\n");

k=getchar();

}while(k!=3);

goto outloop;/*跳到开始界面*/

}

printf(" 游戏结束\n");

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值