达者为先 师者之意
基于Linux ncurses图形库的贪吃蛇小游戏
前言
为什么要用到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,若有信号中断则返回剩余秒数。