有趣的笔试题——贪吃蛇游戏(确定不进来看看?)

news2024/11/9 2:02:18

原题

在这里插入图片描述

贪吃蛇游戏是一款耳熟能详的小游戏,通过上下左右控制蛇的方向,寻找吃的果子,每吃一口果子,蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,吃完所有果子,就能过关,然后继续玩下一关。(30分)

该游戏的核心是通过链表中的节点位置(假设节点中的x,y来表示节点所在的位置信息)和节点个数来描述蛇的长度和身体位置信息,移动方向即控制链表节点的位置信息。假设节点之间采用双向链表的形式进行连接。

int SnakeMove(Food_S *pFood, SLIST_S *pHeadSnake, SLIST_S *pTailSnake);
函数说明:
参数pFood:作为入参表示蛇下一个移动的位置,当成员IsHaveFood为FLASE时表示仅仅只是移动位置,当IsHaveFood为TRUE时,表示吃到了果子;
参数pHeadSnake、pTailSnake:分别表示贪吃蛇的头尾节点,即是入参也是出参;
返回值:表示贪吃蛇移动函数的结果是成功还是失败,0表示成功, -1表示失败;

typedef struct SLIST{
int x;
int y;
struct SLIST *prev;
struct SLIST *next;
}SLIST_S;
typedef struct Food{
int x;
int y;
bool IsHaveFood;
}Food_S;

根据上述描述:

(1) 请简要回答在不考虑吃到果子的前提下,贪吃蛇每上下左右移动一格,设计时如何对链表操作能达到高效的移动?(5分)

(2) 请实现贪吃蛇移动的函数,考虑移动时分别当吃到果子和没有吃的果子的场景,同时还要判断在移动一步之后是否会造成碰到蛇自己本身(不考虑碰壁),即当蛇的头部碰到蛇身体任何部分即表示失败。(25分)

第一题:

在不考虑吃到果子的前提下,贪吃蛇每上下左右移动一格时,可以按照以下步骤对链表进行高效的移动:

  1. 创建一个新的节点newHead,作为新的头节点,保存蛇头要移动到的位置信息。
  2. 根据当前的移动方向,更新newHead节点的x和y坐标,即计算蛇头移动后的位置。
  3. 将newHead节点的next指针指向原来的头节点,即将newHead插入到链表的头部。
  4. 将原来的头节点的prev指针指向newHead,完成链表的连接。
  5. 更新*pHeadSnake指针,使其指向newHead节点,即更新头节点的位置。
  6. 移除原来的尾节点,即将原来的尾节点从链表中删除。
  7. 更新*pTailSnake指针,使其指向新的尾节点,即更新尾节点的位置。

通过这种方式,每次移动只需要进行几个指针的重新连接和坐标的更新,而不需要对整个链表进行遍历,从而实现高效的移动操作。

第二题:

#include <stdbool.h>

typedef struct SLIST {
    int x;
    int y;
    struct SLIST* prev;
    struct SLIST* next;
} SLIST_S;

typedef struct Food {
    int x;
    int y;
    bool IsHaveFood;
} Food_S;

int SnakeMove(Food_S* pFood, SLIST_S** pHeadSnake, SLIST_S** pTailSnake) {
    if (*pHeadSnake == NULL || *pTailSnake == NULL) {
        return -1; // 头节点或尾节点为空,移动失败
    }

    // 创建新的头节点
    SLIST_S* newHead = (SLIST_S*)malloc(sizeof(SLIST_S));
    if (newHead == NULL) {
        return -1; // 内存分配失败,移动失败
    }

    // 更新newHead节点的位置信息
    newHead->x = (*pHeadSnake)->x;
    newHead->y = (*pHeadSnake)->y;
    newHead->prev = NULL;
    newHead->next = *pHeadSnake;

    // 根据移动方向更新newHead节点的位置信息
    switch (direction) {
        case UP:
            newHead->y--;
            break;
        case DOWN:
            newHead->y++;
            break;
        case LEFT:
            newHead->x--;
            break;
        case RIGHT:
            newHead->x++;
            break;
    }

    // 判断是否吃到了果子
    if (pFood->IsHaveFood && pFood->x == newHead->x && pFood->y == newHead->y) {
        // 吃到了果子,不需要移除尾节点,更新pFood的IsHaveFood为FALSE
        pFood->IsHaveFood = false;
    } else {
        // 没有吃到果子,移除尾节点
        SLIST_S* oldTail = *pTailSnake;
        *pTailSnake = (*pTailSnake)->prev;
        (*pTailSnake)->next = NULL;
        free(oldTail);
    }

    // 检查是否碰到蛇自身
    SLIST_S* current = newHead->next;
    while (current != NULL) {
        if (current->x == newHead->x && current->y == newHead->y) {
            free(newHead);
            return -1; // 碰到蛇自身,移动失败
        }
        current = current->next;
    }

    // 更新*pHeadSnake指针和前一个节点的指针
    (*pHeadSnake)->prev = newHead;
    *pHeadSnake = newHead;

    return 0; // 移动成功
}

