(C语言贪吃蛇)13.实现贪吃蛇四方向的移动
创作时间:
作者:
@小白创作中心
(C语言贪吃蛇)13.实现贪吃蛇四方向的移动
引用
CSDN
1.
https://blog.csdn.net/2303_79502195/article/details/142697375
本文将详细介绍如何使用C语言实现贪吃蛇游戏的四方向移动功能。通过定义方向常量、修改节点添加和删除函数,以及更新方向控制函数,我们可以让贪吃蛇根据玩家输入的方向键灵活移动。
前言
在上一节中,我们通过Linux线程实现了两个while(1)
循环同时运行,这样就可以一边控制方向一边刷新出贪吃蛇的身体节点了。本节我们就来实现贪吃蛇四方向的移动。
原代码预览
我们之前的代码是通过moveSnake()
函数实现贪吃蛇的移动的:
#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
struct Snake
{
int hang;
int lie;
struct Snake * next;
};
struct Snake * head = NULL;
struct Snake * tail = NULL;
int key;
void initNcurse()
{
initscr();
keypad(stdscr,1);
}
int hasSnakeNode(int i,int j)
{
struct Snake * p;
p = head;
while(p != NULL)
{
if(p->hang == i && p->lie == j)
{
return 1;
}
p = p -> next;
}
return 0;
}
void gamePic()
{
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");
}
if(hang >= 0 && hang <= 19)
{
for(lie = 0;lie <= 20;lie ++)
{
if(lie == 0 || lie == 20) printw("|");
else if(hasSnakeNode(hang,lie)) printw("[]");
else printw(" ");
}
printw("\n");
}
if(hang == 19)
{
for(lie = 0;lie < 20;lie ++)
{
printw("--");
}
printw("\n");
printw("by beiweiqiuAC,%d\n",key);
}
}
}
void addNode()
{
struct Snake * new = (struct Snake *)malloc(sizeof(struct Snake));
new->hang = head->hang;
new->lie = tail->lie+1;
new->next = NULL;
tail->next = new;
tail = new;
}
void initSnake(){
struct Snake * p;
while(head != NULL)
{
p = head;
head = head -> next;
free(p);
}
head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang = 1;
head->lie = 1;
head->next = NULL;
tail = head;
addNode();
addNode();
addNode();
addNode();
}
void deleNode()
{
// struct Snake * p;
// p = head;
head = head ->next;
// free(p);
}
void moveSnake()
{
addNode();
deleNode();
if(tail ->hang == 0 || tail->lie == 0 || tail->hang == 20 || tail ->lie == 20)
{
initSnake();
}
}
void* refreshJieMian()
{
while(1)
{
moveSnake();
gamePic();
refresh();
usleep(100000);
}
}
void* changeDir()
{
while (1)
{
key = getch();
switch (key)
{
case 0402:
printw("DOWN\n");
break;
case 0403:
printw("UP\n");
break;
case 0404:
printw("LEFT\n");
break;
case 0405:
printw("RIGHT\n");
break;
}
}
}
int main()
{
pthread_t t1;
pthread_t t2;
initNcurse();
initSnake();
gamePic();
pthread_create( &t1, NULL,refreshJieMian, NULL);
pthread_create( &t2, NULL, changeDir, NULL);
while(1);
getch();//防止程序退出
endwin();
return 0;
}
那么我们详细看一下moveSnake()
函数:
void moveSnake()
{
addNode();
deleNode();
if(tail ->hang == 0 || tail->lie == 0 || tail->hang == 20 || tail ->lie == 20)
{
initSnake();
}
}
可以很明显的看出主要是由addNode()
和deleNode()
两个函数控制。
解决方法
那我们有没有办法使这两个函数更智能呢?(新节点的行和列坐标要根据方向来确定)那么我们来定义出方向的全局变量 。
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
int dir;
并且我们在初始化贪吃蛇的时候加上初始方向(initsnake()
)。下面为修改后的initSnake()
函数
void initSnake(){
struct Snake * p;
dir = RIGHT;
while(head != NULL)
{
p = head;
head = head -> next;
free(p);
}
head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang = 1;
head->lie = 1;
head->next = NULL;
tail = head;
addNode();
addNode();
addNode();
addNode();
}
上文可以知道,我们显示贪吃蛇的节点,改变贪吃蛇的节点是通过addNode()
和deleNode()
两个函数,那么我们只需要在addNode()
增加上下一节点位置的判断即可。在贪吃蛇移动的过程中只有四种情况,上下左右,所以简单的switch()
语句就可以满足我们的要求。
void addNode()
{
struct Snake * new = (struct Snake *)malloc(sizeof(struct Snake));
new->next = NULL;
switch(dir)
{
case UP:
new->hang = head->hang - 1;
new->lie = tail->lie;
break;
case DOWN:
new->hang = head->hang + 1;
new->lie = tail->lie;
break;
case LEFT:
new->hang = head->hang;
new->lie = tail->lie - 1;
break;
case RIGHT:
new->hang = head->hang;
new->lie = tail->lie + 1;
break;
}
tail->next = new;
tail = new;
}
于此同时我们也需要修改changeDir()
函数:
void* changeDir()
{
while (1)
{
key = getch();
switch (key)
{
case 0402:
dir = DOWN;
break;
case 0403:
dir = UP;
break;
case 0404:
dir = LEFT;
break;
case 0405:
dir = RIGHT;
break;
}
}
}
运行效果
该文件默认命名为snake11.c
。打开终端输入以下指令编译该文件:
gcc snake11.c -lcurses
系统会默认生成一个名为“a.out”的可执行文件,输入以下指令执行该程序:
./a.out
运行效果一:
运行效果二:
总结
我们本节实现了贪吃蛇四方向移动,按住上下左右四个键就会做出相同的反馈,是我们想要的效果。
热门推荐
激光近视手术后如何保养?八大护理要点助力视力恢复
有效减少肚子赘肉的科学饮食与运动方法,助你重拾自信!
内网穿透延迟高怎么解决
如何选择珍珠项链尺寸
国医大师洪广祥:治疗肺系疾病经验
长春:守护历史文脉,焕发时代新颜
长春历史文化与美食自由行攻略
水泥"银十"价格上涨,政策落地有望支撑行业修复
怎样看待股票的高送转?高送转对公司和投资者意味着什么?
和平精英M134重机枪使用攻略:最强吃鸡武器详解
最好的十个通信工程就业方向 通信工程毕业后可以从事什么工作
人有三黄,寿命不长?三黄具体是哪三黄,详细给你解答!
孕妇的睡姿对胎儿发育有积极影响,并且早期孕妇应避免仰卧睡姿:侧睡姿势的示范与指导
笔记本充电器可以充充电宝吗
淮海战役:4个战死的国军将领都是谁?当时担任什么职务?
在法兰克福畅游美食与文化:绿酱、香肠、苹果酒的美味之旅
本科毕业论文写作结构详解
尿毒症有遗传吗
【广东汤秘籍】轻松煲出营养美味,家传秘方大公开!
广东人为什么这么爱喝汤?四种汤品制作全解析
热力学第二定律:解析能量转化与熵增原理
创新案例PPT展示效果提升指南
学生宿舍床的常见尺寸有哪些,学生宿舍床如何设计
合肥、芜湖、蚌埠、铜陵……安徽省各城市名字是怎么来的?
高粱面的功效与营养价值
高粱面的功效与作用
荣格:人生一定有着自己的意义 | 我们应当如何面对死亡?
探秘财运方位:如何找到自己的赚钱方向?
公租房撤销申请指南:流程、标准及费用详解
气机郁滞能好吗