2048游戏c语言linux简易代码,C语言实现2048游戏代码

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

效果图:

65c92b2eac3570cdbed909073494a5d8.png

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

设计思路:

在满足条件情况下消除方块

允许在游戏主界面(16 宫格)中任意一格输出数据

实现代码:

#include

#include

#include

#include

#include

#include

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);

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux访问网站出现443,Linux访问网站一直出现超时

问题描述&#xff1a;开发java应用时&#xff0c;需要访问此网站&#xff0c;在windows上一切正常访问&#xff0c;部署到linux服务器上就出现了访问超时[rootVM_18_115_centos ~]# wget https://wap.zhengzhoubus.com/buswechat/WifiBusInterface/transfer/line!getLineAll.ac…

linux十大证书,验证Linux上的X.509证书

openssl verify会做你想要什么&#xff0c;如果你想有一个简单的工具&#xff1a;从运行&#xff1a;cd /usr/share/ca-certificatesfind . -type f -exec openssl -verify {} \;这里有一个选择的输出&#xff1a;./telesec.de/deutsche-telekom-root-ca-2.crt: OK./brasil.gov…

linux shell结构,linux——Shell的控制结构(附shell编写代码和运行结果)

针对shell的控制结构&#xff0c;也就是shell编程时所需要的三种控制流程&#xff0c;顺序/分支和循环。在bash中&#xff0c;顺序可由简单的输入输出命令组成&#xff1b;分支语句由if、case实现&#xff1b;循环语句用for、while和until来实现。一、if语句1、基本的if语句语句…

c语言里字符串和字符串字面量,string literals(字符串字面量)

构造一个指定字符数组类型的未命名对象&#xff0c;用于需要在源代码中嵌入字符串时使用。句法" s-char-sequence "(1)u8 " s-char-sequence "(2)(since C11)u " s-char-sequence "(3)(since C11)U " s-char-sequence "(4)(since C11)…

c语言 函数指针开销,函数指针是否使程序变慢?

AnT..82您可以看到,在从性能角度来看实际上很重要的情况下,例如在一个周期中多次重复调用该函数,性能可能根本不同.这对于人们来说可能听起来很奇怪,他们习惯于将C代码视为由抽象的C机器执行的,其机器语言与C语言本身密切相关.在这种情况下,"默认情况下"对函数的间接…

tms320c2000 c语言伪指令,TMS320F240XDSP汇编及C语言多功能控制应用(附光盘)

摘要&#xff1a;本书以SNF2407M实验开发系统配合CPLD的SNDSP2407P接口,以简易的C语言和快速的汇编语言编写达20个以上的范例实验及多个专题制作,主要内容如下:TMS320LF2407系列MCU的硬件架构,内存配置及指令格式和其运作功能;C2000的CC或CCS程序的编辑,编译及除错等操作;DSP搭…

用C语言编写绳索运动函数,福建省教师招聘考试小学数学真题试卷

2014年福建省中小学新任教师公开招聘考试小学数学试卷(课程代码09202)1. 本试卷满分150分&#xff0c;考试时间120分钟。2. 本试卷分为两部分&#xff1a;第一部分为选择题&#xff0c;第二部分为非选择题。3. 请把所有答案涂、写在答题卡上。不要错位、越界答题.一、单项选择题…

c语言 三个小球排排坐,关颖三个孩子排排坐 太萌啦

0关颖三个孩子排排坐 太萌啦2019-12-10 10:596月20日&#xff0c;关颖在微博上晒出三个孩子坐在垫子上的照片&#xff0c;配文&#xff1a;“Terrible two has officially started today. Happy happy birthday Phi Phi! 家庭乐趣其中一件事情 就是和小朋友不断的唱生日歌吹蜡烛…

大学生学C语言用什么笔记本电脑,有哪些适合大学生用的笔记本电脑

高考成绩公布之后又有一大波新大学生即将入学&#xff0c;笔记本电脑也将是大学生必不可少的一款电子数码产品&#xff0c;但是现在市面上电脑繁多&#xff0c;又有哪些比较不错的电脑适合新入学的大学生呢&#xff1f;惠普 HP Envy 13 (2019)现在&#xff0c;最适合学生的笔记…

android自带下拉阻尼动画,android 有阻尼下拉刷新列表的实现方法

本文将会介绍有阻尼下拉刷新列表的实现&#xff0c;先来看看效果预览&#xff1a;这是下拉状态&#xff1a;这是下拉松开手指后listView回滚到刷新状态时的样子&#xff1a;1. 如何调用虽然效果图看起来样子不太好看&#xff0c;主要是因为那个蓝色的背景对不对&#xff0c;没关…

