基于Linux ncurses图形库的贪吃蛇小游戏

本文介绍了如何利用Linux的ncurses库开发一款贪吃蛇小游戏。ncurses库允许程序在终端上实现不依赖回车的即时输入,如方向键控制。文章详细讲解了ncurses库的初始化、常用函数、keypad功能以及sleep函数的使用,并提供了游戏的完整代码示例。
摘要由CSDN通过智能技术生成

在这里插入图片描述

达者为先  师者之意


前言

为什么要用到ncurses库呢?
因为直接用 scanf 和 getchar 时,需要按下回车才能完成输入;
而贪吃蛇小项目用方向控制小蛇时,不可能按下方向键后还要按下回车;
所以我们需要ncurses库来完成对方向键的输入。

若Ubuntu没有安装ncurses库,则需要安装
执行命令
sudo apt-get install libncurses5-dev
即可安装

如下图所示
没按下回车,用 scanf 不能输入方向键。

#include <stdio.h>
int main()
{
   
printf("------------------------------------\n");
printf("|[][][]                            |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("|                                  |\n");
printf("------------------------------------\n");
char i;
scanf("%c",&i);
return 0;
}

在这里插入图片描述


1 ncurses库程序的标准模式

#include <ncurses.h> //要包含头文件#include <curses.h>
int main()
{
   
  initscr();    //初始化 进入curses模式
  ......
  ......
  ...... 
  endwin();  //退出curses模式
  return 0;
}

1.1 使用ncurses库 ,要包含头文件 #include <curses.h>;(ncurses名字中的n意味着new,即是new curses,假如使用的是curses库, 要加的头文件则是 #include <curses.h>)
1.2 编译时要加上-lncurses ,如 gcc a.c - lncurses,若想要生成自命名为abc的可执行文件,则编译时应为:gcc a.c - lncurses -o abc
1.3 initscr(); // 初始化,进入ncurses模式
1.4 endwin(); // 退出ncurses模式


2 ncurses库的常用函数

2.1 输入

getch(); // 输入一个字符
getstr(); // 输入一串字符串
scanw(“%s”,string); // 输入一串字符串

2.2 输出

addch(); // 显示一个字符
addstr(); // 显示一串字符串
printw(“%c”,变量);// 类似 printf 打印内容
refresh(); //刷新物理屏幕

在我们使用 printw 时,实际上这个数据被打印到一个叫作“stdscr”的虚拟窗口上,没有被直接输出到屏幕上。printw()函数的作用是不断将一些显示标记和相关的数据结构写在虚拟显示器上,并将这些数据写入 stdscr 的缓冲区内。所以,为了显示这些缓冲区中的数据我们必须使用 refresh() 函数告诉 ncurses 系统将缓冲区的内容输出到屏幕上。这种机制可以不断在虚拟屏幕上写入数据,而调用 refresh() 函数时让一切看起来似乎是一次完成的。因为 refresh() 函数只核查窗口和数据中变动的部分,这种富有弹性的设计提供了一个高效的反馈机制。所以说不断在虚拟屏幕上写入数据时,我们应该在 printw函数后加上refresh函数,这样才能实现不断实时显示,而一次的静态显示,可以只用printw。

2.3 keypad(win,bf)

呼叫 keypad 时须传入两个值:
win为 WINDOW 型态指标,通常传入标准输出入屏幕 stdscr,bf 为 TRUE 或 FALSE
当开启 keypad 后, 可以使用键盘上的一些特殊字元, 如上下左右等方向键
curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键,这些定义的特殊键通常以 KEY_ 开头

2.4 睡眠时间函数

sleep();//以秒为单位
unsigned int sleep(unsigned int seconds);
头文件
#include<unistd.h>
sleep()非系统调用,sleep()是在库函数中实现的,它是通过alarm()来设定报警时间,使用sigsuspend()将进程挂起在信号SIGALARM上。
sleep()只能精确到秒级上。sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。
return:若进程暂停到参数seconds 所指定的时间,成功则返回0,若有信号中断则返回剩余秒数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大红烧肉

赠人玫瑰,手留余香。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值