C语言贪吃蛇大作战

news2024/10/5 3:25:05

C语言贪吃蛇大作战

贪吃蛇大作战

1997 年,诺基亚公司发布了贪吃蛇游戏,并将其内置于诺基亚 6110 手机中,使这款游戏迅速风靡全球,成为一代经典。一般的观点认为,贪吃蛇是手机游戏的鼻祖。
与传统单人贪吃蛇不同的是,本题中的贪吃蛇游戏为双人对战。请你编写程序控制贪吃蛇,在动态变化的场地中与对手比拼,在最短的时间内尽可能多地吃掉食物。

游戏规则:

游戏在一张二维地图上展开,地图上有蛇、墙和障碍物、道具、食物,如图1所示。蛇有2条:白蛇(口口口)和粉蛇(■■■),初始长度为3格。食物由●表示。墙和障碍物由■表示。道具分为两种:第1种为“倍速道具▲”,全场1个,吃该道具后,速度加倍,50 步后恢复原速度;第二种道具为“斜走道具★”,全场 2 个,正常情况下,蛇移动方向为上、下、左、右4个方向,但吃该道具后,还可以斜着走,即上、下、左、右、上左、下左、上右、下右8 个方向都可以行进,该道具吃后永久有效。蛇头碰到墙或障碍物、自己的身体、对方的身体均被判定为死亡。游戏具体实例请见附件 2。

贪吃蛇AI演示.gif

源码

https://pan.baidu.com/s/1pq1Nwwo0hlc_J84F93HM4A?pwd=1111

游戏每面(也可以称为关卡) 随机放置 10 个食物。第一面只有食物没有障碍物和道具第二面开始出现随机放置的障碍物和道具。

胜负判定:

先吃到 35 个食物的一方获胜,在此期间若任何一条蛇死亡,判对方获胜。此外,若距任意一方吃到食物后 200 步内双方均未再吃到食物,则判超时,此时吃食物多的一方获胜,若两条蛇吃的食物一样多,则判为平局。

代码实现:

