C语言实现2048游戏代码

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

效果图:

使用文本界面的屏幕绘图库 ncurses.

设计思路:

  • 在满足条件情况下消除方块
  • 允许在游戏主界面(16 宫格)中任意一格输出数据

实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
#include <signal.h>
#include <time.h> 

void draw(); // 用于绘制游戏界面
void play(); // 游戏运行的逻辑主体
void init(); // 初始化函数,用于完成一些必要的初始化操作
void draw_one(int y, int x); // 绘制单个数字
void cnt_value(int *new_y, int *new_x); //统计(y, x)对应的格子周围一圈的空格的个数
int game_over(); // 结束游戏
int cnt_one(int y, int x); //统计(y, x)对应的格子周围一圈的空格的个数 

// 游戏主界面是一个 4*4 的 16 宫格,使用二维数组进行表示,用 0 表示空格
int a[4][4] = { 0 };
// 16 宫格中空格的个数 

int empty;
int old_y, old_x; 

int main()
{
  init();
  play();
  endwin(); 

  return 0;
} 

void init()
{
  int x, y; 

  initscr(); //开启curses模式
  cbreak(); //开启cbreak模式,除 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取
  noecho(); //echo() and noecho(): 此函式用来控制从键盘输入字元时是否将字元显示在终端机上
  curs_set(0); //设置光标模式 

  empty = 15;
  srand(time(0));
  x = rand() % 4;
  y = rand() % 4;
  a[y][x] = 2;
  draw();
} 

void draw()
{
  int n, m, x, y;
  char c[4] = {'0', '0', '0', '0'};
  clear(); //清除终端屏幕 

  for(n = 0; n < 9; n += 2)
  {
    for(m = 0; m < 21; m++)
    {
      move(n, m);//将游标移动至 x,y 的位置
      addch('-');//在当前位置画字符'-'
      refresh();//将做清除萤幕的工作
    }
  } 

  for(m = 0; m < 22; m += 5)
  {
    for(n = 1; n < 8; n++)
    {
      move(n, m);
      addch('|');
      refresh();
    }
  } 

  for(y = 0; y < 4; y++)
  {
    for(x = 0; x < 4; x++)
    {
      draw_one(y, x);
    }
  }
} 

void draw_one(int y, int x)
{
  int i, m, k, j;
  char c[5] = {0x00};
  i = a[y][x];
  m = 0; 

  while(i > 0)
  {
    j = i % 10;
    c[m++] = j + '0';
    i = i / 10;
  } 

  m = 0;
  k = (x + 1) * 5 - 1; 

  while(c[m] != 0x00)
  {
    move(2 * y + 1, k);
    addch(c[m++]);
    k--;
  }
} 

