基于Linux下,通过c语言、链表、结构体下实现——贪吃蛇小项目
一、需要用的头文件以及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.相关函数使用
- getch() :用于从键盘读取一个字元,原理和getchar相似
- endwin() :** 用于结束程式,关闭上述的curses模式
- move(x,y) : 用于在贪吃蛇吃完食物 / 死亡 需要将地图重新生成并且覆盖旧地图,而不是换行重新打印一张新地图
- 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 !=<