(C语言贪吃蛇)14.用绝对值方式解决不合理的走位

news2024/11/24 8:01:24

目录

 

前言

 解决方式

运行效果

总结


 

前言

        我们上节实现了贪吃蛇四方向走位,但是出现了一些不合理的走位,比如说身体节点和头节点重合等等,本节我们便来解决这个问题。

  

        

        我们希望贪吃蛇撞到自身时游戏会重新开始,并且贪吃蛇的运动方向不能与上一秒的运动方向相反,即贪吃蛇的身体节点不能重合。

 解决方式

        对于我们上节宏定义的四个方向需要改变其值,为了更好的以绝对值的方式判断方向。

#define UP 1

#define DOWN 2

#define LEFT 3

#define RIGHT 4

修改后:

#define UP 1

#define DOWN -1

#define LEFT 2

#define RIGHT -2

我们这样修改的目的是:之前我们改变方向的时候是通过change()函数,只要我们有按键被按下的时候就改变他的方向,现在我们封装一个函数turn()来判断不合理走位。

void turn()
{
    int direction;
    if(dir != abs(dir))
    {
        dir = direction;
    }
}

 这个函数用来判断贪吃蛇的走位是否合理,如果按下的按键方向和之前运动的方向相反,那么就不执行,那么我们就解决了贪吃蛇的一个不合理走位了。

void turn(int direction)
{
    
    if(abs(dir) != abs(direction))
    {
        dir = direction;
    }
}

void* changeDir()
{
    while (1)
        {
            key = getch();
            switch (key)
            {
            case 0402:
                    turn(DOWN);
                    break;
            case 0403:
                    turn(UP);
                    break;
            case 0404:
                    turn(LEFT);
                    break;
            case 0405:
                    turn(RIGHT);
                    break;
            }
        }
}

该文件默认名称为snake13.c

打开终端运行以下指令编译该文件

“gcc snake13.c -lcurses”

系统默认生成一个名为“a.out”的可执行文件,输入以下指令运行该文件

"./a.out" 

运行效果

        打开终端运行该程序,可以看出贪吃蛇已经正常运行,不会出现不合理的走位。

在Windows环境中可能会出现乱码,因为上下左右键作为相应键会返回出一些值出现在屏幕上导致乱码,我们只需要加上ncurses库里自带的函数即可。

(出现问题的友友这样修改就行了)

void initNcurse()
{
    initscr();
    keypad(stdscr,1);
    noecho();
}

 

        此时我们的贪吃蛇就不会出现不合理的走位了! 

总结

        我们本节解决了贪吃蛇不合理走位的问题,通过宏定义改变数值然后封装函数解决问题。

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

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

相关文章

TryHackMe 第6天 | Web Fundamentals (一)

这一部分我们要简要介绍以下 Web Hacking 的基本内容,预计分三次博客。 在访问 Web 应用时,浏览器提供了若干个工具来帮助我们发现一些潜在问题和有用的信息。 比如可以查看网站源代码。查看源代码可以 右键 网页,然后选择 查看网站源代码&…

Discord 用户突破2亿:CEO 谈发展规划、产品策略及游戏通信的未来

Discord,这个最初为游戏玩家打造的社区平台,如今已经发展成为一个拥有超过2亿月活跃用户的全球性社交网络。创始人兼CEO Jason Citron在经历了多次创业尝试后,最终将Discord打造成了一个不可或缺的游戏通信工具。以下是Jason Citron在接受GamesBeat采访时,对Discord的现状、…

招联金融2025校招内推

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

MAE(平均绝对误差)和std(标准差)计算中需要注意的问题

一、MAE(平均绝对误差) 计算公式: yi​ 是第i个实际值y^​i​ 是第i个预测值 计算方法: MAE就是求实际值与预测值之间的误差,需要给出预测值和原始的实际值 二、std(标准差) 计算公式&#x…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC,除了虚拟机网络连接外,就得掌握docker的网络连接。磨刀不误砍柴工,或者说工欲善其事必先利其器,我们先学学典型的docker的网络连接方式。Docker的网络连接有四种:bridge、none、containe…

MySQL【知识改变命运】01

库的基本操作语法 1:SQL的简介2:SQL的基本分类3:库的基本操作1:查看库2:创建数据库1:创建一个diayang库2: ⾃定义⼀个数据库名,如果数据库不存则创建,3:查看警告信息4:字符集编码和校验(排序)规…