void play()
{
  int x, y, i, new_x, new_y, temp;
  int old_empty, move;
  char ch; 

  while(1)
  {
    move = 0;
    old_empty = empty;
    ch = getch(); 

    switch(ch)
    {
      case 97: //左移 a
      case 104: // h
      case 68: // 左移方向键
        for(y = 0; y < 4; y++)
          for(x = 0; x < 4; )
          {
            if(a[y][x] == 0)
            {
              x++;
              continue;
            }
            else
            {
              for(i = x + 1; i < 4; i++)
              {
                if(a[y][i] == 0)
                {
                  continue;
                }
                else
                {
                  if(a[y][x] == a[y][i])
                  {
                    a[y][x] += a[y][i];
                    a[y][i] = 0;
                    empty++;
                    break;
                  }
                  else
                  {
                    break;
                  }
                }
              }
              x = i;
            }
          } 

        for(y = 0; y < 4; y++)
          for(x = 0; x < 4; x++)
          {
            if(a[y][x] == 0)
            {
              continue;
            }
            else
            {
              for(i = x; (i > 0) && (a[y][i - 1] == 0); i--)
              {
                a[y][i - 1] = a[y][i];
                a[y][i] = 0;
                move = 1;
              }
            }
          }
        break;
      case 100: //右移 d
      case 108: // l
      case 67:  //右移方向键
        for(y = 0; y < 4; y++)
          for(x = 3; x >= 0; )
          {
            if(a[y][x] == 0)
            {
              x--;
              continue;
            }
            else
            {
              for(i = x - 1; i >= 0; i--)
              {
                if(a[y][i] == 0)
                {
                  continue;
                }
                else if(a[y][x] == a[y][i])
                {
                  a[y][x] += a[y][i];
                  a[y][i] = 0;
                  empty++;
                  break;
                }
                else
                {
                  break;
                }
              }
              x = i;
            }
          } 

        for(y = 0; y < 4; y++)
          for(x = 3; x >= 0; x--)
          {
            if(a[y][x] == 0)
            {
              continue;
            }
            else
            {
              for(i = x; (i < 3) && (a[y][i + 1] == 0); i++)
              {
                a[y][i + 1] = a[y][i];
                a[y][i] = 0;
                move = 1;
              }
            }
          }
        break;
      case 119: //上移 w
      case 107: //k
      case 65:  //上移方向键
        for(x = 0; x < 4; x++)
          for(y = 0; y < 4; )
          {
            if(a[y][x] == 0)
            {
              y++;
              continue;
            }
            else
            {
              for(i = y + 1; i < 4; i++)
              {
                if(a[i][x] == 0)
                {
                  continue;
                }
                else if(a[y][x] == a[i][x])
                {
                  a[y][x] += a[i][x];
                  a[i][x] = 0;
                  empty++;
                  break;
                }
                else
                {
                  break;
                }
              }
              y = i;
            }
          } 

        for(x = 0; x < 4; x++)
          for(y = 0; y < 4; y++)
          {
            if(a[y][x] == 0)
            {
              continue;
            }
            else
            {
              for(i = y; (i > 0) && (a[i - 1][x] == 0); i--)
              {
                a[i - 1][x] = a[i][x];
                a[i][x] = 0;
                move = 1;
              }
            }
          }
        break;
      case 115: //下移 s
      case 106: //j
      case 66:  //下移方向键
        for(x = 0; x < 4; x++)
          for(y = 3; y >= 0; )
          {
            if(a[y][x] == 0)
            {
              y--;
              continue;
            }
            else
            {
              for(i = y - 1; i >= 0; i--)
              {
                if(a[i][x] == 0)
                {
                  continue;
                }
                else if(a[y][x] == a[i][x])
                {
                  a[y][x] += a[i][x];
                  a[i][x] = 0;
                  empty++;
                  break;
                }
                else
                {
                  break;
                }
              }
              y = i;
            }
          } 

        for(x = 0; x < 4; x++)
          for(y = 3; y >= 0; y--)
          {
            if(a[y][x] == 0)
            {
              continue;
            }
            else
            {
              for(i = y; (i < 3) && (a[i + 1][x] == 0); i++)
              {
                a[i + 1][x] = a[i][x];
                a[i][x] = 0;
                move = 1;
              }
            }
          }
        break;
      case 'Q':
      case 'q':
        game_over();
        break;
      default:
        continue;
        break; 

    } 

    if(empty <= 0)
      game_over(); 

    if((empty != old_empty) || (move == 1))
    {
      do
      {
        new_x = rand() % 4;
        new_y = rand() % 4;
      }while(a[new_y][new_x] != 0); 

      cnt_value(&new_y, &new_x); 

      do
      {
        temp = rand() % 4;
      }while(temp == 0 || temp == 2); 

      a[new_y][new_x] = temp + 1;
      empty--;
    }
    draw();
  }
} 

int cnt_one(int y, int x)
{
  int value = 1; 

  if(y - 1 > 0)
    a[y - 1][x] ? 0 : value++;
  if(y + 1 < 4)
    a[y + 1][x] ? 0 : value++;
  if(x - 1 >= 0)
    a[y][x - 1] ? 0 : value++;
  if(x + 1 < 4)
    a[y][x + 1] ? 0 : value++;
  if(y - 1 >= 0 && x - 1 >= 0)
    a[y - 1][x - 1] ? 0 : value++;
  if(y - 1 >= 0 && x + 1 < 4)
    a[y - 1][x + 1] ? 0 : value++;
  if(y + 1 < 4 && x - 1 >= 0)
    a[y + 1][x - 1] ? 0 : value++;
  if(y + 1 < 4 && x + 1 < 4)
    a[y + 1][x + 1] ? 0 : value++; 

  return value;
} 

void cnt_value(int *new_y, int *new_x)
{
  int max_x, max_y, x, y, value;
  int max = 0; 

  max = cnt_one(*new_y, *new_x);
  for(y = 0; y < 4; y++)
    for(x = 0; x < 4; x++)
    {
      if(!a[y][x])
      {
        value = cnt_one(y, x);
        if(value > max && old_y != y && old_x != x)
        {
          *new_y = y;
          *new_x = x;
          old_x = x;
          old_y = y;
          break;
        }
      }
    }
} 

int game_over()
{
  sleep(1); //暂停1秒
  endwin(); //关闭curses并重置tty(结束curses编程时,最后调用的一个函数)
  exit(0);
} 

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

