使用简单算法两小时实现猎杀乌姆帕斯(Hunt the Wumpus)Python小游戏

简介: 使用Python语言可视化实现1973 年开发的一款基于文本的冒险游戏。原著较为复杂,这里我们作出如下简化:1. 原著十二面体可以展开为拥有20个顶点(洞穴)的地图。我们简化为更简单的 N*N 矩形地图。每个点代表一个洞穴。暂定为 5 x 5 共25个洞穴。2. 每个洞穴(点)上下左右四通(非八达)🤪3. 仅拥有一颗箭,即只有一次命中机会。如果错过未能将怪兽消灭即失败。4. 如果不慎跌入怪兽洞也算失败。😏5. 该地图不会出现 无底洞, 超级蝙蝠 等其它元素。😝6. 隐藏信息,怪兽的洞穴是不可见的,当接近怪兽洞穴一个格子的距离时,会提示“你嗅到了乌姆帕斯的气息”。

“Hunt the Wumpus” 是什么?


引用wiki百科:


Hunt the Wumpus是Gregory Yob于 1973 年开发的一款基于文本的
冒险游戏。在游戏中,玩家在一系列连接的洞穴中穿行,这些洞穴排列为十二面体的顶点,他们狩猎一个名叫 Wumpus
的怪物。
在回合制游戏中有玩家试图避免致命的无底洞和“超级蝙蝠”,将移动他们周围的洞穴系统; 目标是通过洞穴发射他们的“弯曲箭”之一以杀死Wumpus。


226446614606106.png


我们的目标


原著较为复杂,这里我们作出如下简化:


  1. 原著十二面体可以展开为拥有20个顶点(洞穴)的地图。我们简化为更简单的 N*N 矩形地图。每个点代表一个洞穴。暂定为 5 x 5 共25个洞穴。
  2. 每个洞穴(点)上下左右四通(非八达)🤪
  3. 仅拥有一颗箭,即只有一次命中机会。如果错过未能将怪兽消灭即失败。
  4. 如果不慎跌入怪兽洞也算失败。😏
  5. 该地图不会出现 无底洞, 超级蝙蝠 等其它元素。😝
  6. 隐藏信息,怪兽的洞穴是不可见的,当接近怪兽洞穴一个格子的距离时,会提示“你嗅到了乌姆帕斯的气息”。只有当胜利或失败时才显示。


成品展示


麻雀虽小,但五脏俱全呵!首先看一下最终实现的效果,多图杀猫~


由于判断失误,直接进入怪物洞穴导致失败的情况:

wunpus2.gif


由于只有一只箭,射箭方向错误导致怪物存活而失败的情况:

wunpus1.gif


依靠聪明才智,成功战胜怪物,胜利的结局✌️

wunpus3.gif


关键技术


1.欢迎界面与开始菜单


这当然是最简单的部分啦,使用字符串输出print一段欢迎信息或游戏帮助信息。
然后接收用户的选择input,并根据不同的条件作出判断if


defmenu():

   print("===欢迎进入乌姆帕斯的世界===")

   ch =input("1. 开始\n2. 退出\n->")

   if ch =="1":

       begin()

   if ch =="2":

       print("好吧, 下次再见👋")


2. 地图的生成。


地图当然是最重要的一部分,实现的方式有很多种,这里使用最简单最容易理解的列表嵌套(二维数组)。


defcreate_map(x=5, y=5):

   # 生成地图

   yj = []

   for _ inrange(y):

       xi = []

       for _ inrange(x):

           xi.append(SPACE)

       yj.append(xi)

   wumpas_local, player_local = create_player_local(x, y)


   yj[wumpas_local[0]][wumpas_local[1]] =WUMPUS

   yj[player_local[0]][player_local[1]] =PLAYER

   global p_local

   p_local = [player_local[0], player_local[1]]

   return yj


311506729113381.png


玩家和怪物的坐标二维数组的下标,使用随机数生成。这里可要注意咯! 玩家和怪物的随机坐标可能会重合呦!避免随机数重复的方法由很多种,这里使用递归算法生成唯一的坐标。首先随机生成两个坐标,如果坐标相同则再次调用生成坐标的函数,直到生成两个不同的坐标。


defrandom_local(x, y) -> tuple:

   """随机生成坐标"""

   return random.randint(0, x -1), random.randint(0, y -1)


defcreate_player_local(x, y) -> tuple:

   """生成怪物和玩家的唯一坐标

   wumpas_local 怪物坐标

   player_local 玩家坐标

   """

   wumpas_local = random_local(x, y)

   player_local = random_local(x, y)

   if wumpas_local == player_local:

       wumpas_local, player_local = create_player_local(x, y)

   if wumpas_local != player_local:

       return (wumpas_local, player_local)


3. 地图的显示


地图已经生成啦,显示就很简单啦!只需根据输赢的状态对地图的字符串做简单的替换即可。


  1. 胜利的字符效果

553446577927725.png

  1. 失败的字符效果

139676387797911.png


4. 位移,气息与射箭


玩家的位移,乌姆帕斯的气息与射箭逻辑都是相同的。本质就是对格子四个方向的坐标处理(气息需要处理周边八个格子)。


哈,只用到了二以内的加减法(加一,减一),简单吧?
啥? 已经被整晕了?快拿个纸笔画一画~。


defsmell(x, y) -> bool:

   """判断附近是否有怪物"""

   x1 =MAP_X-1if p_local[0] ==0else p_local[0] -1

   x2 =0if p_local[0] ==MAP_X-1else p_local[0] +1

   y1 =MAP_Y-1if p_local[1] ==0else p_local[1] -1

   y2 =0if p_local[1] ==MAP_Y-1else p_local[1] +1


   round= [(x1, y), (x2, y), (x, y1), (x, y2), (x1, y1), (x1, y2), (x2, y1), (x2, y2)]


   for r inround:

       ifMAP[r[0]][r[1]] ==WUMPUS:

           returnTrue

   returnFalse


5. 大圆满


对啦,整个游戏其实就是一个状态机,总共有胜利失败游戏中三种状态。那么我们可以使用一个 while 语句,搞起一个事件循环 。就可以一直愉快滴玩耍啦!开心不开心?


虽然该篇程序没有复杂的算法,但使用简单的顺序判断循环 语句和一丢丢递归算法就可实现稍稍复杂的小游戏。


正所谓:大道至简  重剑无锋 大巧不工


思考


这个游戏还有很多可以扩展的内容,下面留下几个思考题,让游戏更好玩吧~


  1. 随机坐标去重还有哪些方式可以实现?
  2. 加入 无底洞超级蝙蝠 元素。
  3. 加入游戏积分游戏计时游戏存档功能。

源码见:
https://github.com/spaceack/Hunt-the-Wumpus或关注公众号【编程之舞】回复wumpus领取。

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
15 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
2天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
11 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
2天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
10 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
6天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
24 2
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
57 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
18天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
62 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
117 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
23天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
107 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
52 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练