原来我转载过一个机遇ncurses的2048,今天无聊自己手写了一个,看下我的目录结构:

$ tree ../2048/
../2048/
├── 2048.c
├── 2048.h
└── main.c0 directories, 3 files

2048.h

#ifndef _2048_H
#define _2048_H#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <curses.h>
#include <time.h>
#include <math.h>
#include <termios.h>#define VK_LEFT   (97)
#define VK_UP       (119)
#define VK_RIGHT    (100)
#define VK_DOWN     (115)
#define VK_QUIT     (113)int table[16];int init();void show();int random_position();void handle(char VK);int check_zero();int check_alive();char getch_from_terminal();#endif /*<_2048_H>*/

2048.c

#include "2048.h"int init()
{int id;for(id=0; id<16; id++){table[id]   = 0;}table[random_position()] = 1;return 0;
}void show()
{system("clear");printf("\n\n");int ix, iz, id;char ch;for(ix=0; ix<4; ix++){for(iz=0; iz<4; iz++){id = iz*4 + ix;printf("%7d", table[id]);}printf("\n\n");}if(-1 == check_alive()){printf("You die!\n");printf("press <y> to play, <n> to quit\n");switch_ch:ch = getchar();switch(ch){case 'y':init();show();break;case 'n':printf("Goodbye! Have a good day!\n");exit(1);break;default:goto switch_ch;break;}}
}int random_position()
{srand( (unsigned)time( NULL ) ); int id;if(0 == check_zero()){while(1){id = rand()%16;if(table[id] == 0){return id;}}}
}int check_zero()
{int id, i, j, ij;for(id=0; id<16; id++){if(table[id] != 0){if(id == 15){return -1;}continue;}else{return 0;}}
}int check_alive()
{int id, ix, iz;if(table[0] == table[1] ||table[0] == table[4] ||table[3] == table[2] ||table[3] == table[7] ||table[12] == table[13] ||table[12] == table[8]  ||table[15] == table[14] ||table[15] == table[11] ||table[2] == table[3] ||table[4] == table[8] ||table[7] == table[11] ||table[13] == table[14]){return 0;}for(ix=0; ix<4; ix++){for(iz=0; iz<4; iz++){id = ix*4+iz;if(table[id] == 0){return 0;}if(ix >= 1 && ix <= 2 && iz >=1 && iz <= 2){if(table[id] == table[id-1]){return 0;}if(table[id] == table[id+1]){return 0;}if(table[id] == table[id-4]){return 0;}if(table[id] == table[id+4]){return 0;}}}}return -1;
}void handle(char VK)
{int ix, iz, i, id;switch(VK){case VK_UP:for(ix=0; ix<4; ix++){
loop_VK_UP_1:for(iz=0; iz<4; iz++){if(table[ix*4+iz] == 0){for(i=iz; i<4; i++){if(i==3){table[ix*4+i] = 0;}else{table[ix*4+i] = table[ix*4+i+1];}}}}for(iz=0; iz<4; iz++){if(table[ix*4+iz] != 0){for(i=0; i<iz; i++){if(table[ix*4+i] == 0){goto loop_VK_UP_1;}}}}
loop_VK_UP_2:for(iz=0; iz<3; iz++){if(table[ix*4+iz] == table[ix*4+iz+1]){table[ix*4+iz]    = table[ix*4+iz]  + table[ix*4+iz+1];for(i=iz+1; i<4; i++){if(i==3){table[ix*4+i] = 0;}else{table[ix*4+i] = table[ix*4+i+1];}}}}for(iz=0; iz<3; iz++){if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[ix*4+iz+1]){goto loop_VK_UP_2;}}}table[random_position()] = 1;break;case VK_DOWN:for(ix=0; ix<4; ix++){
loop_VK_DOWN_1:for(iz=3; iz>=0; iz--){if(table[ix*4+iz] == 0){for(i=iz; i>=0; i--){if(i==0){table[ix*4+i] = 0;}else{table[ix*4+i] = table[ix*4+i-1];}}}}for(iz=3; iz>=0; iz--){if(table[ix*4+iz] != 0){for(i=3; i>iz; i--){if(table[ix*4+i] == 0){goto loop_VK_DOWN_1;}}}}
loop_VK_DOWN_2:for(iz=3; iz>=1; iz--){if(table[ix*4+iz] == table[ix*4+iz-1]){table[ix*4+iz]   = table[ix*4+iz]  + table[ix*4+iz-1];for(i=iz-1; i>=0; i--){if(i==0){table[ix*4+i] = 0;}else{table[ix*4+i] = table[ix*4+i-1];}}}}for(iz=3; iz>=1; iz--){if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[ix*4+iz-1]){goto loop_VK_DOWN_2;}}}table[random_position()] = 1;break;case VK_LEFT:for(iz=0; iz<4; iz++){
loop_VK_LEFT_1:for(ix=0; ix<4; ix++){if(table[ix*4+iz] == 0){for(i=ix; i<4; i++){if(i==3){table[i*4+iz] = 0;}else{table[i*4+iz] = table[(i+1)*4+iz];}}}}for(ix=0; ix<4; ix++){if(table[ix*4+iz] != 0){for(i=0; i<ix; i++){if(table[i*4+iz] == 0){goto loop_VK_LEFT_1;}}}}
loop_VK_LEFT_2:for(ix=0; ix<3; ix++){if(table[ix*4+iz] == table[(ix+1)*4+iz]){table[ix*4+iz]    = table[ix*4+iz]  + table[(ix+1)*4+iz];for(i=ix+1; i<4; i++){if(i==3){table[i*4+iz] = 0;}else{table[i*4+iz] = table[(i+1)*4+iz];}}}}for(ix=0; ix<3; ix++){if(table[ix*4+iz] != 0 && table[ix*4+iz] == table[(ix+1)*4+iz]){goto loop_VK_LEFT_2;}}}table[random_position()] = 1;break;case VK_RIGHT:for(iz=0; iz<4; iz++){
loop_VK_RIGHT_1:for(ix=3; ix>=0; ix--){if(table[iz+ix*4] == 0){for(i=ix; i>=0; i--){if(i==0){table[iz+i*4] = 0;}else{table[iz+i*4] = table[iz+(i-1)*4];}}}}for(ix=3; ix>=0; ix--){if(table[iz+ix*4] != 0){for(i=3; i>ix; i--){if(table[iz+i*4] == 0){goto loop_VK_RIGHT_1;}}}}
loop_VK_RIGHT_2:for(ix=3; ix>=1; ix--){if(table[iz+ix*4] == table[iz+(ix-1)*4]){table[iz+ix*4]    = table[iz+ix*4]  + table[iz+(ix-1)*4];for(i=ix-1; i>=0; i--){if(i==0){table[iz+i*4] = 0;}else{table[iz+i*4] = table[iz+(i-1)*4];}}}}for(ix=3; ix>=1; ix--){if(table[iz+ix*4] != 0 && table[iz+ix*4] == table[iz+(ix-1)*4]){goto loop_VK_RIGHT_2;}}}table[random_position()] = 1;break;default:break;}
}char getch_from_terminal()
/*https://blog.csdn.net/Timsley/article/details/51424068*/
{FILE *input;FILE *output;struct termios initial_settings, new_settings;int inputString;input = fopen("/dev/tty", "r");output = fopen("/dev/tty", "w");if(!input || !output){fprintf(stderr, "Unable to open /dev/tty\n");exit(1);}tcgetattr(fileno(input), &initial_settings);new_settings = initial_settings;new_settings.c_lflag &= ~ICANON;new_settings.c_lflag &= ~ECHO;new_settings.c_cc[VMIN] = 1;new_settings.c_cc[VTIME] = 0;new_settings.c_lflag &= ~ISIG;if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0){fprintf(stderr, "Could not set attributes\n");}//while(inputString != 'q')//{//do//{inputString = fgetc(input);//}while(inputString == '\n' || inputString == '\r');//return (char )inputString;//}tcsetattr(fileno(input), TCSANOW, &initial_settings);return (char)inputString;
}

