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,一经查实,立即删除!

相关文章

BUG笔记

1.无法打开lib 你这个 error LNK1104是链接时的错误&#xff0c;应该是需要此库&#xff0c;没办法忽略 找到此库 并在Properties->Linker->Input->Additional Depenncidees里加入库名 在Properties->Linker->General->Additional Library Directories里加入…

STM32f103C8T6 bootloader设计

STM32 bootloader设计 使用的是STM32f103C8T6&#xff1a;64Kflash&#xff0c;在应用程序中通过CAN把接受到的bin写到外置 flash的指定地址处。在bootloader中判断一个单独的标志位看程序是否需要升级&#xff0c;如果需要升级&#xff0c;则复制外置flash处的内容到STM32的内…

初中变成了菜园子了!

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

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

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

VS2010,C++ 制作静态库(*.lib),并使用

VS2010,C 制作静态库(*.lib)&#xff0c;并使用 原文链接&#xff1a;https://blog.csdn.net/qq_41472037/article/details/100001322 简单来说&#xff0c;就是建立两个项目:① Win32 Project &#xff08;Win32 项目&#xff09;&#xff1a; 接口文件.h 和 实现接口文件.cp…

STM32f103——ILI9341

STM32f103 —— ILI9341 #ifndef ILI9341_H_ #define ILI9341_H_#include "type.h"//TFT ILI9341 #define ILI9341_SPI SPI1#define ILI9341_MOSI_GRP GPIOA #define ILI9341_MOSI_IDX GPIO_Pin_7 #define ILI9341_MOSI_LOW() GPIO_ResetBits(ILI…

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

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

《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...

《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》即将与广大考生见面2009年下半年即将开考的系统架构设计师和网络规划设计师两个科目&#xff0c;是自2005年上半年以来首次增加的计算机资格考试高级资格考试&#xff0c;即自2004年以来&#xff0…

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

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

虚拟机压缩

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

checkbox保存和赋值

//货物信息中的表格内容 $.each(trG.find(td input,td select),function(i,inp){if($(inp).attr(type)checkbox){if($(inp).is(:checked)){objG[$(inp).attr(name)]1;}else{objG[$(inp).attr(name)]0;}}else{objG[$(inp).attr(name)]$(inp).val();} }) $.each($(b).find(tr:las…

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,注意安装目录不要有空格和特殊字符, 假设安装…

ASP.NET 安全认证(四)

第四部分 Form 认证的补充 前三篇在 CSDN 论坛公布后&#xff0c;效果如同“神仙放屁——果然不同凡&#xff08;反&#xff09;响”。为感谢广大网友的热情与支持&#xff0c;这不&#xff0c;经过这一阵子的酝酿、修炼&#xff0c;特意准备了这第四响。 之前我们讲述的使用 F…

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

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

g2o库报错

g2o库报错&#xff1a; 修改文件可写命令&#xff1a; sudo chmod 777 文件名1.cs.h error: cs.h could not the file报错的文件/usr/local/include/g2o/solvers/csparse/csparse_helper.h改为cs.h的完整路径&#xff1a; //#include <cs.h> #include "/home/z…

Flash与jsp通信类封装

今天写了一个通信类&#xff0c;可以实现和JSp进行数据交互。粘贴在一起&#xff0c;有兴趣可以尝试一下 package { //用于与网页通信的东西 import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.*; import flash.net.URLVariables; import flash.n…

神琪宝贝

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

android性能测试工具之dumpsys

补记: MAT(memory analyzer tool )是google 推荐的进行内存使用量分析的工具. 功能全面而强大!!! 首先看一下dumpsys有哪些功能&#xff1a; dumpsys 用来给出手机中所有应用程序的信息&#xff0c;并且也会给出现在手机的状态。 dumpsys [Option] meminfo 显示内存信息 cpuin…

QT —— 应用程序发布

QT应用程序的发布 将QT应用程序打包给其他人使用&#xff0c;需要一些dll动态链接库&#xff1b;在QT的安装目录下&#xff0c;如&#xff1a;D:\QT\4.8.5\bin中寻找&#xff1b;&#xff08;发布的时候选择release版本的可执行程序&#xff09;。 步骤&#xff1a; 1、在桌面新…

Raspbian 中国软件源

花了些时间整理了目前最新的树莓派中国大陆地区的软件源&#xff0c;记下来&#xff0c;希望对大家有帮助。 中国科学技术大学Raspbian http://mirrors.ustc.edu.cn/raspbian/raspbian/ 阿里云Raspbian http://mirrors.aliyun.com/raspbian/raspbian/ 清华大学Raspbian http://…