在这里插入图片描述

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

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

相关文章

关于springboot中前端传递多个数组以及其他参数及json在前后端转变方法技巧的记录

文末含一种json的动态解析方法,感兴趣的大佬记得看到最后评论交流 * 因公司GIS保密要求仅放部分代码在这儿 前端传输json的方法 json格式不再赘述 常规json传递 使用formData封装传递 好处就是当页面同时传递多个数组甚至是同时传递数组和参数到后台&#xff0c;可以自定义…

2023计算机组成原理复习【1-4】

第一章 计算机系统概述 1&#xff0e;计算机语言的分类&#xff1a;高级语言&#xff0c;低级语言&#xff08;汇编语言与机器语言&#xff09;。P8 高级语言是人类可读写的编程语言。低级语言包括汇编语言和机器语言两种。汇编语言是一种直接使用符号代替计算机指令的语言&a…

C++静态对象的移动问题

7.1返回普通的静态对象 MyString func(const char* p) {static MyString tmp(p);return tmp; } int main() {MyString s1("hello");s1func("helloworld");s1.Print();MyString s2;s2func("hello");s2.Print();return 0; } 结果&#xff1a; 进…

Elagamal和ECC

Elgamal加密方案 椭圆曲线加密体制 椭圆曲线应该是非奇异的&#xff0c;曲线的图不会自我相交或者没有顶点。 椭圆曲线的基本运运算 相异点相加PQ&#xff1a; 相同点相加PP: ## 椭圆曲线加解密 加解密原理&#xff1a; Alice选取一个椭圆曲线 E p ( a , b ) E_p(a,b) Ep​…

从0到1精通自动化测试,pytest自动化测试框架,生成html报告与html报告报错截图+失败重跑(五)

目录 一、生成html报告 1、pytest-html 2、html报告 3、指定报告路径 4、显示选项 5、更多功能 二、html报告报错截图失败重跑 1、conftest.py 2、报告展示 3、失败重试 一、生成html报告 1、pytest-html pytest-HTML是一个插件&#xff0c;pytest用于生成测试结果…

C. Ranom Numbers(统计前缀)

Problem - C - Codeforces 不&#xff0c;不是“随机”数字。 Ranom 数字由大写拉丁字母 A 到 E 表示。此外&#xff0c;字母 A 的值为 1&#xff0c;B 为 10&#xff0c;C 为 100&#xff0c;D 为 1000&#xff0c;E 为 10000。 一个 Ranom 数字是一个 Ranom 数字序列。这个…

初始化列表的使用

问题 类中是否可以定义 const 成员&#xff1f; 下面的类定义是否合法&#xff1f; 如果合法&#xff0c;ci 的值是什么&#xff0c;存储在哪里&#xff1f; C 中提供了初始化列表对成员变量进行初始化 语法规则 注意事项 成员的初始化顺序与成员的声明顺序相同 成员的初始…

3.41 - haas506与esp8266-01s的串口通信(wifi模块)

haas506与esp8266-01s的串口通信 PC端调试wifi模块1.接线(与电脑通信)2.模式案例3.指令演示 开发板与wifi模块通信1.接线(TTL串口通信)2.代码测试 PC端调试wifi模块 esp8266-01s 1.接线(与电脑通信) 与电脑通信时引脚连接&#xff0c;wifi模块需要稳定3.3v供电&#xff0c;…

享好文 | 碰撞检查并不是BIM的目的

不知大家感觉到没有&#xff1f;中国很多行业都有一种惯性思维&#xff1a;只要是国外的就好&#xff0c;习惯了拿来主义。 比如前几年兴起的BIM&#xff0c;各种峰会论坛、培训吹得神乎其技&#xff0c;玩得不亦乐乎&#xff0c;什么协同管理、行业生态。 结果这么多年过去了…

