用C语言实现2048游戏

这篇文章主要为大家详细介绍了用C语言实现2048游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C语言实现2048游戏,久久派带你了解更多相关信息。

本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,具体内容如下

我遇到的几个问题:

问题1:如何显示?

system(\”clear\”);//清屏

每次发生变化就清屏一次,再把内容打印出来

问题2:怎么用键盘控制?

w,s,a,d–>上下左右

system(\”stty -icanon\”);//关闭缓冲区,输入字符无需回车直接接受

问题3:随机位置?

用srand()与rand()产生随机数(x,y),再判断位置(x,y)是否为空格,不是空格就继续产生随机位置;若该位置为空格,则随机赋值2或4.

用C语言实现2048游戏

代码:

#include <stdio.h>#include <stdlib.h>#include <time.h>  int a[4][4];int i,j,k; int move_up(){ int f=0;//有移动过,则f=1,没移动过则为0 for(j=0;j<4;j++) {  for(i=1;i<4;i++)  {   if(a[i][j]!=0)//找到不是0的数   {    for(k=0;k<i;k++)    {     if(a[k][j]==0)//其上的第一个0     {      a[k][j]=a[i][j];      a[i][j]=0;      f=1;      break;     }    }   }  } } return f;} int move_down(){ int f=0; for(j=0;j<4;j++) {  for(i=2;i>=0;i--)  {   if(a[i][j]!=0)   {    for(k=3;k>i;k--)    {     if(a[k][j]==0)     {      a[k][j]=a[i][j];      a[i][j]=0;      f=1;      break;     }    }   }  } } return f;} int move_left(){ int f=0; for(i=0;i<4;i++) {  for(j=1;j<4;j++)  {   if(a[i][j]!=0)   {    for(k=0;k<j;k++)    {     if(a[i][k]==0)     {      a[i][k]=a[i][j];      a[i][j]=0;      f=1;      break;     }    }   }  } } return f;} int move_right(){ int f=0; for(i=0;i<4;i++) {  for(j=2;j>=0;j--)  {   if(a[i][j]!=0)   {    for(k=3;k>j;k--)    {     if(a[i][k]==0)     {      a[i][k]=a[i][j];      a[i][j]=0;      f=1;      break;     }    }   }  } } return f;}  int up(){ int f=0;//合并过,f=1,没和并过则为0 //移动 int f1=move_up();//移动过f1=1 //合并 for(j=0;j<4;j++) {  for(i=0;i<3;i++)  {   if(a[i][j]==a[i+1][j]&&a[i][j]!=0)   {    a[i][j]=2*a[i][j];    a[i+1][j]=0;    f=1;   }  } } if(f==1)//若合并后可能产生的空位,再移动  move_up(); return (f||f1);//移动过或合并过,则返回1;否则返回0} int down(){ int f=0; //移动 int f1=move_down(); //合并 for(j=0;j<4;j++) {  for(i=3;i>0;i--)  {   if(a[i][j]==a[i-1][j]&&a[i][j]!=0)   {    a[i][j]=2*a[i][j];    a[i-1][j]=0;    f=1;   }  } } if(f==1)//若合并后产生的空位,  move_down(); return (f||f1);} int left(){ int f=0; //移动 int f1=move_left(); //合并 for(i=0;i<4;i++) {  for(j=0;j<3;j++)  {   if(a[i][j]==a[i][j+1]&&a[i][j]!=0)   {    a[i][j]=2*a[i][j];    a[i][j+1]=0;    f=1;   }  } } if(f==1)//若合并后产生的空位,  move_left(); return (f||f1);} int right(){ int f=0; //移动 int f1=move_right(); //合并 for(i=3;i>=0;i--) {  for(j=3;j>0;j--)  {   if(a[i][j]==a[i][j-1]&&a[i][j]!=0)   {    a[i][j]=2*a[i][j];    a[i][j-1]=0;    f=1;   }  } } if(f==1)//若合并后产生的空位,  move_right(); return (f||f1);}  int ran()//随机数{ int z[8]={2,2,2,2,2,2,2,4};//出现2的概率比出现4的概率大 srand(time(NULL));lb: i=rand()%4; j=rand()%4; //随机位置的值为0,则随机赋值2或4;否则继续找随机位置 if(a[i][j]==0)  a[i][j]=z[rand()%8]; else  goto lb;}  int fail()//失败{ int count=0; for(i=0;i<4;i++) {  for(j=0;j<3;j++)  {   if(a[i][j]==a[i][j+1])//左右相邻相等--》还没输   {    return 0;   }  } } for(i=0;i<3;i++) {  for(j=0;j<4;j++)  {   if(a[i][j]==a[i+1][j])//上下相邻相等--》还没输   {    return 0;   }  } } for(i=0;i<4;i++) {  for(j=0;j<4;j++)  {   if(a[i][j]==0)//统计空格的个数   {    count++;   }  } } if(count==0)//没有空格 {  printf(\"\\n很遗憾!你离成功就差一点了!\\n\");  return 1; } return 0;}   int main(){ char n;//w,s,a,d-->上下左右 system(\"stty -icanon\");//关闭缓冲区,输入字符无需回车直接接受 ran(); while(1) {  //产生随机数  ran();  //显示  system(\"clear\");//清屏  printf(\"\\n---------------------------------\\n\");  for(i=0;i<4;i++)  {   printf(\"|\");   for(j=0;j<4;j++)   {    if(a[i][j]==0)     printf(\"       |\");    else     printf(\"%5d  |\",a[i][j]);   }   printf(\"\\n---------------------------------\\n\");  }  printf(\"\\n\\nw,s,a,d-->上下左右;ESC退出游戏!\\n\");   lab:   n=getchar();  switch(n)  {   case \'w\': //上    if(0==up())//若既不移动又不合并    {     if(1==fail())//判断是不是游戏失败      return -1;     else      goto lab;    }    break;   case \'s\': //下    if(0==down())    {     if(1==fail())      return -1;     else      goto lab;    }    break;   case \'a\': //左    if(0==left())    {     if(1==fail())      return -1;     else      goto lab;    }    break;   case \'d\': //右    if(0==right())    {     if(1==fail())      return -1;     else      goto lab;    }    break;   case 27: //ESC    printf(\"\\n退出游戏!\\n\");    return 0;   default:    goto lab;  }  //判断是否胜利  for(i=0;i<4;i++)  {   for(j=0;j<4;j++)   {    if(a[i][j]==2048)//数值为2048,游戏胜利    {     printf(\"\\n恭喜你!游戏胜利!\\n\");     return 1;//退出    }    }  } }  return 0;}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/7252.html

