(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
运行效果一:
运行效果二:
总结
我们本节实现了贪吃蛇四方向移动,按住上下左右四个键就会做出相同的反馈,是我们想要的效果。
热门推荐
隔音材料哪种隔音效果好?隔音材料挑选注意事项
龙胆泻肝丸使用说明书
逍遥散、柴胡疏肝散、龙胆泻肝汤全解析!哪个最适合你?一文讲透
固本延龄丸的功效与作用是什么
老年人心脑血管饮食哪方面健康
“燃灯校长”张桂梅:被写入共和国简史,让数千女孩走出大山!
“雾”入仙境!云南泸沽湖冬季晨雾美景
“唯”和“惟”两个常用汉字,到底有什么区别?很多人傻傻分不清
“惟”与“唯”的区别:读音、字义与用法详解
咖啡小白进阶指南:雾干、冻干、二次造粒速溶咖啡大揭秘
减肥速效药的副作用及安全性评估
世界调味品大观:地域风味背后的文化差异
粮票退出历史舞台的时间是什么
蛋白质数据+基因序列精准构建进化树
从产品经理的角度阐述台球助教小程序
三条骑行线路入选全国精品 成都不愧是“骑行之都”
成都四条骑行绿道推荐:吃喝玩乐全搞定
必看|2025年中职生就业情况分析报告
深度拆解2024年爆款视频,我们找到了抖音的5个创作趋势
华尔街十大金融机构预测:2025年金价将上涨8%
脂肪肝如何吃回去?这些误区要当心
新车首保,机油怎么选?性价比与性能如何平衡?
2025年春分:60年不遇的三大特点
美军超远程隐身巡航导弹亮相
智能化社区食堂安全监管:守护餐桌上的每一份安心
宝宝一周岁的生日蛋糕款式推荐
如何防范个人信息泄露?六大实用指南助你远离信息泄露风险
报告:2024年福建省持证导游人数4.3万人
Ceph分布式存储系统详解
项目管理薪资很低怎么办