C语言实现2048游戏(ege图形库版)

小编 2026-06-05 阅读:2000 评论:0
这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了。现在和大家分享一下,也希望能得到大神的指点。 实现的效果如图 先来讲一下我的思路吧...

这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了。现在和大家分享一下,也希望能得到大神的指点。

实现的效果如图

\"\"

先来讲一下我的思路吧

1.首先肯定是要一个4X4的二维数组来存放数字存放0、2、4……
2.游戏开始与过程中需要随机出现2或者4,所以需要调用time.h这个库
3.游戏开始时,假如当获取字符为‘w\'则先用循环判定这个数字的下方有无和它相等的数字。如无则跳过,如有相加。然后在判定是否可以向上移动

下面是我的代码

(我本来是还要写一个撤回的函数 可惜写出来却不能运行。求大神指教)

#include<stdio.h>
//#include<conio.h>
#include<graphics.h>
#include<Windows.h>
#include<time.h>
int _back[4][4] = {};
void draw();//绘图
void play();
void init();//初始化数字
void _up();//向上移动
void _down();//向下移动
void _left();//像左移动
void _right();//向右移动
void add_number();//增加一个数字
int a[4][4] = { 0 };
int emtpy;
//空格的数量
void draw()
{
  int i, j;
  for (i = 0; i < 4; i++)
  {
    for (j = 0; j < 4; j++)
    {
      _back[i][j] = a[i][j];
      PIMAGE img;
      img = newimage();
      switch (a[i][j])
      {
      case 0:
      {
        getimage(img, \"2048\\\\0.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 2:
      {
        getimage(img, \"2048\\\\2.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 4:
      {
        getimage(img, \"2048\\\\4.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 8:
      {
        getimage(img, \"2048\\\\8.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 16:
      {
        getimage(img, \"2048\\\\16.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 32:
      {
        getimage(img, \"2048\\\\32.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 64:
      {
        getimage(img, \"2048\\\\64.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 128:
      {
        getimage(img, \"2048\\\\128.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 256:
      {
        getimage(img, \"2048\\\\256.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 512:
      {
        getimage(img, \"2048\\\\512.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 1024:
      {
        getimage(img, \"2048\\\\1024.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      case 2048:
      {
        getimage(img, \"2048\\\\2048.png\");
        putimage(j * 180, i * 180, img);
        break;
      }
      }
    }
  }

}
void init()
{
  int x, y;
  srand(time(0));
  x = rand() % 4;
  y = rand() % 4;
  a[x][y] = 2;
  emtpy = 15;

}
void _up()
{
  int x, y, i;

  for (y = 0; y < 4; ++y) {   // 从上向下合并相同的方块 
    for (x = 0; x < 4; ++x) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = x + 1; i < 4; ++i) {
          if (a[i][y] == 0)
            ;
          else if (a[x][y] == a[i][y]) {
            a[x][y] += a[i][y];
            a[i][y] = 0;
            ++emtpy;
            x = i;
            break;

          }
          else {

            break;
          }
        }
      }
    }
  }

  for (y = 0; y < 4; ++y)  // 向上移动箱子
    for (x = 0; x < 4; ++x)
    {
      if (a[x][y] == 0)
        ;
      else {
        for (i = x; (i > 0) && (a[i - 1][y] == 0); --i) {
          a[i - 1][y] = a[i][y];
          a[i][y] = 0;
        }
      }
    }
}
void _down() {
  int x, y, i;

  for (y = 0; y < 4; ++y) // 向下合并相同的方格 
    for (x = 3; x >= 0; --x) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = x - 1; i >= 0; --i) {
          if (a[i][y] == 0)
            ;
          else if (a[x][y] == a[i][y]) {
            a[x][y] += a[i][y];
            a[i][y] = 0;
            ++emtpy;
            x = i;
            break;
          }
          else
            break;
        }
      }
    }

  for (y = 0; y < 4; ++y) // 向下移动方格 
    for (x = 3; x >= 0; --x) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = x; (i < 3) && (a[i + 1][y] == 0); ++i) {
          a[i + 1][y] = a[i][y];
          a[i][y] = 0;
        }
      }
    }
}
void _left()
{
  int x, y, i;

  for (x = 0; x < 4; ++x)  // 向左合并相同的方格 
    for (y = 0; y < 4; ++y) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = y + 1; i < 4; ++i) {
          if (a[x][i] == 0)
            ;
          else if (a[x][y] == a[x][i]) {
            a[x][y] += a[x][i];
            a[x][i] = 0;
            emtpy++;
            y = i;
            break;
          }
          else
            break;
        }
      }
    }

  for (x = 0; x < 4; ++x) // 向左移动方格 
    for (y = 0; y < 4; ++y) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = y; (i > 0) && (a[x][i - 1] == 0); --i) {
          a[x][i - 1] = a[x][i];
          a[x][i] = 0;
        }
      }
    }
}
void _right() {
  int x, y, i;

  for (x = 0; x < 4; ++x) // 向右合并相同的方格 
    for (y = 3; y >= 0; --y) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = y - 1; i >= 0; --i) {
          if (a[x][i] == 0)
            ;
          else if (a[x][y] == a[x][i]) {
            a[x][y] += a[x][i];
            a[x][i] = 0;
            ++emtpy;
            y = i;
            break;
          }
          else
            break;
        }
      }
    }

  for (x = 0; x < 4; ++x)  // 向右移动方格 
    for (y = 3; y >= 0; --y) {
      if (a[x][y] == 0)
        ;
      else {
        for (i = y; (i < 3) && (a[x][i + 1] == 0); ++i) {
          a[x][i + 1] = a[x][i];
          a[x][i] = 0;
        }
      }
    }
}
void add_number()
{
  srand(time(0));
  if (emtpy > 0)
  {
    int x, y, temp;
    do
    {
      x = rand() % 4;
      y = rand() % 4;
    } while (a[x][y] != 0);
    temp = rand();
    int i = temp % 2;
    if (i == 1)
    {
      a[x][y] = 2;
      emtpy--;

    }
    else
    {
      a[x][y] = 4;
      emtpy--;
    }

  }
}
void play()
{
  char c = getch();
  switch (c)
  {
  case \'w\':
  case\'W\':
  {
    _up();
    add_number();
    draw();

    break;

  }
  case \'s\':
  case\'S\':
  {
    _down();
    add_number();
    draw();
    break;

  }
  case \'a\':
  case\'A\':
  {
    _left();
    add_number();
    draw();
    break;



  }case \'d\':
  case\'D\':
  {
    _right();
    add_number();
    draw();
    break;

  }
  case \'q\':
  case \'Q\':
  {
    for (int i = 0; i < 4; i++)
    {
      for (int j = 0; j < 4; j++)
      {
        a[i][j] = _back[i][j];
        draw();
      }
    }
  }
  }

}
int main()
{
  init();
  int i, j;
  initgraph(724, 724);//初始化
  PIMAGE img;
  img = newimage();
  getimage(img, \"2048/背景.jpg\");
  putimage(0, 0, img);
  draw();
  for (; is_run(); delay_fps(30))
  {
    for (int i = 0; i < 4; i++)
    {
      for (int j = 0; j < 4; j++)
      {
        _back[i][j] = a[i][j];
      }
    }
    play();
  }
}

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表