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_OFF "stty -raw echo -F" 

int map[4][4]; 

typedef struct node
{
 int x;
 int y;
 int num;
}Node;
Node node; 

void init_map()//初始化全部方格
{
 int i, j;
 for(i=0; i<4; i++)
  for(j=0; j<4; j++)
   map[i][j] = 0;
} 

void new_node()//新增方格,避免重复。
{
 int x = 0, y = 0 ,num = 0;
 do{
 int fals = 1;
 int i,j;
 for(i=0; i<4; i++)
  for(j=0; j<4; j++)
   if(map[i][j] == 0)
    fals =0;
 if(fals)//新方格无法被填入,游戏失败
 {
  system("clear");
  printf("game over!!!!!!!!!!!\n");
  exit(0);
 }
 x = rand() % 4;
 y = rand() % 4;
 num = rand() % 2; 

 if(num == 0)
  num = 3;
 else if(num == 1)
  num = 5;
 }while(map[x][y] > 0);
  node.x = x;
  node.y = y;
  node.num = num;
  map[x][y] = node.num;
} 

void show()//彩色打印数字
{
 int i, j;
 for(i=0; i<4; i++)
 {
  for(j=0; j<4; j++)
  {
   if(map[i][j]%2 == 1)
   {
    map[i][j] -= 1;
    printf("\33[31m%d\33[0m\t",map[i][j]);
   }
   else if(map[i][j] == 0)
   {
    printf("%d\t",map[i][j]);
   }
   else if(map[i][j] == 2)
   {
    printf("\33[32m%d\33[0m\t",map[i][j]);
   }
   else if(map[i][j] == 4)
   {
    printf("\33[33m%d\33[0m\t",map[i][j]);
   }
   else if(map[i][j] == 8)
   {
    printf("\33[34m%d\33[0m\t",map[i][j]);
   }
   else if(map[i][j] == 16)
   {
    printf("\33[35m%d\33[0m\t",map[i][j]);
   }
   else if(map[i][j] == 32)
   {
    printf("\33[36m%d\33[0m\t",map[i][j]);
   }
   else
   {
    printf("\33[44m%d\33[0m\t",map[i][j]);
   }
  }
  printf("\n");
 }
}
void left()
{
 int i, j, z, tmp;
 for(i=0; i<4; i++)//全体方格左移
  for(j=0; j<4; j++)
   if(map[i][j] == 0 )
    for(z = j + 1; z<4; z++)
     if(map[i][z] > 0)
     {
      tmp = map[i][j];
      map[i][j] = map[i][z];
      map[i][z] = tmp;
      break;
     }
 for(i=0; i<4; i++)//如果方格数字相同则,相加,通过主函数多次调用,排列好
  for(j=0; j<4; j++)
   if(map[i][j] > 0 )
    for(z = j + 1; z<4; z++)
     if(map[i][z] > 0)
      if(map[i][z] == map[i][j])
      {
       map[i][j] *= 2;
       map[i][z] = 0;
      }else
       break;
     else
      break;
   else
    break;
} 

void right()
{
 int i, j, z, tmp;
 for(i=0; i<4; i++)
  for(j=3; j>=0; j--)
   if(map[i][j] == 0 )
    for(z = j-1; z>=0; z--)
     if(map[i][z] > 0)
     {
      tmp = map[i][j];
      map[i][j] = map[i][z];
      map[i][z] = tmp;
      break;
     }
 for(i=0; i<4; i++)
  for(j=3; j>=0; j--)
   if(map[i][j] > 0 )
    for(z = j-1; z>=0; z--)
     if(map[i][z] > 0)
      if(map[i][z] == map[i][j])
      {
       map[i][j] *= 2;
       map[i][z] = 0;
      }else
       break;
     else
      break;
   else
    break;
}
void up()
{
 int i, j, z, tmp;
 for(i=0; i<4; i++)
  for(j=0; j<4; j++)
   if(map[j][i] == 0 )
    for(z = j+1; z<4; z++)
     if(map[z][i] > 0)
     {
      tmp = map[j][i];
      map[j][i] = map[z][i];
      map[z][i] = tmp;
      break;
     }
 for(i=0; i<4; i++)
  for(j=0; j<4; j++)
   if(map[j][i] > 0 )
    for(z = j+1; z<4; z++)
     if(map[z][i] > 0)
      if(map[z][i] == map[j][i])
      {
       map[j][i] *= 2;
       map[z][i] = 0;
      }else
       break;
     else
      break;
   else
    break;
}
void down()
{
 int i, j, z, tmp;
 for(i=0; i<4; i++)
  for(j=3; j>=0; j--)
   if(map[j][i] == 0 )
    for(z = j-1; z>=0; z--)
     if(map[z][i] > 0)
     {
      tmp = map[j][i];
      map[j][i] = map[z][i];
      map[z][i] = tmp;
      break;
     }
 for(i=0; i<4; i++)
  for(j=3; j>=0; j--)
   if(map[j][i] > 0 )
    for(z = j-1; z>=0; z--)
     if(map[z][i] > 0)
      if(map[z][i] == map[j][i])
      {
       map[j][i] *= 2;
       map[z][i] = 0;
      }else
       break;
     else
      break;
   else
    break;
}
void move(char ch)
{
 switch(ch)
 {
  case 'a':
   left();
   break;
  case 'd':
   right();
   break;
  case 'w':
   up();
   break;
  case 's':
   down();
   break;
 }
} 

char in_direct()//非堵塞输入
{
 fd_set fd;
 struct timeval tv;
 char ch;
 FD_ZERO(&fd);
 FD_SET(0, &fd);
 tv.tv_sec = 0;
 tv.tv_usec = 10;
 if(select(1, &fd ,NULL, NULL, &tv) > 0)
 {
   ch = getchar();
 }
 return ch;
}
int main()
{
 srand(time(NULL));
 init_map();
 new_node();
 show();
 char ch;
 int i=0;
 while(1)
 {
  system(STTY_ON TTY_PATH);
  ch = in_direct();
  system(STTY_OFF TTY_PATH);
  if(ch=='a'||ch=='d'||ch=='s'||ch=='w')
  {
   system("clear");
   for(i=0;i<3;i++)//重复多次才能排序好
    move(ch);
   new_node();
   show(); 

  }
  if(ch=='q')//退出游戏
  {
   system("clear");
   printf("game over!!!!!!!!\n");
   break;
  }
  usleep(500000);
 }
 return 0;
} 

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

(0)

相关推荐

  • C语言实现2048游戏代码

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

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

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

  • 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小游戏

    效果不好,见谅,没事就写了一个!!! /** * @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语言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

  • 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小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 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游戏

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

  • Unity游戏开发之2048游戏的实现

    目录 一.前言 二.游戏开发知识储备 2-1技术栈 三.休闲类游戏<2048>开发实战 3-1玩法概述 3-2实现分析 3-3搭建场景 3-4实现代码 一.前言 写今天这篇文章的缘由,其实是来自于前段时间和粉丝的一个聊天,最近他打算参加游戏创作大赛,问我需要准备学习什么知识,以及参加比赛的注意事项一类: 我相信因为热爱游戏而前来投身于U3D学习的粉丝想来不是少数,兴趣可以驱动学习,在完善自己心爱游戏的过程中,要不断的去学习,不断的提高自己. 而参与游戏设计比赛,更是提高自身技术实力.增长眼界见

随机推荐