C语言代码实现2048游戏

 更新时间:2020年02月08日 07:26:00   作者:我是zcy啊  
这篇文章主要为大家详细介绍了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++类型转换运算符的实例详解

    C++类型转换运算符的实例详解

    这篇文章主要介绍了C++类型转换运算符的实例详解的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Qt利用QPainter实现基本绘图的示例详解

    Qt利用QPainter实现基本绘图的示例详解

    Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。本文主要和大家介绍一下QPainter实现的基本绘图,感兴趣的可以了解一下
    2022-12-12
  • C语言数组全面详细讲解

    C语言数组全面详细讲解

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-05-05
  • 深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    这篇文章主要介绍了深入理解C++中的new/delete和malloc/free动态内存管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • C语言中的文件操作详解

    C语言中的文件操作详解

    这篇文章主要介绍了C语言中的文件操作详解,使用文件可以将数据直接存放到电脑的硬盘上,做到了数据的持久化
    2022-07-07
  • C语言中的二叉树和堆详解

    C语言中的二叉树和堆详解

    这篇文章主要介绍了C语言中的二叉树和堆详解,树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的,需要的朋友可以参考下
    2023-07-07
  • C语言实例讲解四大循环语句的使用

    C语言实例讲解四大循环语句的使用

    C语言有四大循环语句,他们之间可以进行任意转换。本文将首先对其语法进行讲解,然后通过一个实例用四种循环来实现。相信通过本文的学习,大家都能够对C语言循环语句有着熟练的掌握
    2022-05-05
  • C++11新特性之列表初始化的具体使用

    C++11新特性之列表初始化的具体使用

    在我们实际编程中,我们经常会碰到变量初始化的问题,本文主要介绍了C++11新特性之列表初始化的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • LoadLibrary深入案例详解

    LoadLibrary深入案例详解

    这篇文章主要介绍了LoadLibrary深入案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++函数返回值为对象时,构造析构函数的执行细节

    C++函数返回值为对象时,构造析构函数的执行细节

    C++函数返回值为对象时,构造析构函数的执行细节,需要的朋友,可以参考下
    2013-02-02

最新评论