linux下实现的2048游戏示例分享

my2048.c


代码如下:

#include"my_getch.h"
#include"math.h"
#include"time.h"

#define SPACE() printf("    ")
#define RED_NUM(n) printf("\033[;31m%4d",(n))
#define GREEN_NUM(n) printf("\033[;32m%4d",(n))
#define BLUE_NUM(n) printf("\033[;34m%4d",(n))
#define YELLOW_NUM(n) printf("\033[;33m%4d",(n))
#define PURPLE_NUM(n) printf("\033[;35m%4d",(n))
#define DEEPGREEN_NUM(n) printf("\033[;36m%4d",(n))

/*根据不同的number进行不同的宏替换,输出不同颜色的数字*/
void printNum(const int num)
{
    if(num==0)
 SPACE();
    else if(num==1024 || num==32)
 RED_NUM(num);
    else if(num==2 || num==64 )
 BLUE_NUM(num);
    else if(num==4 || num==128)
 GREEN_NUM(num);
    else if(num==8 || num==256)
 YELLOW_NUM(num);
    else if(num==16 || num==512)
 PURPLE_NUM(num);
    else
 DEEPGREEN_NUM(num);
}

enum game_stat{PLAYING,FAILED,EXITED,DONE};
enum cmd{UP,DOWN,LEFT,RIGHT,QUIT,INVALID};

enum cmd direction;
short empty[16];

struct Game
{
    int box[16];
    enum game_stat stat;
    int step;
    unsigned long int point;
}game;
void init_game()
{
    int i;
    for(i=0;i<16;i++)
 game.box[i]=0;
    game.stat=PLAYING;
    game.step=0;
    game.point=0;
}

/*检验游戏是否能否继续*/
void check_fail()
{
    int i,j;
    for(i=0;i<4;i++)
 for(j=0;j<3;j++)
     if(game.box[i*4+j]==game.box[i*4+j+1])
  return;
    for(j=0;j<4;j++)
 for(i=0;i<3;i++)
     if(game.box[i*4+j]==game.box[(i+1)*4+j])
  return;

game.stat=FAILED;
}

/*2和4出现的概率比为3/1*/
int get2or4()
{
    int x=rand()%4;
    return x>3 ? 4:2;
}

/*接收键盘的键入,方向键由三个char类型字符表示:
上:27 91 65
下:27 91 66
右:27 91 67
左:27 91 68
*/
void inputCmd()
{
    char c=my_getch();
    if(c==27)
    {
 c=my_getch();
 if(c==91)
 {
     c=my_getch();
     if(c==65)
  direction=UP;
     if(c==66)
  direction=DOWN;
     if(c==67)
  direction=RIGHT;
     if(c==68)
  direction=LEFT;
     //printf("%d ",c);
 }
    }
    else if(c=='\n')
 direction=QUIT;
    else
 direction=INVALID;
}

/*检索空位,即为0的值
*/
int findPos()
{
    int i,count=0,pos;
    for(i=0;i<16;i++)
 empty[i]=-1;
    for(i=0;i<16;i++)
    {
 if(game.box[i]==0)
     empty[count++]=i;
    }
    if(count==0)
 return -1;//game over
    pos=empty[rand()%count];
    //printf("pos=%d\n",pos);
    return pos;
}