Python 动态生成系统数据库设计到word文档

背景 经常需要交付一些系统文档而且基本都是word的&#xff0c;其中又有系统数据库介绍模块&#xff0c; 看着数据库里的几百张表于是我开始怀疑人生, 所以咱手写一个 涉及知识 pymysql 操作数据库 -tkinter GUI图形库threading 线程queue 阻塞队列pandas python数据计算…

【数据结构(C++)】树型查找——二叉搜索树

目录 1. 二叉搜索树 1.1 二叉搜索树的概念 1.2 二叉搜索树类模板 1.3 二叉搜索树的操作 1.3.1 查找 1.3.2 插入 1.3.3 删除 1.4 二叉搜索树的性能分析 2. 平衡二叉树 2.1 平衡二叉树的概念 2.2 平衡二叉树类模板 2.3 二叉搜索树的插入 3. 红黑树 3.1 红黑树的概念…

合宙Air724UG Cat.1模块硬件设计指南--Camera接口

Camera接口 简介 CAT.1模块支持一路摄像头接口&#xff0c;可以用于扫码&#xff0c;拍照应用。 特性 仅支持SPI接口实现 最高像素30W像素 支持数据格式YUV422, Y420, RAW8, RAW10 集成GC0310驱动 管脚功能 CAM_PWDN。关闭Camera&#xff0c;上电状态默认下拉输入。 CAM_RST。…

pg 绑定变量源码解析

pg 绑定变量相关源码解析 下面以callstmt 为例 说明一下绑定参数的执行流程&#xff08;基于pg13&#xff09; 整体架构 1. exec_parse_message 解析变量。 --> parse_analyze_varparams 解析绑定参数$id--->parse_variable_parameters &#xff0c; 把返回值paramTyp…

《Java黑皮书基础篇第10版》 第18章【习题】

Java语言程序设计 习题第十八章 18.2章节习题 18.1 什么是递归方法?什么是无限递归? 递归方法可以拆解为递和归。在Java中&#xff0c;大多数方法的执行都需要调用栈&#xff0c;来跟踪方法的调用和返回。在递的过程中&#xff0c;递归方法调用自身&#xff0c;把新的调用添…

Vue3 开发语法使用总结(超详细、超基础)

前言 最近开源了一套后台管理模板Wocwin-Admin&#xff0c;是基于 Vue3.2、TypeScript、Vite4、Pinia、Element-Plus、Qiankun(微前端) 技术栈&#xff0c;借此归纳一下Vue3.2的新语法。 一、全局注册(属性/方法) 1、main.ts注册 import { createApp } from "vue";…

Ubuntu22 2023最新版安装教程

Ubuntu22安装教程 2023全网最新版 前置资源准备 如果选择使用虚拟机安装&#xff0c;那么需要准备VmwareWorkstation 在官网进行下载安装 VmwareWorkstation官网:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 前置资源准备好后就可以…

【SpringCloud config分布式配置中心】—— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的…

okcc呼叫系统运营商的重点功能有什么

一、资费套餐模块 资费套餐&#xff0c;即客户进行业务时使用的资费标准。填写资费套餐名称&#xff0c;选择计费规则方式&#xff0c;点击“确认”按钮即可创建一条资费套餐&#xff0c;如下图所示。 计费规则即计费所遵循的规则。OKCC系统目前设计了以下三种计费方式(后续还…

Caretta 利用 eBPF 实现 Kubernetes 应用网络拓扑

介绍 Caretta 是一种轻量级的独立工具&#xff0c;快速展示集群中运行的服务可视化网络图。 Caretta 利用 eBPF 有效地展示 K8s 集群中的服务网络交互图&#xff0c;并利用 Grafana 查询和可视化收集的数据。科学家们早就知道&#xff0c;海龟和许多动物一样&#xff0c;通过…

【瑞萨RA_FSP】AGT——低功耗定时器

文章目录 一、AGT简介二、AGT的框图分析1. 16位计数器2. 16位重装载寄存器3. 计数时钟源4. 比较匹配功能5. 比较匹配输出引脚6. 输出引脚7. 下溢事件信号/测量完成事件信号输出 三、AGT工作模式详解四、实验&#xff1a;比较匹配功能——PWM输出1. 硬件设计2. 文件结构3. FSP配…