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

news2024/10/3 19:11:45

目录

前言

实现效果

支持方向变换

修改默认效果

如何修改

总结


前言

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

实现效果

e83a1f78c87043c98d3201d66f30a0ad.png

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

支持方向变换

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

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

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)'循环不断的刷新界面(传送门:贪吃蛇自行向右移动)

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

修改默认效果

我们来看下运行效果

db10d017d13c4266a512094dc58ae324.png

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

void moveSnake()
{
    addNode();
    deleNode();

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

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

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)是死循环,当程序进入第一个循环后就一定不会进入第二个循环。

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 具体请联系作者 项目结构 项目流程图 技术栈 项目结构 项目路由 4. 项目模型 项目初始化 初始化项目文…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想,是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素,可以把n个元素看作n个有序表,把它们两…

Java中数据转换以及字符串的“+”操作

隐式转换(自动类型转换) 较小范围的数据类型转成较大范围的数据类型 强制转换(显式转换) 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型(如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…

影刀RPA实战:excel相关图片操作指令解

1.实战目标 excel是工作中必不缺少的工具,今天我们继续使用影刀RPA来实现excel操作的便利性,让影刀自动化来帮我们完成工作。 2.单元格填充图片 2.1 指令说明 功能:向 Excel 单元格插入本地图片或网络图片,支持Office和WPS&…

波阻抗,是电场矢量的模值/磁场矢量的模值

波阻抗是电场复振幅除以磁场复振幅,最后只与介质με有关 所以磁场可用电场强度表示(利用波阻抗) 问题,复振幅是矢量,波阻抗的定义是复振幅的比值?答案:不是,很明显,波阻…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态: Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时,从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

Pikachu-Sql Inject-搜索型注入

MySQL的搜索语句: select * from table where column like %text%; 如:使用引号闭合左边的引号, or 11 把所有数据查询出来; # 注释掉后面的 引号等; test or 11# 查询出结果: 注入的核心点…

Cloneable接口(浅拷贝和深拷贝的区别)

前言 Object类中存在这一个clone方法,调用这个方法可以创建一个对象的“拷贝”。但是想要合法调用clone方法,必须要先实现Clonable接口,否则就会抛出CloneNotSupportedException异常。 1 Cloneable接口 //Cloneable接口声明 public interf…

CentOS 7文件系统

从centos7开始,默认的文件系统从ext4变成了XFS。随着虚拟化的应用越来越广泛,作为虚拟化磁盘来源的大文件(单个文件几GB级别)越来越常见。 1.XFS组成部分: XFS文件系统在数据的分布上主要划分为三部分:数据…

QT篇:QT介绍

一.QT概述 Qt 是一个跨平台的应用程序和用户界面框架,用于开发图形用户界面(GUI)应用程序以及命令行工 具。它最初由挪威的 Trolltech (奇趣科技)公司开发,现在由 Qt Company 维护,2020年12月8…

如何在网格中模拟腐烂扩散:如何使用广度优先搜索(BFS)解题

问题描述 你需要在一个二维的网格中处理橘子的腐烂扩散过程,网格中的每个单元格可以有三种状态: 0:表示空格,没有橘子。1:表示一个新鲜的橘子。2:表示一个腐烂的橘子,它可以在 1 分钟内让上下…

模拟算法(1)_替换所有的问号

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟算法(1)_替换所有的问号 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. …

MHA携手Atlas:打造高效读写分离解决方案,引领数据库性能飞跃

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

npm切换到淘宝镜像

1、输入以下命令后回车,npm切换至淘宝镜像 npm config set registry https://registry.npmmirror.com 2、输入以下命令后回车,检查是否切换成功 npm config get registry 若返回此信息,表示切换成功 3、切换后就可使用淘宝镜像加快npm包的…

C语言 | Leetcode C语言题解之第447题回旋镖的数量

题目: 题解: int cmpfunc(const void *a, const void *b) {return (*(int *)a - *(int *)b); } //计算组合数*2 int every(int count) {if (count 1) {return 0;} else {return count * (count - 1);} } //计算每个锚点能产生的回旋镖总数 int part(in…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍(12)正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…

4M-21: An Any-to-Any Vision Model for Tens of Tasks and Modalities论文精度

贡献:在21种高度不同的模态中训练一个统一的模型,并且对比专有模型不会有性能损失做法:将不同模态映射到不同的token空间,并且可以生成不同的模态token【Any-to-any】关键点:如何在不同的模态中应用tokenization进行映…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景: 2.字符串函数 字符串函数使用场景: 3.数学函数 4.控制流函数 1.日期函数 函数示例: 1.在日期的基础上加日期 在该日期下,加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量,可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域: 对于每个会话都会生效当前会话:只…