用C语言实现2048游戏

 更新时间:2021年07月28日 14:45:51   作者:he海ng  
这篇文章主要为大家详细介绍了用C语言实现2048游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

我遇到的几个问题:

问题1:如何显示?

system("clear");//清屏

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

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

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

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

问题3:随机位置?

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

代码:

#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;
}

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

相关文章

  • C语言中栈和队列实现表达式求值的实例

    C语言中栈和队列实现表达式求值的实例

    这篇文章主要介绍了C语言中栈和队列实现表达式求值的实例的相关资料,这里主要是对数据结构中栈和队列的理解和应用,需要的朋友可以参考下
    2017-08-08
  • C++二分查找(折半查找)算法实例详解

    C++二分查找(折半查找)算法实例详解

    这篇文章主要介绍了C++二分查找(折半查找)算法,结合实例形式详细分析了二分查找算法的原理、思想、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C++中引用传递与指针传递的区别(面试常见)

    C++中引用传递与指针传递的区别(面试常见)

    这篇文章主要介绍了C++中引用传递与指针传递的区别(面试常见),需要的朋友可以参考下
    2018-03-03
  • C语言中.c和.h文件区别讲解

    C语言中.c和.h文件区别讲解

    这篇文章主要介绍了C语言中.c和.h文件区别讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是本文的详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现LeetCode(61.旋转链表)

    C++实现LeetCode(61.旋转链表)

    这篇文章主要介绍了C++实现LeetCode(61.旋转链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现选择性排序(SelectionSort)

    C++实现选择性排序(SelectionSort)

    这篇文章主要为大家详细介绍了C++实现选择性排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • OpenCV cv.Mat与.txt文件数据的读写操作

    OpenCV cv.Mat与.txt文件数据的读写操作

    这篇文章主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,现在分享给大家,也给大家做个参考
    2018-05-05
  • C++中new和delete的介绍

    C++中new和delete的介绍

    今天小编就为大家分享一篇关于C++中new和delete的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言中储存类别与内存管理的深入理解

    C语言中储存类别与内存管理的深入理解

    这篇文章主要给大家介绍了关于C语言中储存类别与内存管理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++命名空间实例详解

    C++命名空间实例详解

    这篇文章主要介绍了C++命名空间实例详解,有感兴趣的同学可以研究下
    2021-02-02

最新评论