(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录

前言

实现效果

支持方向变换

修改默认效果

如何修改

总结


前言

我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动,本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。

实现效果

上图是我们希望实现的效果,我们可以自发地控制贪吃蛇的移动。

支持方向变换

那么问题来了,我们想要支持控制方向变换,肯定要做一个while(1)循环,然而小蛇在运动的过程中是不断刷新链表节点的位置,也需要做一个while(1)循环。

我们先来看一下以前用来读取用户按键输入的代码:

cpp 复制代码
int main()
{
	int key;

	initscr();
	keypad(stdscr,1);
	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;
		}
	}
	getch();//防止程序跳出
	endwin();
	return 0;
}

在这里我们通过定义'key'和'switch'语句来检测用户输入的是哪个按键,而我们上一节写的'snake10.c'里面也有'while(1)'循环不断的刷新界面(传送门:贪吃蛇自行向右移动)

cpp 复制代码
int main()
{
    int key;
    initNcurse();

    initSnake();

    gamePic();

    while(1)
    {
        moveSnake();
        gamePic();
        refresh();
        usleep(100000);
    }

    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;
		}
	}

    getch();//防止程序退出
    endwin();
    return 0;
}

该程序默认为snake11.c

我们打开终端运行以下指令gcc snake11.c -lcurses

系统会默认生成一个可执行文件a.out

输入该指令运行该文件./a.out

修改默认效果

我们来看下运行效果

程序可以读取我们输入的按键,再回过头来看我们移动的封装函数。

cpp 复制代码
void moveSnake()
{
    addNode();
    deleNode();

    if(tail ->hang == 0 || tail->lie == 0 || tail->hang == 20 || tail ->lie == 20)
    {
        initSnake();
    }
}

此函数里面套用了addNode()用来添加节点,因为贪吃蛇本质是以链表方式存在,我们来看向addNode()。

cpp 复制代码
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;
}

该函数本质是:向右加一个节点,并没有方向的概念。

在尾节点插入新的节点,然后把头节点删掉,就实现了贪吃蛇向右移动一格的效果。

如何修改

那我们想真正地实现贪吃蛇移动的效果应该怎么做呢?

原先的代码里有两个while(1)循环,我们都知道while(1)是死循环,当程序进入第一个循环后就一定不会进入第二个循环。

cpp 复制代码
int main()
{
    int key;
    initNcurse();

    initSnake();

    gamePic();

    while(1)
    {
        moveSnake();
        gamePic();
        refresh();
        usleep(100000);
    }

    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;
		}
	}

    getch();//防止程序退出
    endwin();
    return 0;
}

我们下一节再来解决两个while(1)的同时进行!

总结

我们本节主要提出了关于贪吃蛇移动无法改变方向的问题。本节内容就到这里,提出的问 题会在下节解决,希望本期博客能对你有所帮助,同时发现错误请多多指正!

相关推荐
自由随风飘1 小时前
python 题目练习1~5
开发语言·python
Bony-2 小时前
Go语言完全学习指南 - 从基础到精通------语言基础篇
服务器·开发语言·golang
fl1768313 小时前
基于python的天气预报系统设计和可视化数据分析源码+报告
开发语言·python·数据分析
ACP广源盛139246256734 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
不穿格子的程序员4 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
雪域迷影4 小时前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
yue0084 小时前
C#类继承
java·开发语言·c#
Want5954 小时前
Python汤姆猫
开发语言·python
Larry_Yanan5 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
im_AMBER5 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法