Linux学习篇——基于C语言使用结构体、链表实现贪吃蛇

这篇博客介绍了如何在Linux环境下使用C语言,结合curses图形库,通过链表结构实现贪吃蛇游戏。文章详细讲解了初始化界面、地图制作、链表生成蛇身、移动操作、食物解析以及线程控制等方面,强调了移动时头节点删除和尾节点添加的原理,同时提到了多线程在游戏中的应用以保证游戏流畅运行。
摘要由CSDN通过智能技术生成

一、需要用的头文件以及Linux图形库函数、数据初始化

#include<stdio.h>
#include<curses.h>
#include<stdlib.h>

// 用于调整蛇移动方向,防止蛇移动不合理
#define UP    1
#define DOWN -1
#define LEFT -2
#define RIGHT 2
struct Snake{
   

	int hang; //行
	int lie;  //列
	struct Snake *next; //节点指针
	
};
struct Snake *head = NULL; 	//头节点
struct Snake *wei = NULL;  	//尾巴节点
int direction; 	// 方向
int key; 	// 接受方向键的指令
struct Snake food; 	//控制食物
int cnt =0; 	//进食分数
(1)关于curses.h图形库函数

1.初始化界面

void initcurses()
{
   
	initscr();
	keypad(stdscr,1);
	noecho();
}
  • initscr() :curses程式必备先呼叫函数,作用是系统将根据终端机的形态并启动 curses模式
  • keypad(stdscr,1) :第一个参数stdscr为标准输出荧幕,第二个参数为1(TRUE)/ 0(False),使用keypad目的是为了使用方向键指令
  • noecho() : 防止界面产生乱码,图形界面破坏的情况

2.相关函数使用

  1. getch() :用于从键盘读取一个字元,原理和getchar相似
  2. endwin() :** 用于结束程式,关闭上述的curses模式
  3. move(x,y) : 用于在贪吃蛇吃完食物 / 死亡 需要将地图重新生成并且覆盖旧地图,而不是换行重新打印一张新地图
  4. refresh():用于刷新界面函数,并输出到屏幕

3.使用到curses中的宏建

  • KEY_UP 0403 ↑
  • KEY_DOWN 0402 ↓
  • KEY_LEFT 0404 ←
  • KEY_RIGHT 0405 →

二、地图制作

//该地图是20行20列地图
void Map()
{
   
	int hang;
	int lie;
	move(0,0);	//刷新地图,覆盖旧地图
	for(hang=0 ; hang<20 ; hang++)
	{
   
		if(hang==0)
		{
   
			for(lie=0 ;lie<20;lie++)
			{
   
				printw("--");
			}
			printw("\n");
		}
		else if(hang>0 && hang <19)
		{
   
			for(lie=0 ;lie<=20;lie++)
			{
   
				if(lie ==0 || lie==20)
				{
   
					printw("|");
				}
				else if(calcSnake(hang,lie)) //生成蛇的身体
				{
   
					printw("[]");
				}
				else if(Eatfood(hang,lie) ) //生成蛇的食物
				{
   
					printw("$$");
				}
				else{
   
					printw("  ");
				}
			}
			printw("\n");	
		}
		else
		{
   
			for(lie=0 ; lie<20 ; lie++)
			{
   
				printw("--");
			}
			// 调试信息如下,可以设计添加其他
			printw("\n");
			printw("The Map is by LiuZheng sir make\n"); // 地图制作者
			printw("The food hang = %d,food lie = %d\n",food.hang,food.lie); //记录蛇食物坐标
			printw("Alway eat food score = %d\n",cnt); // 记录蛇吃了多少食物
		}

	}
}

三、蛇身链表的初始化生成

//用于在initsnake中指定方向生成贪吃蛇身体
int  calcSnake(int h,int l)
{
   
	struct Snake *p;
	p = head;
	while(p != NULL)
	{
   
		if(p->hang ==h &&p->lie == l)
		{
   
			return 1;
		}
		p = p->next;
	}
	return 0;

}
//贪吃蛇身体初始化
void initsnake()
{
   
	struct Snake *p;
		
	direction = RIGHT;	//规定刚开始蛇朝着右方向移动

	if(head !=<
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值