int merge()//不可以移动时返回-1
{
    int box_4x4[4][4];
    int i,j,deep;
    int has_move=-1,merge_line=0;

for(i=0;i<4;i++)
 for(j=0;j<4;j++)
     box_4x4[i][j]=game.box[i*4+j];

if(direction==RIGHT)
    {
 //printf("RIGHT");
        for(i=0;i<4;i++)
        {
        deep=3;
     merge_line=0;
     for(j=3;j>=0;j--)
     {
         if(box_4x4[i][j]!=0)
  {
      box_4x4[i][deep]=box_4x4[i][j];
      if(deep!=j)  box_4x4[i][j]=0;
      if(deep<3 && merge_line==0 && box_4x4[i][deep]==box_4x4[i][deep+1] )
      { game.point+=box_4x4[i][deep+1];  box_4x4[i][deep+1]*=2;
          box_4x4[i][deep]=0;  merge_line=1;  }
      else deep--;
  }
     }
        }
    }
    if(direction==LEFT)
    {
 //printf("LEFT");
        for(i=0;i<4;i++)
        {
        deep=0;
     merge_line=0;
     for(j=0;j<4;j++)
     {
         if(box_4x4[i][j]!=0)
  {
      box_4x4[i][deep]=box_4x4[i][j];
      if(deep!=j)  box_4x4[i][j]=0;
      if(deep>0 && merge_line==0 && box_4x4[i][deep]==box_4x4[i][deep-1] )
      {  game.point+=box_4x4[i][deep-1];  box_4x4[i][deep-1]*=2;
          box_4x4[i][deep]=0;  merge_line=1;  }
      else deep++;
  }
     }
        }
    }
    if(direction==UP)
    {
 //printf("UP");
        for(j=0;j<4;j++)
        {
        deep=0;
     merge_line=0;
     for(i=0;i<4;i++)
     {
         if(box_4x4[i][j]!=0)
  {
      box_4x4[deep][j]=box_4x4[i][j];
      if(deep!=i)  box_4x4[i][j]=0;
      if(deep>0 && merge_line==0 && box_4x4[deep][j]==box_4x4[deep-1][j])
      {  game.point+=box_4x4[deep-1][j];  box_4x4[deep-1][j]*=2;
          box_4x4[deep][j]=0;  merge_line=1; }
      else deep++;
  }
     }
        }
    }
    if(direction==DOWN)
    {
 //printf("DOWN");
        for(j=0;j<4;j++)
        {
     merge_line=0;
        deep=3;
     for(i=3;i>=0;i--)
     {
         if(box_4x4[i][j]!=0)
  {
      box_4x4[deep][j]=box_4x4[i][j];
      if(deep!=i)  box_4x4[i][j]=0;
      if(deep<3 && merge_line==0 && box_4x4[deep][j]==box_4x4[deep+1][j])
      {   game.point+=box_4x4[deep+1][j]; box_4x4[deep+1][j]*=2;
          box_4x4[deep][j]=0; merge_line=1; }
      else deep--;
  }
     }
        }
    }

for(i=0;i<4;i++)
 for(j=0;j<4;j++)
     if(game.box[i*4+j]!=box_4x4[i][j])
     { 
  game.box[i*4+j]=box_4x4[i][j];
         has_move=1;
  if(game.box[i*4+j]==2048)  game.stat=DONE;
     }
    return has_move;
}

void drawBox()
{
    int *box=game.box;

printf("\033[2J");//清屏
    printf("\033[2H");//光标复位
    printf("\033[?25l");//隐藏光标

printf(" steps: %8d points: %10lu \n",game.step,game.point);
    printf("\033[;30m---------------------------------\n");
    printf("\033[;30m|       |       |       |       |\n");
    //printf("| %4d  | %4d  | %4d  | %4d  |\n",box[0],box[1],box[2],box[3]);
    printf("\033[;30m| ");
    printNum(box[0]);  printf("\033[;30m  | ");
    printNum(box[1]);  printf("\033[;30m  | ");
    printNum(box[2]);  printf("\033[;30m  | ");
    printNum(box[3]);  printf("\033[;30m  |\n");
    printf("\033[;30m|       |       |       |       |\n");
    printf("\033[;30m+-------+-------+-------+-------+\n");
    printf("\033[;30m|       |       |       |       |\n");
    //printf("| %4d  | %4d  | %4d  | %4d  |\n",box[4],box[5],box[6],box[7]);
    printf("\033[;30m| ");
    printNum(box[4]);  printf("\033[;30m  | ");
    printNum(box[5]);  printf("\033[;30m  | ");
    printNum(box[6]);  printf("\033[;30m  | ");
    printNum(box[7]);  printf("\033[;30m  |\n");
    printf("\033[;30m|       |       |       |       |\n");
    printf("\033[;30m+-------+-------+-------+-------+\n");
    printf("\033[;30m|       |       |       |       |\n");
    //printf("| %4d  | %4d  | %4d  | %4d  |\n",box[8],box[9],box[10],box[11]);
    printf("\033[;30m| ");
    printNum(box[8]);  printf("\033[;30m  | ");
    printNum(box[9]);  printf("\033[;30m  | ");
    printNum(box[10]);  printf("\033[;30m  | ");
    printNum(box[11]);  printf("\033[;30m  |\n");
    printf("\033[;30m|       |       |       |       |\n");
    printf("\033[;30m+-------+-------+-------+-------+\n");
    printf("\033[;30m|       |       |       |       |\n");
    //printf("| %4d  | %4d  | %4d  | %4d  |\n",box[12],box[13],box[14],box[15]);
    printf("\033[;30m| ");
    printNum(box[12]);  printf("\033[;30m  | ");
    printNum(box[13]);  printf("\033[;30m  | ");
    printNum(box[14]);  printf("\033[;30m  | ");
    printNum(box[15]);  printf("\033[;30m  |\n");
    printf("\033[;30m|       |       |       |       |\n");
    printf("\033[;30m---------------------------------\n");
    if(game.stat==FAILED)
 printf("   oh,failed! try again.\n");
    else if(game.stat==DONE)
 printf("   yeah,you won! \n");
    else

}