(0)
上一篇 2021-07-29 03:12:28
下一篇 2021-07-29 03:12:30

相关推荐

  • 中国拟修法确认三孩政策(三孩最新政策出台)

    自从我国放开二胎三胎政策后,大家对于生二孩生三孩的讨论也变得更多了,不少年轻人都觉得生存压力比较大,不愿意生育子女,所以我国的生育率并没有明显上升,我国对于生育三胎政策也进行了一些修改,下面就跟随久久派小编一起来了解一下中国拟修法确认三孩政策,三孩最新政策出台,一对夫妻可以生三胎政策。中国拟修法确认三孩政策人口与计划生育法修正草案8月17日提请十三届全国人

    2021-08-17
    3360
  • 云南虫谷第9集免费完整版(第九集剧情介绍都说了什么内容?)

    云南虫谷第9集高清在线免费完整版第九集剧情介绍都说了什么内容?!胡八一倾尽全力帮助王胖子和Shirley杨荡到栈道上,而他自己却不幸跌落悬崖,所幸崖下石一口深潭,这才令他侥幸未死。此时绝壁上的断虫道,暂时阻挡了痋婴的追击

    2021-09-19
    3350
  • 体检查出是要得痛风了吗(体检查出尿酸高该怎么办)

    现在很多人都会体检,及时发现身体不良状况,当体检发现尿酸的数值比较高,很多人就担心自己得了痛风,那么,是真的有问题吗?体检查出尿酸高怎么办?下面趣讯吧网小编就带来介绍。体检查出

    2021-08-27
    3300
  • 量刑10年是什么意思(判刑十年严重吗)

    法律分析:量刑十年是判处十年有期徒刑。根据相关法律规定,量刑是指裁量刑罚,幅度是指包括的范围,最高点与最低点之间的距离。法官在审判时,没有法定理由,不得超出这个范围,只能在这个范围内根据犯罪的事实、犯罪的性质、情节和对于社会的危害程度给犯罪嫌疑人裁量

    2022-01-11
    1540
  • word2010自动生成目录怎么设置(生成目录的方法总结)

    前段时间有小伙伴问到Word自动生成目录的问题。在此,再详述一下,让大家对目录有个更好的理解和运用。01.目录源问题比如,我们有下列一篇文章:文字有加粗有编号,貌似已经设置好一级标题和二级标题。看样子应该可以自动生成目录了,我们来试一下。定好光标

    2021-12-27 热点头条
    2820
  • 秋分吃螃蟹有什么好处(秋分为什么吃螃蟹)

    秋分时节,我国一些地方有吃螃蟹的习俗,之所以会在这天吃螃蟹,除了是历史传统文化之外,还是因为秋分时间,螃蟹肉质鲜美,尤其母螃蟹有丰富的蟹黄,口感和味道极佳。当然,从功效上来讲,这个时节吃螃蟹是有一定好处的。那么,秋分吃螃蟹有什么好处?秋分为什么吃螃蟹?一起来了解。

    2021-09-22
    3280

发表回复

登录后才能评论