贪吃蛇
ncurse的使用
需要包含头文件
#include<curses.h>
ncurse的介绍
C语言的ncurses库是一个用于控制终端屏幕的库。它提供了一组函数和数据结构,可以用于在终端上创建文本界面和图形界面。
ncurses库允许你在终端上进行以下操作:
- 控制光标的位置
- 设置文本颜色和背景色
- 在屏幕上绘制文本和图形
- 处理键盘输入和鼠标事件
- 创建菜单和对话框等用户界面元素
使用ncurses库,你可以编写交互式的终端应用程序,如文本编辑器、游戏、终端界面的图形化工具等。
ncurses库在Unix-like系统上广泛使用,包括Linux和macOS。它是一个非常强大和灵活的库,可以帮助你创建复杂的终端应用程序。
常用的ncurse的函数
initscr();
该函数可以调用ncurse的引擎
printw();
printw();使用方式和printf一样,原样输出
getch();
防止程序退出,应该和getchar()使用起来差不多
endwin();
程序退出后防止乱码
详细解释上面函数
练习使用上面的函数
代码:
#include<curses.h>
int main()
{
char data;//一个字符变量
initscr();//初始化界面
printw("plase scanf of data\n");
data=getch();//获取字符
printw("\n you scanf of %c\n",data);
getch();//防止程序退出
endwin();//防止出现乱码
return 0;
}
ncurses获取上下左右键
在C语言中,keypad函数是ncurses库中的一个函数,用于启用或禁用终端键盘的特殊键盘码。
keypad(stdscr, 1)是将ncurses库中的stdscr窗口启用特殊键盘码的函数调用。
stdscr是ncurses库中的一个全局变量,表示标准屏幕窗口。通过调用keypad(stdscr, 1),我们可以启用特殊键盘码,使得getch()函数可以返回特殊键盘码。
通过上面函数我们可以准确获得上下左右键的命令,用于控制贪吃蛇的行动
代码:
#include<curses.h>
上面的头文件对上下左右键进行了引用
上:KEY_UP
下:KEY_DOWN
左:KEY_LEFT
右:KEY_RIGHT
#include<curses.h>
int main() {
int data;
initscr();//界面初始化
keypad(stdscr, 1); //使用界面的键盘输入
while (1) {
data = getch(); //获取data的值进行输入
switch (data) {
case KEY_DOWN:
printw("DOWN\n");
break;
case KEY_UP:
printw("UP\n");
break;
case KEY_LEFT:
printw("LEFT\n");
break;
case KEY_RIGHT:
printw("RIGHT\n");
break;
}
}
getch();//防止程序退出
endwin();//防止乱码
return 0;
}
运行结果:
贪吃蛇地图绘制
绘制一个20x20的地图
地图的第一行
代码:注意看注释
#include<curses.h>//需要包含这个头文件
void ncurses1() {
initscr();//界面初始化的函数
keypad(stdscr, 1); //使用特殊键盘
}
void gamemap() {
//定义行和列
int hang, lie;
//地图是20行,建立循环20次
for (hang = 0; hang < 20; hang++) {
if (hang == 0) {
//对第一行进行绘制
for (lie = 0; lie < 20; lie++) {
printw("--");//打印20次--
}
printw("\n");
for (lie = 0; lie <= 20; lie++) {
//第0列和第20列打印一个“|”
if (lie == 0 || lie == 20) {
printw("|");
} else {
//其他位置用空格代替
printw(" ");
}
}
}
}
}
int main() {
//定义一个函数用来初始化界面和使用特殊键盘
ncurses1();
//地图的第一行进行绘制
gamemap();
getch();//防止程序退出
endwin();//防止乱码
return 0;
}
运行结果:
完整地图绘制
代码:
#include<curses.h>//需要包含这个头文件
void ncurses1() {
initscr();//界面初始化的函数
keypad(stdscr, 1); //使用特殊键盘
}
void gamemap() {
//定义行和列
int hang, lie;
//地图是20行,建立循环20次
for (hang = 0; hang < 20; hang++) {
if (hang == 0) {
//第一行地图的绘制
for (lie = 0; lie < 20; lie++) {
printw("--");
}
printw("\n");
}
if (hang >= 0 && hang <= 19) {
//中间0-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 xxx\n");
}
int main() {
//定义一个函数用来初始化界面和使用特殊键盘
ncurses1();
//地图的第一行进行绘制
gamemap();
getch();//防止程序退出
endwin();//防止乱码
return 0;
}
运行结果:
贪吃蛇显示蛇的头
蛇的一个节点的显示
蛇头用“[ ]”来表示
贪吃蛇的节点是一个结构体,包含,行和列坐标以及下一个节点的指针
struct snake{
int hang;
int lie;
struct snake*next;
}
代码:
#include<curses.h>//需要包含这个头文件
//定义出蛇的节点的结构体
typedef struct snakes{
int hang;
int lie;
struct snakes*next;
}node;
//蛇的节点显示在
node t1={
2,2,NULL};
void ncurses1() {
initscr();//界面初始化的函数
keypad(stdscr, 1); //使用特殊键盘
}
void gamemap() {
//定义行和列
int hang, lie;
//地图是20行,建立循环20次
for (hang = 0; hang < 20; hang++) {
if (hang == 0) {
//第一行地图的绘制
for (lie = 0; lie < 20; lie++) {
printw("--");
}
printw("\n");
}
if (hang >= 0 && hang <= 19) {
//中间0-19行地图绘制
for (lie = 0; lie <= 20; lie++) {
if (lie == 0 || lie == 20) {
printw("|");
}else if(t1.hang==hang&&t1.lie==lie)//满足条件打印
{
printw("[]");//打印蛇的节点
}
else {
printw(" ");
}
}
printw("\n");
}
//最后一行地图的绘制
if (hang == 19) {
for (lie = 0; lie < 20; lie++) {
printw("--");
}
printw("\n");
}
}
printw("by xxx\n");
}
int main() {
//定义一个函数用来初始化界面和使用特殊键盘
ncurses1();
//地图的第一行进行绘制
gamemap();
getch();//防止程序退出
endwin();//防止乱码
return 0;
}
运行结果:
分装一个函数显示3个蛇的节点(静态添加)
代码:
#include<curses.h>
typedef struct snakes{
int hang;//蛇的行坐标
int lie;//列坐标
struct snakes*next;//可以指向下一个节点的位置
}node;//蛇,节点结构体
node t1={
2,2,NULL};
node t2={
2,3,NULL};
node t3={
2,4,NULL};
node t5={
2,5,NULL};//设置四个节点的位置
int shejie(int hang,int lie)
{
node*point=&t1;//保留蛇节点t1的地址
while(point!=NULL)
{
//行和列的值和上面4个节点的行和列的值是否相等,满足返回1不满足返回0
if(point->hang==hang&&point->lie==lie)
{
return 1;
}
point=point->next;//访问下一个节点
}
return 0;
}
void ncurses1()
{
initscr();
keypad(stdscr,1);//调用键盘
}
void gamemap()
{
int hang,lie;//行和列
for(hang=0;hang<20;hang++)//绘制20x20的地图需要的循环20次
{
//第一行地图的绘制
if(hang==0)
{
for(lie=0;lie<20;lie++)
{
printw("--");//打印20次--
}
printw("\n");//进行换行
}
//中间部分的绘制
if(hang>=0&&hang<=19)
{
for(lie=0;lie<=20;lie++)
{
if(lie==0||lie==20)
{
printw("|");//第0列和第20列打印一个|
}else if(shejie(hang,lie))//建立函数是否满足条件,满足打印,把hang和lie的值进行传递,
{
printw("[]");
}
else{
printw(" ");//其余部分打印空格两个
}
}
printw("\n");
}
//最后一行地图的绘制
if(hang==19)
{
for(lie=0;lie<20;lie++)
{
printw("--");//打印20次--
}
printw("\n");
}
}
}
int main()
{
ncurses1();//初始化界面和调用特殊键盘
//t1-t5之间节点形成链表
t1.next=&t2;
t2.next=&t3;
t3.next=&t4;
t4.next=&t5;
//绘制出贪吃蛇的地图
gamemap();
getch();//防止退出
endwin();//防止乱码
return 0;
}
运行结果:
贪吃蛇身子的改进,使用malloc来创造空间添加节点
代码:
#include<curses.h>
#include<stdlib.h>
//建立一个蛇节点的结构体
typedef struct node {
int hang;
int lie;//节点的行和列坐标
struct node*next;//指向下一个节点的指针
} snakes;
//定义两个全局变量,头和尾
snakes*head = NULL; //链表头(蛇头)
snakes*tail = NULL; //链表尾(蛇尾)
void ncurses1() {