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 shell结构,linux——Shell的控制结构(附shell编写代码和运行结果)

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

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;本导航产品分主程序和地图数据两部分。下载…

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

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

HTML下拉菜单怎么做成横向,css导航条横向带下拉菜单

cssdiv导航下拉二级菜单竖排效果如何改为横排&#xff1f;&#xff0c;在“下一站”有三个二级竖排菜单&#xff0c;如何能变为横排&#xff1f;困扰了我一天了&#xff0c;让二级菜单变成一行&#xff0c;只需要在竖排的效果上&#xff0c;让二级菜单都浮动起来&#xff0c;这…

html5折叠卡片,基于HTML5折叠卡片式下拉菜单代码

基于HTML5折叠卡片式下拉菜单代码。这是一款基于jQueryCSS3HTML5实现的下拉列表框特效代码。效果图如下&#xff1a;实现的代码。hmtl代码&#xff1a;爱编程爱编程 jQuery特效 CSS3特效 HTML5特效 音效下载 flash动画js代码&#xff1a;(function ($) {var cards $(.card-dro…

fastexcel读取excel追加写入sheet页_python笔记52:python操作excel

主要内容&#xff1a;小目标&#xff1a;掌握excel模块主要内容&#xff1a;excel相关模块&#xff0c;openpyxl安装使用如果看完这篇文章&#xff0c;你还是弄不明excel相关操作&#xff1b; 你来找我&#xff0c;我保证不打你&#xff0c;我给你发100的大红包。1. excel相关操…

HTML音乐播放没声音,网页没有声音但系统显示有声音怎么回事?如何解决?

网友提问&#xff1a;为什么网页没有声音&#xff0c;除了迅雷高清在线影院的视频有声音和本已经下载的歌或视频有声音外&#xff0c;其他网页都没有声音&#xff01;就是网页没声音&#xff0c;其他一切正常&#xff01;网页没有声音但系统显示有声音&#xff1b;网页在线视频…

cesium 经纬度绘制点_炫酷大屏地图自定义绘制(一)

现在数据中台的概念炒的火热&#xff0c;那在收集到数据后就要想办法去设计大屏&#xff0c;可视化展现。往往大屏都会涉及到地理位置的显示。对于常见的省市区&#xff0c;网上都已经提供了地理json数据&#xff0c;那对于需要定制化的我们要怎么处理呢&#xff1f;首先我们还…

html瞄点四大名著有图片,四大名著手抄报图片图和文字资料

四大名著之【三国演义】罗贯中(1330年一1400年之间)&#xff0c;名本&#xff0c;号湖海散人&#xff0c;明代通俗小说家。他的籍贯一说是太原(今山西)&#xff0c;一说是钱塘(今浙江杭州)&#xff0c;不可确考。据传说&#xff0c;罗贯中曾充任过元末农民起义军张士诚的幕客&a…

怎样查询2021高考模拟成绩,2021年高三一模二模三模哪个成绩更接近高考成绩,看看网友是怎么评论...

2021年高三一模二模三模哪个成绩更接近高考成绩虽然大多数人认为一模的成绩最接近高考&#xff0c;基本定型了&#xff0c;但高考变幻莫测&#xff0c;成绩很有可能发生变化&#xff0c;成绩升降都是很难说的。高三一模之后成绩也没有定型&#xff0c;还有最后逆转的机会。高考…

js遍历json数组给html td赋值,JS实现给json数组动态赋值的方法示例

关注微信公众号JS实现给json数组动态赋值的方法示例转载 更新时间&#xff1a;2017年07月04日 10:19:00 作者&#xff1a;小魏的马仔这篇文章主要介绍了JS实现给json数组动态赋值的方法,结合实例形式分析了javascript针对json数组的遍历、赋值等常用操作技巧,需要的朋友可以…