(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)的同时进行!

总结

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

相关推荐
RuoZoe5 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_8 天前
C语言内存函数
c语言·后端
郑州光合科技余经理10 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo12310 天前
matlab画图工具
开发语言·matlab
dustcell.10 天前
haproxy七层代理
java·开发语言·前端
norlan_jame10 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone10 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549610 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
czy878747510 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
遥遥江上月10 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js