int main(int argc,char** argv)
{
 int pwdlen=10;
 int newPos;
 int has_merge=1;
 init_game();
 srand(time(0));
 fflush(stdin);
 while(1)
 {
        //printf("\033[2J");//清屏
        //printf("\033[2H");//光标复位
     //printf("\033[?25l");//隐藏光标
     newPos=findPos();
     if(newPos==-1)
     {
         check_fail();
  if(game.stat==FAILED)
      break;
     }
     if(has_merge!=-1)
     {
                game.box[newPos]=get2or4();
     }
     drawBox();

inputCmd(direction);
     if(direction==QUIT)
  break;
     else if(direction==INVALID)
  continue;
     else
     {
  has_merge=merge();
  if(game.stat==DONE) break;
  if(has_merge!=-1)  game.step++;
     }
 }
    drawBox();
    printf("\033[;30m");
}

my_getch.h


代码如下:

/*---------------------------------------
**  copyright (c) 2013-3-2 DeltaYang
**  E-mail: DeltaYang89@gmail.com
**  getch.c:模拟实现getch()
**--------------------------------------*/
#ifndef MYGETCH_H
#define MYGETCH_H

#include <stdio.h>
#include <termios.h> //操作终端
#include <unistd.h>
#include <assert.h>
#include <string.h>

char my_getch()
{
        int c=0;
        struct termios org_opts, new_opts;
        int res=0;
        //保留终端原来设置
        res=tcgetattr(STDIN_FILENO, &org_opts);
        assert(res==0);
        //从新设置终端参数
        memcpy(&new_opts, &org_opts, sizeof(new_opts));
        new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
        tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
        c=getchar();
        //恢复中断设置
        res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);assert(res==0);
        return c;
}

#endif

(0)

