C语言小游戏-贪吃蛇

贪吃蛇

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() {
   
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值