Linux下的图形库curses写贪吃蛇,酷

最近看到大神在Linux下写的贪吃蛇代码,用到了curses图形库,可能很多人都没有用过,分享出来给大家。

在ubuntu下安装curses图形库命令

sudo apt-get install libncurses5-dev

双buff是一个非常优秀的机制,之前写贪吃蛇的时候,如果不使用双buff屏幕跳动会很剧烈,使用了双buff后体验就非常好。

我们使用curses图形库也是一样,如果没有调用refresh()函数之前,显示的屏幕是不会进行更新的。

比如下面这段代码

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
int main()
{initscr();/* We move the cursor to the point (5,15) on the logical screen,print "Hello World" and refresh the actual screen.Lastly, we use the call sleep(2) to suspend the program for two seconds,so we can see the output before the program ends. */move(5, 15);addstr("Hello World");refresh();sleep(2);endwin();exit(EXIT_SUCCESS);
}

使用下面的命令编译并运行

gcc -o t screen1.c -lncurses && ./t

首先初始化一个屏幕,然后移动到屏幕的 5,15位置,在输出字符串 Hello World。之后休眠 2秒后,程序退出。

使用curses写贪吃蛇代码

//sudo apt-get install libncurses5-dev
//gcc -o t tanchishe.c -lncurses && ./t
#include <curses.h> // Linux 下的图形库
#include <unistd.h> // usleep()
#include <stdlib.h> // rand()
#include <time.h>   // time()
#define W 40
#define H 24
int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0, t = 0, d = 1, i;
int main(void) {initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);srand(time(NULL));for (i = 0; i < W * H; i++)m[i] = !(i / W % (H - 1) && i % W % (W - 1));m[q[t = (t + 1) % (W * H)] = p] = 1;do { a = rand() % (W * H); } while (m[a]);while ((i = getch()) != 27) {if      (i == KEY_UP    && d !=  W) d = -W;else if (i == KEY_DOWN  && d != -W) d =  W;else if (i == KEY_LEFT  && d !=  1) d = -1;else if (i == KEY_RIGHT && d != -1) d =  1;if (m[p += d]) break;m[q[t = (t + 1) % (W * H)] = p] = 1;if (p == a) do { a = rand() % (W * H); } while (m[a]);else m[q[h = (h + 1) % (W * H)]] = 0;for (i = 0; i < W * H; i++)mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");mvaddstr(a / W, (a % W) * 2, "()");refresh();usleep(100000);}while (getch() == ERR);endwin();
}

程序运行

简单解释下

for (i = 0; i < W * H; i++)mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");

构建边框和蛇身的代码,边框是用 [] 构建的,用这个字符从视觉上看会比较舒服。

mvaddstr(a / W, (a % W) * 2, "()");

随机生成的食物,之前已经用时间srand(time(NULL));作为种子设置了随机数。

if (m[p += d]) break;

碰撞检测

if (p == a) do { a = rand() % (W * H); } while (m[a]);else m[q[h = (h + 1) % (W * H)]] = 0;

如果碰撞到了食物,就增加蛇长度,m[]里面同时保存蛇的数据和边框的数据,并且蛇移动的时候,需要把后面的数值设置为0。

p = H / 2 * W + (W / 2)

蛇的初始位置


自己修改的代码,可以实现穿墙效果