从零开始讲PCIe(4)——PCI总线的地址空间分配

一、概述 PCI架构支持三种地址空间,如图1-10所示:内存地址空间(Memory Map)、I/O地址空间(I/O Map)和配置地址空间(PCI Configure Space)。在x86处理器中,处理器可以直接访问内存和I/O空间。PCI…

PHP代码审计方法与套路

PHP代码审计方法与套路 01,审计前的准备(1)获取源码(2)安装网站 02,把握大局(1)网站结构(2)入口文件(3)配置文件(4&#x…

Elasticsearch学习记录

阅读前须知 本文通过安装elasticsearch-7.17.0为基础,使用 kibana-7.17.0 对 elasticsearch 进行操作,本文中 es 是对 elasticsearch 的简写。 下载地址:elasticsearch_免费高速下载|百度网盘-分享无限制 (baidu.com) 1 初识Elasticsearch …

vue3 + ts + cesium:绘制、更新圆 ellipse

本文主要实现基础的绘制圆形,并且可以通过拖动圆心更新圆的位置,拖动圆上的边缘点改变圆的半径。 实现效果: (1)单击鼠标左键开始绘制,确定圆的圆心,移动鼠标,改变圆的半径&#xff…

CodeFormer模型构建指南

一、介绍 在 NeurIPS 2022 上,南洋理工大学-商汤科技联合研究中心 S-Lab 提出了一种基于 VQGANTransformer的人脸复原模型 CodeFormer。基于CodeFormer模型实现面部复原、增强旧照片/修复AI艺术、面部颜色增强和修复、面部修复四个功能。 二、特点 CodeFormer 是…

常用组件详解(九):学习率更新策略

文章目录 1.StepLR2.MultiStepLR3.ExponentialLR4.LinearLR5.PloyLR 适合的学习率能够更好地训练模型,为此衍生出多种学习率调整策略。一般来说,在训练初期希望学习率大一些,使得网络收敛迅速,在训练后期希望学习率小一些&#xf…

jmeter学习(4)提取器

同线程组https://blog.csdn.net/vikeyyyy/article/details/80437530 不同线程组 在JMeter中,正则表达式提取的参数可以跨线程组使用。 通过使用Beanshell后置处理器和属性设置函数,可以将提取的参数设置为全局变量,从而在多个线程组之间共享…

Spring Boot新闻推荐系统设计与实现

3系统分析 3.1可行性分析 通过对本新闻推荐系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻推荐系统采用JAVA作为开发语言,Spring Boot框…

Go语言实现长连接并发框架 - 开篇

文章目录 前言初步设计思路初步架构图项目地址最后 前言 你好,我是醉墨居士,国庆假期闲来无事,准备使用Go语言开发一个轻量级的长连接并发框架,希望能够帮助大家掌握这类框架的心脏与内核,也希望能给大伙带来灵感与启…

【微服务】负载均衡 - LoadBalance(day4)

下述所有代码都是在订单服务中修改的,商品服务并不需要修改,只需要启动多个实例即可。 引入 在介绍Eureka组件的最后,留下了一个问题就是,无论启动多少个实例,只能调用第一个。原因是因为服务调用时获取的是一个实例…

C/C++/EasyX——入门图形编程(3)

【说明】上一篇讲了基础图形的绘制,那么这一篇就来讲一下如何在窗口上绘制文字吧,友友们一起学习吧。(>y<)(^v^) 一:文字…

jQuery——对象的过滤

在 jQuery 对象中的元素对象数组中过滤出一部分元素来 ① first() ② last() ③ eq(index / -index) ④ filter(selector):对当前元素提要求 ⑤ not(sel…

电脑IP地址怎么换成二进制:详解转换过程与应用

在电脑网络的世界里,IP地址是每台设备独一无二的身份标识。而我们日常所见的IP地址,大多是以点分十进制的形式呈现。然而,在电脑内部,IP地址实际上是以二进制的形式进行存储和处理的。那么,电脑IP地址怎么换成二进制呢…

pygame入门(千字详细版)

千字赘述,万字总结,就为博客点一赞吧! 1.安装pygame pip install pygame 安装完成后在python中输入检验有没有问题,回车键应该不会报错。 >>>import pygame >>>2.pygame模块预览 3.项目实战 3.1.0 hello w…