main.c

#include "2048.h"/*64     32     16      832     16      8      416      8      4      28      4      2      1You die!
press <y> to play, <n> to quit*/int main()
{system("clear");init();show();char ch;while((ch = getch_from_terminal()) != VK_QUIT)//while((ch = getchar()) != VK_QUIT){switch(ch){case VK_UP:handle(VK_UP);show();break;case VK_DOWN:handle(VK_DOWN);show();break;case VK_LEFT:handle(VK_LEFT);show();break;case VK_RIGHT:handle(VK_RIGHT);show();break;case 'q':exit(1);break;default:printf("<w><s><a><d>\n");break;}}return 0;
}

编译运行:

$ gcc main.c -I . 2048.c
$ ./a.exe1      2      8      132     16      4      21     64     32      82      1      4      2You die!
press <y> to play, <n> to quit
Goodbye! Have a good day!rongtao@DESKTOP-OG70MJ9 ~/2048

完整代码在:https://github.com/Rtoax/2048

C语言在linux终端下实现2048小游戏:第二版相关推荐

  1. linux小型游戏系统设计,Linux平台下基于JAVA小游戏_设计文档.doc

    Linux课程设计报告 课题名称:<Linux平台下基于java小游戏设计> 专 业:2011级计算机科学与技术 组 长:043佘清泉 组 员:007陈威达 008陈学仁 026赖华标 0 ...

  2. 2048小游戏 java版(代码+注释)

            一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏.写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来.(需要用的可直接 ...

  3. 详解Linux终端下编写“贪吃蛇”游戏

    大一学习C语言的时候就想要用Turbo C编写一个视频小游戏出来,种种原因后面搁浅了,现在借着学习Linux系统编程的劲头,编写了一个终端下可以运行的贪吃蛇游戏,其中此视频游戏用到的一些知识和操作系统 ...

  4. 2048小游戏(网页版)

    这是JS文件 ↓ /*这是JS文件*/ (function(window, document, $) {function Game2048(opt) {var prefix = opt.prefix, ...

  5. DAYU200 2048 小游戏- OpenHarmony版

    介绍 2048游戏的规则是这样的:在一个4乘以4的格子里,游戏开始后,从所有的空格子中随机选择两个空格子,对于随机选择的这两个空格子,在每个空格子里填入2或4.接下来,使用上下左右四个方向键进行操作. ...

  6. linux终端输出c语言程序,Linux终端程序用c语言实现改变输出的字的颜色

    颜色代码: 格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo "\033[41;36m something here \033 ...

  7. Linux C语言编写2048小游戏

    2048 2048小游戏是用Linux C语言写的,运行在Ubuntu系统上,其中Ubuntu链接Ncuses库.首先,我们简单了解一下Ncurses. Ncurses库是由原CURSES库发展而来的 ...

  8. Go语言在Linux环境下输出彩色字符

    Go语言在Linux环境下输出彩色字符 Go语言要打印彩色字符与Linux终端输出彩色字符类似 fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x ...

  9. linux 如何查看终端格式,你应该还不知道,Linux终端下的 Markdown 文档查看器

    原标题:你应该还不知道,Linux终端下的 Markdown 文档查看器 现在,Markdown 差不多已经成为技术文档的标准.它可以实现技术文档的快捷写作,以及输出发布.同样都是标记语言,但Mark ...

最新文章

  1. linux中544进程,Linux基础--进程管理及其基本命令
  2. make、make是什么??
  3. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法
  4. 3月2日 PCA的应用示例
  5. FlashFXP 自动上传备份到指定FTP服务器的方法
  6. 计算机桌面通过网络在拼接屏上显示,一种多个拼接屏实时同步显示方法与流程...
  7. Android 实现计时器功能,Android计时器的三种实现方式(Chronometer、Timer、handler)...
  8. ISA防火墙策略配置
  9. Mysql 基准测试
  10. 蒲公英内测分发平台是干什么的呢?
  11. 安卓手游脚本开发!闭关在家37天“吃透”这份345页PDF,已开源
  12. JS添加/修改CSS样式
  13. js html url编码,js URLdecode()与urlencode方法支持中文解码
  14. openstack核心组件-块存储 (Block Storage) : Cinder
  15. echarts自定义区域地图
  16. zzulioj1197 考试排名(一)(结构体专题)
  17. dubbo的可扩展机制SPI源码解析(二)
  18. 做一名合格的网络管理员
  19. ffmpeg——压缩mav格式音频
  20. linux ps -ef命令输出详解,Linux-ps命令学习

热门文章

  1. Java的Stack类
  2. File /usr/bin/pip, line 11, in module sys.exit(__main__._main()) AttributeError: 'module' ob...
  3. 随想一·杨柳岸晓风残月
  4. gulp常用组件【study笔记】
  5. c 语言 volatile 关键字
  6. ubuntu下安装php openssl扩展
  7. Redis作为缓存服务器
  8. Eclipse 安装插件
  9. c# 获取文件路径[转]
  10. sql关系数据库计算机,关系数据库语言SQL - 淮阴工学院计算机工程实验中 ….ppt...