android viewpager画廊,Android使用ViewPager实现画廊效果

按照国际惯例&#xff0c;先上效果图其实这跟普通的ViewPager原理都一样&#xff0c;需要改变的地方就是&#xff1a;1.增加滑进和滑出的动画效果2.缩小ViewPager的大小&#xff0c;给屏幕上留出上一张和下一张视图的空间布局文件&#xff1a;xmlns:android"http://schema…

excel 区间人数柱状图_Excel中,区间统计的3种技巧都不掌握,那就真的OUt了!

点击上方"Excel函数公式"免费订阅 Excel的最大功能在于数据的分析与处理&#xff0c;在数据分析和处理中&#xff0c;区间统计是非常广泛的&#xff0c;各位亲是怎么操作的呢&#xff1f;如果还不掌握&#xff0c;且看小编给大家带来的“区间统计”的3种应用技巧。一…

nova8pro能升级鸿蒙吗,华为将有48款产品可以升级到鸿蒙 2.0系统

网站Huawei Central最近报道称&#xff0c;将有48款产品可以升级到鸿蒙 2.0系统&#xff0c;包括华为及其子品牌Honor的智能手机&#xff0c;平板电脑和智能手表。 Huawei Central名单中有3款未发布的手机Huawei Nova 8和Nova 8 Pro&#xff0c;以及Honor V40。 它们将在推出时…

patran如何看屈曲因子_校准证书中的修正值、修正因子,你真的会用吗?

一些仪器设备校准回来会产生修正值/修正因子&#xff0c;然而很多实验室小伙伴们不懂得如何正确使用这些修正值/修正因子&#xff1f;为帮助广大实验室能规范正确地使用修正值/修正因子&#xff0c;小析姐 特为大家推送这篇文章~【概念】修正值&#xff1a;为修正某一测量器具的…

android 生成debug.keystore,android sdk 如何重新生成debug.keystore

1)首先你要确定你安装的JDK位置&#xff0c;Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式下查看你当前系统的path是否已经包含了。如果没有包含添加到当前环境参数中。因为我们要用到的keytool命令在这个目录下呀。2)接下来…

已知a类被打包在packagea_2021考研干货:199管理类联考综合逻辑归纳习题(1)

199管理类联考综合中的逻辑&#xff0c;所占分值为60分。因此&#xff0c;备考2021考研199管综的考生们&#xff0c;需要在内容上面多下功夫复习。题目&#xff1a;小张夫妇想买套房子&#xff0c;经他一番挑选&#xff0c;目标锁定某座楼的3套房。已知&#xff1a;这三套房子中…

凯立德手机导航(家园版) v5.3 for android,凯立德手机导航(家园版)android平台

感谢您阅读凯立德手机导航产品下载安装教程&#xff0c;请根据以下步骤进行操作。下载安装过程完成后&#xff0c;您将体验到更为专业的凯立德导航服务。安装前请认真阅读以下文字&#xff1a;1、为了减少导航产品所占容量&#xff0c;本导航产品分主程序和地图数据两部分。下载…

android性能优化 掘金,Android性能优化之内存泄漏

内存泄漏&#xff1a;内存单元使用完成后未释放&#xff0c;未回收。理解强弱引用和gc垃圾回收机制后&#xff0c;会更好的理解内存泄漏问题。在目前的Android项目中&#xff0c;内存泄漏是无法避免的&#xff0c;在编写代码时要是否产生了内存泄漏。内存泄露中要注意对象、变量…

clocks_per_sec 时间不正确_你该拥有的不只是护肤品,还有正确护肤时间表

同样是护肤&#xff0c;为什么你的效果始终不如意&#xff1f;其实&#xff0c;不同的时间段&#xff0c;皮肤各司其职&#xff0c;都有着不同的“任务”和“状态”。快跟芭姐一起了解一下这份《皮肤时间表》&#xff0c;看看如何让护肤效果事半功倍吧&#xff01;清洁是唤醒肌…

jdbc连接数据scanip_JDBC连接数据库的四种方式:DriverManager,DataSource,DBCP,C3P0

方法1&#xff1a;使用java.sql.DriverManager类驱动管理器类&#xff0c;用于管理所有注册的驱动程序。(注&#xff1a;DataSource 接口是 JDBC 2.0 API 中的新增内容&#xff0c;它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。)常用的两…