老师提供程序框架和图形显示,学生只需按接口要求编写相关函数,实现操控贪吃蛇的核心算法即可,无需负责图形显示。实现语言为 C/C++,不限编译器与开发环境。本题程序由命令行界面模拟图形界面,用命令行界面的 n+2行 +4 列二维网格表示游戏地图,通过 printf(“”等画游戏地图中的一个点格。这里需特别注意的是,由于“ ”等特殊字符在命令行中占2个字符的宽度,所以命令行的每 2列对应游戏地图的 1列。综上,游戏地图的坐标系如图 2 所示,其相邻两点的列坐标值相差 2 而不是 1。例如图 2 中粉蛇 3 个点组成,其坐标分别为(3.6)、(3.4)、(3,2)。第0行、第n+1行、第0列、第m+2 列为四周的墙。

你的任务是编写程序控制贪吃蛇,即根据当前的游戏地图和蛇的位置,做出决策,给出下一步贪吃蛇行进的方向。从而吃掉食物并躲避障碍物和对方。为此你至少需要编写如下 2个函数:
(1)machine_move函数

int machine_move (point snake[5][100], int len[5], int direct[5], int t, GamePanel gp)

该函数的功能是:即根据当前的游戏地图、贪吃蛇当前的位置和行进方向,返回下一步应行进的方向。其中point为结构体struct point{intx;inty;},表示游戏地图中某点的行列坐标。snake数组表示蛇的坐标,具体地,由于一条蛇由多个点/格组成,故snake[t]i]表示第t条蛇的第i个点(下标从1开始),len[t]表示蛇t的长度,即第t条蛇由地图中的snakelt]f1]…snakelt]len[t点格组成。若图2中的粉蛇编号为t,则len[t]=3 ,且 snakelt][1].x=3,snakelt][1].y=6; snakelt][2].x=3snake[t][2],y=4; snakelt][3].x=3,snakelt][31.y=2。t表示你所控制的蛇的编号,由于最多是二人对战,最多有2条蛇,即t只有两种可能取值0或1。direct[t]为一个整数,表示第t条蛇当前行进的方向。函数的返回值为一个整数,表示接下来应该行进的方向。

结构体GamePanel表示当前游戏地图。其定义如下:

struct GamePanel
{
	int n;		//地图规模
	int m;		//地图规模
	int totalfoodnum;		//当前地图中的食物总数
	int wallnum;			//障碍物总数
	int success_num;		//获胜所需吃的食物数
	int speednum;			//当前地图中倍速道具数
	int step_speed;			//玩家吃倍速道具后,走的步数,此变量值不超过50
	int obliquenum;			//当前地图中斜走道具数
	int speedowner;			//倍速道具的拥有者,值为0或1
	int obliqueowner[5];	//斜走道具的拥有者,obliqueowner[t]==1表示蛇t拥有斜走道具,obliqueowner[t]==0表示蛇t没吃斜走道具
	int currentfoodnum;		//当前地图中所剩食物数
	point food[20];			//当前地图中所有食物的坐标
	point wall[20];			//当前地图中所有障碍物的坐标
	point speedprops;		//当前地图中倍速道具的坐标
	point obliqueprops[2];	//当前地图中倍速斜走的坐标
	int panel[50][100];		//游戏盘面,panel[i][j]的值为0,1,2,3,4,分别表示地图中点i,j为空位置,食物,障碍物,倍速道具,斜走道具
};

(2)check函数

bool check(point snake[5][100], int len[5], int t, GamePanel gp, int direction)

该函数的功能是:判断在贪吃蛇当前位置和游戏地图下,下一步若以 direction 方向行进,是否可行。如可行则返回 true,如不可行 (即按此方向前进会导致贪吃蛇死亡) 则返回 fase。参数中snake、len、t、gp 的含义同 (1),direction 表示下一步拟行进的方向,含义如表1所示。这里需注意的是,当贪吃蛇能斜走的时候,类似图 3 的情形,贪吃蛇是不能向右上方通过的,无论点格1和2是障碍物还是蛇自己或对方的身体。但图4 的情形贪吃蛇则可以向右上方通过。其他方向同理。

最后,将你的 machine.h 文件,修改为 machine+编号.h,例如你的编号是 5,则修改为machine5.h,并在超星作业里提交该 machine5.h 头文件。
上述处理的原因是:我们会将一个班内所有同学的 machine.h 文件放入同一个项目工程里进行编译、运行和对战,所以每个同学的头文件名不能相同,且任意两个头文件中的函数名、全局变量名、类或结构体名都不能相同,否则会出现重名的编译错误。
请注意不要提交诸如“#include 头文件”、main函数等。函数中不允许通过 printf、cout等输出信息。machine_move 和 heck 函数的参数均为值参数,对参数的修改在函数执行完毕后不会保存。
课程设计报告也需以超星作业的方式提交,模板与 A 题相同,不建议长篇大论,1-2 页即可。

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

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

相关文章

【时间之外】系统管人,能行?(冷眼旁观连载之一)

目录 写作初心 在用工具 某微 某道 某书 工具痛点 某微痛点 某道痛点 某书痛点 总结一下:功能复杂 2023年观察计划 最大痛点 效果跟踪 未完待续 写作初心 2022年应该是这一生中值得纪念的一年,疫情封控自不必说,对于个人而言&a…

traefik gateway api

背景 在使用istio后开始考虑网关了,istio已经有自己的网关,为什么还要另外找一个别的网关,参考了好几个文章大致结论是,istio的网关功能不够强大,下图红色的部分是istio网关暂时缺失的,所以我的结论是在is…

Monorepo 下 Git 工作流的最佳实践

作者:林宜丙 背景 没有哪一种 Git 工作流是银弹,合适的 Git 工作流往往取决于项目的代码规模、协作人数、应用场景等;本次分享先从适合小型 Monorepo 的 Feature branch 工作流开始分享,接着分享适用于中大型 Monorepo 的 Trunk…

头歌:Ping客户端创建原始套接字(底部附全关完整答案)

头歌实践教学平台 (educoder.net)为Ping客户端创建一个原始类型的套接字原始套接字套接字(socket)是一个抽象层网络应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中&a…

<C++>二叉树进阶

文章目录为什么要学这一节1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树操作1.3 二叉搜索树的实现1.4 二叉搜索树的应用1.5 二叉搜索树的性能分析2. 经典题目2.1 最近公共祖先2.2 从前序与中序遍历序列构造二叉树2.3 二叉树的前序遍历(非递归)为什么要…

计算机组成原理复习:数据的表示和运算

计算机组成原理复习:数据的表示和运算2. 数据的表示和运算2.1 数制与编码2.1.1 数制:进位计数制及其相互转换2.1.2 编码:数值数据的编码与表示2.1.2.1 逻辑型数据2.1.2.2 字符型数据 之 ASCII码2.1.2.3 数值型数据 之 BCD码2.1.3 校验码——奇…

Part类 -- 上传文件

Part类 -- 上传文件一、核心方法1.1 HttpServletRequest 类方法1.2 Part 类方法二、代码示例前端搭配 form 表单:form input type “file”,允许通过浏览器选中一个文件上传给服务器。 Servlet 就支持处理这种上传文件的请求,把这个请求到的文…

安科瑞智能操控无线测温装置在江苏某化工产业园项目的应用

安科瑞 李亚俊 1 概述 江苏富强新材料有限公司是中国企业500强——山东金岭集团在江苏淮安盐化新材料产业园区投资设立的盐化工企业。公司将利用淮安丰富的盐矿资源和优越的发展环境,投资200亿元,建设120万吨/年离子膜烧碱项目、70万吨/年甲烷氯化物项…

vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误,春节小游戏,新年小游戏

ue新春游戏-拼手速抢车票,老规矩,体验地址:http://game.pkec.net/word-ticket/。 写这个主要是前几天群里运营老师说咋没人写抢车票的,再加上我上一篇文章上了掘金一周,听说多上几次有证书,我还没搞到过掘金…

Go语言 函数传递:值传递 和 虚假的 “引用传递”

前言 其实从变量本身来说,go只有值传递,函数内的修改不会影响函数外。但有一种特例是指针,go可以传指针给函数,指针指向申请出来的实际内存,也就是保存元素的内存, 这样在函数内的修改,可以影响…

就算是TOP程序员,也有这些坏习惯

绝大多数程序员在职业生涯中,多多少少都会养成一些坏习惯,今天就来说一说身边最常见的一些坏习惯,也给刚入行的新朋友们提个醒,少走一些弯路。 那么,就让我们开始吧! 1.不注意适当休息 比如日常工作时、…

B端产品-登录功能设计

在项目启动初期,基本大家都是先从账号体系先开始着手设计的,那么B端的登录功能如何设计呢? 一、需求分析 B端的产品的用户基本上可以分为内部员工和客户,如果是客户使用,基本上都会有注册功能;如果是内部员…

C# Console.Read读取回车和换行

C#的Console.Read函数: 读取缓冲区中的数据,读取到一个字符时停止。 C#的Console.ReadLine函数 读取缓冲区中的数据,遇到回车时停止。 Enter键: 将行数据输入缓冲区,并且将回车符和换行符 加入缓冲区。 注意 Consol…

【H5UI库和二维码】一.H5UI库;二.加密技术;三.二维码

目录​​​​​​​ 一.H5UI库 1.使用方法: (1)页面中引入css文件 (2)页面中引入js文件 2.组件的用法 (2)按钮的使用:button。有三种类型(primary、danger、defaul…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《3》

前面了解到Faster R-CNN在实验中的效果很不错,以及对论文做了一个大概的了解,对此有兴趣的伙伴们也可以先浏览前面两篇文章:MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《…

【Node】Node.js安装与配置(详细步骤)

Node.js安装与配置(详细步骤)一、安装Node.js1.1 下载1.2 安装1.3 环境变量二、验证是否安装成功三、修改模块下载位置3.1 查看npm默认存放位置3.2 在 nodejs 安装目录下,创建 “node_global” 和 “node_cache” 两个文件夹3.3 修改默认文件…

xd卡数据丢失原因和三种数据恢复方法介绍

xd卡适用于富士/奥林巴斯相机品牌,它能配合各式读卡器,方便的与个人电脑连接传输图像视频等。但是xd卡与其他类型的存储卡一样容易因各种原因出现数据丢失。如果您的xd卡出现了数据丢失的问题,不妨了解下这里给大家分析的xd卡数据丢失原因和具…

解决仓库产品管理痛点,选对条码工具至关重要

" 最近我们仓库管理遇到了很多问题,一方面 我们进出库的产品数量非常庞大,目前公司的条码扫描系统识别效率非常低,只能单个产品进行扫描,经常需要加班加点出入库,而且有些产品条码比较特殊,现在的扫描…

【LeetCode每日一题】——507.完美数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 507.完美数 四【题目描述】 对于一个 正整数&…

windows10安装goland

一、安装包 下载以下两个安装包: go语言二进制包: https://golang.google.cn/dl/ goland安装包 https://www.jetbrains.com/go/nextversion/ 二、安装go语言包 双击下载的语言包,直接next,选择安装路径(自己选择&am…