C语言在linux终端下实现2048小游戏:第二版
原来我转载过一个机遇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小游戏:第二版相关推荐
- linux小型游戏系统设计,Linux平台下基于JAVA小游戏_设计文档.doc
Linux课程设计报告 课题名称:<Linux平台下基于java小游戏设计> 专 业:2011级计算机科学与技术 组 长:043佘清泉 组 员:007陈威达 008陈学仁 026赖华标 0 ...
- 2048小游戏 java版(代码+注释)
一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏.写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来.(需要用的可直接 ...
- 详解Linux终端下编写“贪吃蛇”游戏
大一学习C语言的时候就想要用Turbo C编写一个视频小游戏出来,种种原因后面搁浅了,现在借着学习Linux系统编程的劲头,编写了一个终端下可以运行的贪吃蛇游戏,其中此视频游戏用到的一些知识和操作系统 ...
- 2048小游戏(网页版)
这是JS文件 ↓ /*这是JS文件*/ (function(window, document, $) {function Game2048(opt) {var prefix = opt.prefix, ...
- DAYU200 2048 小游戏- OpenHarmony版
介绍 2048游戏的规则是这样的:在一个4乘以4的格子里,游戏开始后,从所有的空格子中随机选择两个空格子,对于随机选择的这两个空格子,在每个空格子里填入2或4.接下来,使用上下左右四个方向键进行操作. ...
- linux终端输出c语言程序,Linux终端程序用c语言实现改变输出的字的颜色
颜色代码: 格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo "\033[41;36m something here \033 ...
- Linux C语言编写2048小游戏
2048 2048小游戏是用Linux C语言写的,运行在Ubuntu系统上,其中Ubuntu链接Ncuses库.首先,我们简单了解一下Ncurses. Ncurses库是由原CURSES库发展而来的 ...
- Go语言在Linux环境下输出彩色字符
Go语言在Linux环境下输出彩色字符 Go语言要打印彩色字符与Linux终端输出彩色字符类似 fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x ...
- linux 如何查看终端格式,你应该还不知道,Linux终端下的 Markdown 文档查看器
原标题:你应该还不知道,Linux终端下的 Markdown 文档查看器 现在,Markdown 差不多已经成为技术文档的标准.它可以实现技术文档的快捷写作,以及输出发布.同样都是标记语言,但Mark ...
最新文章
- linux中544进程,Linux基础--进程管理及其基本命令
- make、make是什么??
- RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法
- 3月2日 PCA的应用示例
- FlashFXP 自动上传备份到指定FTP服务器的方法
- 计算机桌面通过网络在拼接屏上显示,一种多个拼接屏实时同步显示方法与流程...
- Android 实现计时器功能,Android计时器的三种实现方式(Chronometer、Timer、handler)...
- ISA防火墙策略配置
- Mysql 基准测试
- 蒲公英内测分发平台是干什么的呢?
- 安卓手游脚本开发!闭关在家37天“吃透”这份345页PDF,已开源
- JS添加/修改CSS样式
- js html url编码,js URLdecode()与urlencode方法支持中文解码
- openstack核心组件-块存储 (Block Storage) : Cinder
- echarts自定义区域地图
- zzulioj1197 考试排名(一)(结构体专题)
- dubbo的可扩展机制SPI源码解析(二)
- 做一名合格的网络管理员
- ffmpeg——压缩mav格式音频
- linux ps -ef命令输出详解,Linux-ps命令学习
热门文章
- Java的Stack类
- File /usr/bin/pip, line 11, in module sys.exit(__main__._main()) AttributeError: 'module' ob...
- 随想一·杨柳岸晓风残月
- gulp常用组件【study笔记】
- c 语言 volatile 关键字
- ubuntu下安装php openssl扩展
- Redis作为缓存服务器
- Eclipse 安装插件
- c# 获取文件路径[转]
- sql关系数据库计算机,关系数据库语言SQL - 淮阴工学院计算机工程实验中 ….ppt...