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

这几天看到我们班上一个大神写了一个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();
  }
}

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

(0)

相关推荐

  • C语言实现小猫钓鱼游戏

    本文实例为大家分享了C语言实现小猫钓鱼游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<time.h> #include<string.h> #include<stdlib.h> #include<windows.h> typedef struct { int data[3600]; int col[3600]; int top; } stack; typedef struct { int data[

  • C语言如何在指针中隐藏数据详解

    前言 编写 C 语言代码时,指针无处不在.我们可以稍微额外利用指针,在它们内部暗中存储一些额外信息.为实现这一技巧,我们利用了数据在内存中的自然对齐特性. 内存中的数据并非保存在任意地址.处理器通常按照其字大小相同的块读取内存数据:那么考虑到效率因素,编译器会按照块大小的整数倍对内存中的实体进行地址对齐.因此在 32 位的处理器上,一个 4 字节整型数据肯定存放在内存地址能被4整除的地方. 下面,假设系统中整型数据和指针大小均为 4 字节. 现在有一个指向整型的指针.如上所述,整型数据可以存放在

  • C语言实现学生成绩管理系统实战教学

    趁着放假无事,开始用C语言开发一些小的项目,巩固基础知识的同时学习新的知识. 学生成绩管理系统实现的功能有:成绩录入.学生成绩查询.删除.修改.通过文件保存等. 开发这样一个系统需要具备的知识:线性表(链表).文件操作.排序(如果需要成绩排序). 开发环境为VS2015:在Linux下没有conio.h的头文件,需要修改与getch()函数相关的代码. #include <stdio.h> #include <stdlib.h> #include <string.h>

  • C语言简易版flappy bird小游戏

    假期在家无聊,想随便码点东西,故有此简陋的小游戏诞生.觉着可能对初学C语言的小伙伴练习有点帮助,故写此博客.游戏界面如下: 首先,先画出整个小游戏实现的流程图,如下: 思路很简单,整个游戏界面是由一个大的char类型数组构成,更新数组的值然后不停的打印出来就形成了动态效果. 由上图看,大循环是保证游戏一直不断的进行下去,小循环是让小鸟的速度大于游戏界面里背景(由#构成的柱子)的速度(小鸟动四下柱子才动一下). 下面是具体代码(水平有限大家多多见谅,但是效果还是有的!) Bird.c文件 #inc

  • C语言实现纸牌游戏之小猫钓鱼算法

    本文实例为大家分享了C语言实现小猫钓鱼算法的具体代码,供大家参考,具体内容如下 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌.出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾.当任意一人手中的牌全部出

  • 如何写出优美的C语言代码

    面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维护,复杂度较低的优美代码,本文将通过一个实际的例子来说明这一点. 基础知识 结构体 除了提供基本数据类型外,C 语言还提供给用户自己定制数据类型的能力,那就是结构体,在 C 语言中,你可以用结构体来表示任何实体.结构体正是面向对象语言中的类的概念的雏形,比如: typedef struct{ float x; float y; }Point; 定义了

  • C语言利用模板实现简单的栈类

    本文实例为大家分享了C语言利用模板实现简单的栈类(数组和单链表),供大家参考,具体内容如下 主要的功能是实现一个后进先出的列表,有入栈.出栈.返回大小.判空等基本功能 #pragma once using namespace std; const int MAXSIZE = 0xfff; template<class type> class Class_Linkstack { int top; type* my_s; int max_size; public: Class_Linkstack(

  • C语言实现Flappy Bird小游戏

    本文实例为大家分享了C语言实现Flappy Bird小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<Windows.h> /********函数变量声明********/ #define PR_Box printf("■") #define PR_Gold printf(

  • C语言结构体数组同时赋值的另类用法

    说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子: #include <stdio.h> struct student { int a; int b ; int c ; }; struct student array1[1000] ; int main(void) { int i ; for(i = 0 ; i < 1000 ; i++) { array[i].a = 1 ; array[i].b = 2 ; array[i].c = 3 ; } fo

  • C语言数组栈实现模板

    本文实例为大家分享了C语言数组栈实现模板的具体代码,供大家参考,具体内容如下 SeqStack.h #pragma once #define MAX_SIZE 1024 typedef struct SEQSTACK { void* data[MAX_SIZE]; int size; }SeqStack; SeqStack* Init_SeqStack(); // 初始化栈 void Push_SeqStack(SeqStack* stack, void* data); // 入栈 void*

随机推荐