Linux下的图形库curses写贪吃蛇,酷
嵌入式Linux
共 10222字,需浏览 21分钟
· 2021-04-13
最近看到大神在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图形库资料
评论
如何计算数据中心的冷却需求?
今日分享 【导读】数据中心的冷却要求受多种因素影响,包括设备的热量输出、占地面积、设施设计和电气系统功率额定值等等……众所周知,环境因素会严重影响数据中心设备。过多的热量积聚会损坏服务器,可能导致其自动关闭。经常在高于可接受的温度下运行服务器会缩短其使用
数据中心运维管理
0
多人同时导出 Excel 干崩服务器!新来的阿里大佬给出的解决方案太优雅了!
点击关注公众号,Java 干货及时推送↓推荐阅读:面试辅导,我们出大成果了!来源:juejin.cn/post/7259249904777838629前言 业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,
Java技术栈
1
什么样的冷却方法适合数据中心运营?
冷却数据中心的最简单方法是安装空气交换器,通过服务器室生成冷空气。但是,如果想要节省资金,至少从长远来看,更好的方法可能是在每个机架上安装空气交换器,并使用它们为单个机架的服务器降温。"后机架冷却",与数据中心中更为传统的空气冷却系统相比,特别是在能源效率方面,其具有一些优势。冷却数据中心的最简单
数据中心运维管理
0
Go 1.22 的新增功能系列之二:reflect.TypeFor
Go 1.22 的第一个候选版本已经发布,这意味着最终版本即将发布,现在是我在博客中介绍我在这个周期中所做工作的时候了。像往常一样,我的贡献很小,但它们是我的,所以我将从幕后的角度来谈谈它们。首先是reflect.TypeFor。这是整个函数:// TypeFor returns the [Type
GoCN
0
有意思!一个关于 Spring 历史的在线小游戏
发现 Spring One 的官网上有个好玩的彩蛋,分享给大家!进到Spring One的官网,可以看到右下角有个类似马里奥游戏中的金币图标。点击该金币之后,会打开一个新的页面,进入下面这样一个名为:The History Of Spring 的在线小游戏你可以使用上下左右的方向键来控制Spring
公众号程序猿DD
1
了解加密货币到加密货币的互换
1、什么是加密货币互换?加密货币到加密货币的互换是指以现行市场汇率将一种加密货币直接兑换为另一种加密货币。与需要法定货币存款和较长流程的传统交易所不同,加密货币到加密货币的互换可以无缝地促进交换。掉期在提高加密货币的流动性和效率方面发挥着重要作用。该功能使用户能够将他们的加密货币与钱包中的其他代币进
区块链头条
0
李彦宏:开源大模型不如闭源,后者会持续领先;周鸿祎:“开源不如闭源” 的言论是胡说八道
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁0、李彦宏:开源大模型不如闭源,后者会持续领先当今
源码共读
0
Go早期是如何在Google内部发展起来的
2007年Go诞生于Google,2009年Google正式对外宣布了Go语言的开源!时至今日,距离Go开源已经过去了近15个年头了[1]!Go在Google公司内部究竟是怎样的一个状态呢?前Google员工Yves Junqueira近期撰文从其个人所见所闻谈了Go在Google的历程[2]!这里
GoCN
0