接上文继续学习
ncurse的上下左右键获取
想要使用ncurse的功能键,也就是键盘快捷键,不是q、r、t,是 上下左右、F1、F2等等的键,我们叫做功能键要是想用这些功能键需要使用keypad函数
Keypad(stdscr,1); 从stdscr接收标准中,接收功能键,第二个参数表示是否接收:1表示确认接收
本来是这样的来表示的
每个按键在计算机系统中都有对应的数值编码,但具体的编码值取决于终端类型、操作系统和库的实现。
- KEY_DOWN(通常等于 258,即八进制 0402)
- KEY_UP(通常等于 259,即八进制 0403)
- KEY_LEFT(通常等于 260,即八进制 0404)
- KEY_RIGHT(通常等于 261,即八进制 0405)
- 因为魔数问题:使用八进制值 0402、0403 等表示方向键不够直观,建议使用 ncurses 预定义的常量(如 KEY_DOWN、KEY_UP 等)。
- 在 ncurses 标准库 中,方向键通常用预定义的常量(如 KEY_DOWN)表示,而不是直接用数值。0402 这类数值可能是某些终端(如 Linux 控制台或特定终端模拟器)发送的 原始转义序列 的一部分,但不是 ncurses 推荐的写法。
- ncurses 的处理:keypad(stdscr, 1) 会让 ncurses 解析这些转义序列,并将其转换为单个整数值(如 KEY_DOWN)
回顾知识点:在 switch 中,break 的作用是终止 switch 语句的执行流程,避免继续执行后续 case 分支。比如当 key 匹配到某个 case ,执行完对应代码后,break 会让程序跳出 switch ,接着执行 switch 语句后面的代码(在你代码里就是回到 while 循环开始处,等待下一次获取按键 )。
- 魔数问题:使用八进制值 0402、0403 等表示方向键不够直观,建议使用 ncurses 预定义的常量(如 KEY_DOWN、KEY_UP 等)。
贪吃蛇地图
我们来绘制一个20*20的地图
结果为下
代码为
#include <curses.h>
void initgame(){
initscr();
keypad(stdscr,1);
}
void gamepic()
{
int hang;
int lie;
for(hang=0;hang<20;hang++){
if(hang == 0){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
for(lie=0;lie<=20;lie++){
if(lie==0||lie==20){
printw("|");
}else{
printw(" ");
}
}
printw("\n");
}
if(hang>0 && hang<=19){
for(lie=0;lie<=20;lie++){
if(lie==0||lie==20){
printw("|");
}else{
printw(" ");
}
}
printw("\n");
}
if(hang == 19){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
}
}
int main()
{
initgame();
gamepic();
getch();
endwin();
return 0;
}
其中最要注意的是 - 和 | 是占用的占用的宽度是不同的 需要两个--才能和一个|占用的宽度相同,所以我们输出的时候- 要用两个 例如“--” 说白了就是--和|占用的宽度一样
贪吃蛇地图优化及优化点
优化点:因为第0行和第19行都要打印 -- 和 | 那么索性就将第0行到第19行的代码写在一起就是了
优化代码
#include <curses.h>
void initgame()
{
initscr();
keypad(stdscr,1);
}
void gamepic()
{
int hang;
int lie;
for(hang=0;hang<20;hang++){
if(hang == 0){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
if(hang>=0 && hang<=19){
for(lie=0;lie<=20;lie++){
if(lie==0||lie==20){
printw("|");
}else{
printw(" ");
}
}
printw("\n");
}
if(hang == 19){
for(lie=0;lie<20;lie++){
printw("--");
}
printw("\n");
}
}
printw("by shijintao");
}
int main()
{
initgame();
gamepic();
getch();
endwin();
return 0;
}
优化点在这边
if(hang>=0 && hang<=19){
for(lie=0;lie<=20;lie++){
if(lie==0||lie==20){
printw("|");
}else{
printw(" ");
}
}
printw("\n");
}
因为既然0到19行都要 ‘’|‘’ 和空格 那么这样设计代码,也比较符合整体的设计,有20个横线和20个竖线,只是这个横线是写成--,更加贴切了,也减少了代码量
下一节就是写蛇的身子,涉及到指针,结构体和链表的基础