(0)

相关推荐

  • 简单实现C语言2048游戏

    本文实例为大家分享了C语言2048游戏的具体代码,供大家参考,具体内容如下 /*2048*/ #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<time.h> //全局变量 int x[4][4]={0}; int score=0; int can_move; int empty() { int i,j; int n=0; for(i=0;i<4;i++) { for(j=0

  • 2048小游戏C语言实现代码

    本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下 大一时学c语言写的,写的不好但当时感觉还行. 环境运行 vc6.0 ,cpp文件. 基本上是c写的,但是改变字体颜色,在控制台移动光标等等好像不是c中的. 代码: #include<time.h> #include<stdlib.h> #include<conio.h> #include<stdio.h> #include<windows.h> #define x0

  • C语言实现2048小游戏

    本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

  • C语言控制台版2048小游戏

    效果不好,见谅,没事就写了一个!!! /** * @author Routh * @main.c * @date 2014, 4, 26 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> // console width #define CONSOLE_WIDTH 80 #define BOX_WIDTH 10 int BOX[4][4] = {

  • 利用C语言实现2048小游戏的方法

    准备工作 首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的. 了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作: 1.将所有数字向一个方向移动至中间没有空位 2.将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上 另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录. 同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示. 首

  • C语言实现2048游戏代码

    本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下 效果图: 使用文本界面的屏幕绘图库 ncurses. 设计思路: 在满足条件情况下消除方块 允许在游戏主界面(16 宫格)中任意一格输出数据 实现代码: #include <stdio.h> #include <stdlib.h> #include <curses.h> #include <unistd.h> #include <signal.h> #include &

  • R语言写2048游戏实例讲解

    2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束. 编程时并未查看原作者代码,不喜勿喷. 程序结构如下: R语言代码: #!/usr/bin/Rscript #画背景 draw_bg <- function(){ plot(0,0,xlim=c(0,0.8),ylim=c(0,0.8),type='n',xaxs="i", yaxs="i") for (i in

  • 用C语言实现2048游戏

    本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,具体内容如下 我遇到的几个问题: 问题1:如何显示? system("clear");//清屏 每次发生变化就清屏一次,再把内容打印出来 问题2:怎么用键盘控制? w,s,a,d-->上下左右 system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受 问题3:随机位置? 用srand()与rand()产生随机数(x,y),再判断位置(x,y)是否为空格,不是空格就

  • 基于C语言实现2048游戏

    本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> #define ROW 4 #define COL ROW #define KEY1 224 #define KEY_LEFT 75 #define KEY_UP 72 #de

  • C语言实现2048游戏

    本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

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

    这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了.现在和大家分享一下,也希望能得到大神的指点. 实现的效果如图 先来讲一下我的思路吧 1.首先肯定是要一个4X4的二维数组来存放数字存放0.2.4-- 2.游戏开始与过程中需要随机出现2或者4,所以需要调用time.h这个库 3.游戏开始时,假如当获取字符为'w'则先用循环判定这个数字的下方有无和它相等的数字.如无则跳过,如有相加.然后在判定是否可以向上移动 下面是我的代码 (我本来是还要

  • C语言代码实现2048游戏

    我是大一新生,在寒假的实训课上老师让我们用c语言分组编程一个小游戏,我们组选的是"2048".由于我们组上有一个大神,于是我们把大部分的工作交给了大神做,但是实训完成之后我感觉到碌碌无为,什么也没学到,自己对于c语言的理解也仅仅局限于书本之上,想到那些大神们已经基本可以自己编程一些小游戏了,心里就非常着急.于是利用这个寒假,我自己独立完成了"2048"小游戏的编程. 游戏代码我是用Xcode编的,我是IOS小白,有些头文件在Xcode中不能使用而我又找不到可以替代的

  • 用C语言完整实现2048游戏

    目录 前言 一.游戏思路 二.游戏框架 1.菜单界面 2.游戏主体 1.初始化界面: 2.随机生成初始数字 3.实现移动 4.增加新数字 5.判定胜负 6.游戏函数 三.游戏运行 四.所有代码 总结 前言 游戏规则:游戏开始,在4x4的棋盘上随机两个方块出现数字2,通过方向键控制所有方块向同一个方向移动,两个相同数字方块撞在一起之后合并成为他们的和.每次移动,棋盘上还会在一个随机位置增加一个数字2或者数字4,当最终得到一个"2048"的方块就算胜利了. 简单吧?简单--个鬼啊,我以前玩

随机推荐