相关推荐

  • java使用OGEngine开发2048

    最近有一款2048的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048. OGEngine引擎是开源的,我们很容易找到,搭建起来也很方便,我们只需在Android工程下添加OGEngine的jar包或者直接引用源码就可以了. 源码下载:http://www.ogengine.com/download/resources.jsp private void initView() { // 游戏背景 AnimatedSprite game_bg = new AnimatedSpr

  • python实现2048小游戏

    2048的python实现.修改自某网友的代码,解决了原网友版本的两个小bug: 1. 原版游戏每次只消除一次,而不是递归消除.如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0] 2. 对游戏结束的侦测有bug,已经改正. 2048game.py # -*- coding: utf-8 -*- """ Created on Tue Jul 1 14:15:39 2014 @author: kelvin "

  • win32 api实现2048游戏示例

    自学的win32编程,写了一个win32 API版2048,自己摸索着写的,按上下左右箭头开始游戏 复制代码 代码如下: #include <windows.h>#include <stdlib.h>#include <stdio.h>#include <ctime>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//全局操作数组int arr[4][4] = { { 0, 0, 0, 0 }, {

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • javascript制作2048游戏

    2048.html <!DOCTYPE> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>2048</title> <link rel="styleshe

  • 使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN一位朋友封装的model.py(2048逻辑部分) 2.由于是练手的所以不免有写的不好的地方请大家喷的轻点. 先看看演示图片 附上源码: 2048主程 复制代码 代码如下: #-*-coding:utf-8-*- #python3.3.5 from graphics import* from tki

  • C++ 实现2048游戏示例

    这游戏前一段时间传的很火,前几天早上实在太无聊了,就决定把这游戏自己也写一个. 前后写了一个多小时吧,大概300行左右,没什么复杂算法,不过实在懒得去优化了,但估计优化完能控制在200行以下,有兴趣的朋友可以自己优化一下. 说明:我一开始玩的是IOS APP版的TRHEES,后来才玩的2048,两者在滑动的规则上有些区别,本人这个版本是这两者的结合. 最后,祝试玩愉快! 界面丑陋,求不笑. 以下是源代码: 复制代码 代码如下: /*By Reason*/#include<iostream>#i

  • javascript实现2048游戏示例

    原生javascript代码写的2048游戏.建议在谷歌浏览器下跑. 2048.html 复制代码 代码如下: <!DOCTYPE><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>2048

  • linux控制台下实现2048小游戏

    废话少说,直接奉上代码: main.c 复制代码 代码如下: #include"2048.h" int main() {     start_game();     return 0; } 2048.h 复制代码 代码如下: #ifndef _2048_H_ #define _2048_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<termios.h>

  • lua+love2d制作的2048游戏

    使用lua和love2d编写的pc版2048游戏,适用于linux和windows平台.依赖love2d游戏引擎,love2d需0.9及以上版本. core.lua 复制代码 代码如下: core = {} core.block = {} core.score = 0 core.best = 0 love.filesystem.setIdentity("2048") local function get_best()     if not love.filesystem.exists(

  • Android游戏源码分享之2048

    引言 程序猿们,是否还在为你的老板辛辛苦苦的打工而拿着微薄的薪水呢,还是不知道如何用自己的应用或游戏来赚钱呢! 在这里IQuick将教您如何同过自己的应用来赚取自己的第一桶金! 你是说自己的应用还没有做出来? 不,在這里已经为你提供好了一个完整的游戏应用了,在文章的下面有源码的地址哦.你只要稍做修改就可以变成一个完全属于自己的应用了,比如将4*4换成5*5,甚至是其它的.如果你实在是慵懒至极的话,你只要将本应用的包名及广告换成自己的,就可以上传到市场上轻轻松松赚取自己的第一桶金了. 如果你觉得本

  • 用VC++6.0的控制台实现2048小游戏的程序

    首先感谢这位大侠的无私分享,仔细学习这个程序以后收获很多,试着添加一些注释 源程序是从开源中国看到的,原作者是 刘地(sir?) 地址为http://www.oschina.net/code/snippet_593413_46040 geek_monkey于2015年3月5日为拜读该程序,受益匪浅 为了方便自己,以及更多初学者阅读,我试着写了写了注释供参考 我是C语言初学者,如有错误希望指正.轻喷 复制代码 代码如下: #include <stdlib.h> #include <stdi

  • Python新手实现2048小游戏

    接触 Python 不久,看到很多人写2048,自己也捣鼓了一个,主要是熟悉Python语法. 程序使用Python3 写的,代码150行左右,基于控制台,方向键使用输入字符模拟. 演示图片 2048.py # -*- coding:UTF-8 -*- #! /usr/bin/python3 import random v = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] def display(v, score): '''显示

  • lua实现的2048小游戏

    lua实现的2048小游戏,只要可以运行lua脚本的环境下都可以玩. 复制代码 代码如下: --[[============================================================================= #     FileName: 2048.lua #         Desc: lua console 2048 #       Author: hanxi #        Email: hanxi.info@gmail.com #    

  • javascript版2048小游戏

    没有技术含量,只是用来练习代码逻辑的.为了代码结构清晰,我把逻辑控制部分写在全局变量里,用户界面操作封装在UI对象里,大概就这样了.仅供参考.工作时候,我的编码风格有人吐槽太乱了,所以我想试着写一个不是那么乱的东西出来.. 复制代码 代码如下: <HTML> <head> <title>2048 DEMO</title> <meta charset='utf-8' /> <!--  708616 javascript present  ht

  • mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决

    在windows下安装Mysql系统日志出现max_open_files: 2048 max_connections: 510 table_cache: 764 类似错误是因为 max_connections 最大连接数和max_open_files.table_cache 不匹配.适当的降低max_connections 或调整其他两个数值 解决办法在 mysql bin > 中输入 mysql-nt --table_cache=764mysql-nt --innodb_open_files=

随机推荐