//sudo apt-get install libncurses5-dev
//gcc -o t tanchishe.c -lncurses && ./t
#include <curses.h> // Linux 下的图形库
#include <unistd.h> // usleep()
#include <stdlib.h> // rand()
#include <time.h>   // time()
#define W 40
#define H 24
int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0, t = 0, d = 1, i,j=3;
int main(void) {initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);srand(time(NULL));for (i = 0; i < W * H; i++) m[i] = !(i / W % (H - 1) && i % W % (W - 1));m[q[t = (t + 1) % (W * H)] = p] = 1;do { a = rand() % (W * H); } while (m[a]);while ((i = getch()) != 27) {if      (i == KEY_UP    && d !=  W) {d = -W;j=0;}else if (i == KEY_DOWN  && d != -W) {d =  W;j=1;}else if (i == KEY_LEFT  && d !=  1) {d = -1;j=2;}else if (i == KEY_RIGHT && d != -1) {d =  1;j=3;}if (m[p += d]) {switch(j){case 0:p = p+(H-2)*W; break;case 1:p = p-(H-2)*W; break;case 2:p = p+W-2; break;case 3:p = p-W+2; break;default: p = H / 2 * W + (W / 2); break;}};m[q[t = (t + 1) % (W * H)] = p] = 1;if (p == a) do { a = rand() % (W * H); } while (m[a]);else m[q[h = (h + 1) % (W * H)]] = 0;for (i = 0; i < W * H; i++){mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");}mvaddstr(a / W, (a % W) * 2, "()");refresh();usleep(100000);}while (getch() == ERR);endwin();
}

运行如下:

代码原文:

https://www.zhihu.com/question/360814879/answer/1013986215

公众号后台回复「curse」获取curse图形库资料


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

初中变成了菜园子了!

我家在四川省射洪县天仙镇凤鸣场&#xff0c;属于四川盆地山区&#xff0c;在四川中部&#xff0c;发源于川北羌塘群山的涪&#xff08;fu&#xff09;江流经射洪县城。天仙镇原名天仙寺&#xff0c;附近很多乡镇都是奇怪的名字&#xff1a;大庙、双庙、佛照、玉贞观。我怀疑这…

单片机数字滤波算法如何实现?(附代码)

ID&#xff1a;技术让梦想更伟大整理&#xff1a;李肖遥单片机主要作用是控制外围的器件&#xff0c;并实现一定的通信和数据处理。但在某些特定场合&#xff0c;不可避免地要用到数学运算&#xff0c;尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机…

利用云计算打造政务信息化及应急指挥云平台

本文转载自星光云http://www.365yun.top/news/list.asp?newsid24云计算平台提供最全面的、集成度最高的开放平台&#xff0c;构建和管理面向运营、运维、用户服务的云数据中心管理平台&#xff1b;需集成计算、存储、网络、安全及管理&#xff0c;能够提供满足从基础设施到应用…

项目实战,平均负载过高,最后发现却是这个搞鬼

1.前言最近在项目上遇到负载均衡过高的问题&#xff0c;分析好几天&#xff0c;还因此移植了一个CPU检测工具&#xff0c;后面在小二哥的指导找到了问题原因&#xff0c;小二哥有些读者应该会比较熟悉&#xff0c;之前发的微信滑动卡顿就是他分析的&#xff0c;他是一个非常厉害…

虚拟机压缩

virtualbox虚拟机运行久了之后就会发现&#xff0c;磁盘镜像vdi文件越来越大。即使你把虚拟机中的大文件删除&#xff0c;这个vdi文件占用的空间还是不变。也就是说动态扩展的vdi文件只会大&#xff0c;不会小。那么大的文件对于备份和分享都不是很方便&#xff0c;所以有必要的…

QT——QT4.8.5安装与配置

Qt4.8.5安装 1、安装包 mingw32-4.4.0.7z qt-creator-windows-opensource-2.8.0.exe qt-win-opensource-4.8.5-mingw.exe 2、安装步骤 &#xff08;1&#xff09;、首先安装qt creator,双击qt-creator-windows-opensource-2.8.0,注意安装目录不要有空格和特殊字符, 假设安装…

Linux中,文件创建的时间是怎么保存的?

今天在微信群里有人提问&#xff0c;如果创建一个文件&#xff0c;创建这个文件的时间是保存在哪里的。所以就查到了这篇文章。在介绍inode结构体之前先做一个链接文件的实验&#xff1a;1.创建一个普通的文件test.txt&#xff0c;并写入内容查看&#xff0c;如下2.创建test.tx…

神琪宝贝

团队名称&#xff1a;神琪宝贝团队人员&#xff1a; 姓名&#xff1a;温广琪&#xff08;组长&#xff09;学号&#xff1a;1600802130博客&#xff1a;http://www.cnblogs.com/wenwenwgq/技术&#xff1a;C&#xff0c;Java&#xff0c;python&#xff0c;网站兴趣&#xff1a…

汇顶科技2021秋招笔试

来源于读者投稿&#xff0c;作者Angel。笔试时间&#xff1a;2020.08.24&#xff0c;20&#xff1a;00-21&#xff1a;00提醒&#xff1a;很多大公司秋招在七八月份就要投递简历&#xff0c;九月已经晚了。题型&#xff1a;通用部分单选10道 不定项选择题2道 填空题2道 开放题目…

科大讯飞2021笔试题

来源于读者投稿&#xff0c;作者Angel笔试时间&#xff1a;2020.09.12,19&#xff1a;00——21&#xff1a;00岗位&#xff1a;嵌入式软件开发题型&#xff1a;四道编程题&#xff0c;4*1040分题目1、定义一个n*m矩阵&#xff0c;找到两个不在同一行同一列的数字&#xff0c;使…

跨交换机VLAN配置

CCNP实验之&#xff08;跨交换机VLAN&#xff09;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />跨交换机设置原则:存在一台VLAN服务器&#xff0c;可以存在多台vlan客户端&#xff0c;那么需要配置VTP域。交换机的连接需干线&…

详细记录丨Realtek RTL8188FU WiFi 驱动移植

1 参考资料 1、芯片数据手册&#xff1a;TL8188FCA.pdf2、驱动移植手册&#xff1a;Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf3、【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3.pdf4、Linux 添加 WiFi 驱动&#xff1a;https://blog.csdn.net/sbddbfm/…

拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!

来源&#xff1a;数码之家文 | 禅哥这台机器在本人的eBay收藏夹里呆了很久&#xff0c;某日无意间扫了一眼收藏夹&#xff0c;突然发现卖家大降价&#xff0c;只要15刀&#xff0c;还有best offer选项。15刀你买不了吃亏&#xff0c;15刀你买不了上当。事不宜迟果断下手。根据非…

ZJOI2018 Round2 游记

day0 高铁上颓了一部电影,然后闭上眼睛就到了 醒来之后发现被绑了艹,袖子被打了个结,搞了 \(20\) 分钟才解开,真想把绑我的人吊起来 \(xxx\) 公交车上碰到一位长者,被教育了一顿 长者:"你们大学生呐,戴着一副眼镜,肯定不是读书读出来的,玩游戏玩多了吧?" 我:".…

使用PWM实现语音播放

本文转自ARM中文社区&#xff0c;作者&#xff1a;Xiaoya链接&#xff1a;https://community.arm.com/cn/b/blog/posts/nucleof429-2-pwm事实上大部分MCU都可以实现语音播放下面是一段音频数据的波形局部放大图&#xff1a;以一定的速度采样&#xff08;ADC&#xff09;这些波形…

C小项目 —— 学生选课系统

C小项目 —— 学生选课系统#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<conio.h>typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t;#define CLASS_CLS system("cl…

为了杀蚊子,他用树莓派DIY了一把激光枪!

本文经AI新媒体量子位&#xff08;公众号ID&#xff1a;QbitAI&#xff09;授权转载&#xff0c;转载请联系出处。世人苦蚊子久矣。尤其在夏夜&#xff0c;耳边嗡嗡作响&#xff0c;甚至还得与其“挑灯夜战”个三百回合。为此&#xff0c;一个国外博士便DIY了一种高端的杀蚊方式…

java获取操作系统信息

Java代码 import java.util.Properties; Properties propsSystem.getProperties(); //获得系统属性集 String osName props.getProperty("os.name"); //操作系统名称 String osArch props.getProperty("os.arch"); //操作系统构架 String osVe…

scp和sftp常用操作

文件异地直接复制&#xff1a; scp SCP的全称是secure copy (remote file copy program)&#xff0c;此命令是openssh-clients附带的,它的作用就是在机器之间实现拷贝&#xff0c;且机器之间的传输完全是加密的。 最简单的 scp 用法如下&#xff1a; [rootwww ~]# scp [-pr] [-…

SM7250(高通5G)平台LCD bringup

写在前面的话高通平台显示这一块&#xff0c;自从去年开始&#xff0c;高通全面使用SMxxxx命名的芯片比如高端系列&#xff1a;SM8350(骁龙888)&#xff0c;SM8250(骁龙865)&#xff0c;SM8150(骁龙855)中端系列&#xff1a;SM7250&#xff08;骁龙765g&#xff09;&#xff0c…