一题多玩,Python花式求解开门寻宝游戏

董付国老师Python系列教材(累计印刷超过200次)推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1300篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材1:董付国编著,《Python数据分析、挖掘与可视化 (慕课版 第2版)》,ISBN:978-7-115-62634-9,定价59.8元,2024年1月出版(第1版累计印刷11次,已退出历史舞台),配套慕课“Python数据分析与数据可视化”被评为智慧树精品课程,人民邮电出版社“优秀作译者”

619df213d35c7f07710548adebf39bee.png

图书内容:Python快速入门,NumPy数组与矩阵运算,Pandas数据分析实战,sklearn机器学习实战,Matplotlib数据可视化实战

配套慕课:智慧树网搜索“董付国”,书中二维码也可以看微课

页数:254

适用专业:计算机、数据科学、统计、管理

适用层次:研究生/本科/专科

适用学时:48/64

样书申请:https://www.ryjiaoyu.com/book/details/50017

================

推荐教材2:董付国著,《Python程序设计与数据采集(微课版)》,ISBN:978-7-115-61183-3,人民邮电出版社,2023年5月出版,2023年9月第2次印刷,定价59.8元

配套资源:教学大纲、电子教案、课件、源码、数据文件、章节习题及答案、25小时微课、在线练习与考试系统

样书申请:https://www.ryjiaoyu.com/book/details/45732

ba5eda0056869535defb4c7675e34cac.jpeg

=============

问题描述:

小明参加一个游戏,面前从左向右有若干个门,最右边一个门里面是宝藏,前面的每个门打开后会看到一个数字,这个数字表示玩家最多可以向右跨越几个门,例如3表示玩家可以在右边的第1、2、3这三个门中选择一个打开,1表示只能选择打开下一个门,0表示掉进陷阱不能再移动(游戏失败)。

(1)使用回溯法求解所有路径

核心思路:

从下标0出发,尝试所有可能的下一步选择,对于每个选择都尝试再下一步的所有可能选择,重复这个过程。到达目的地或者无法继续行走时回退一步继续尝试其他选择,尝试所有可能的路径并记录经过的位置,如果某条路径最终到达最后一个门就标记为一个有效路径。

例如,以列表[5, 4, 3, 2, 2, 0, 3]为例,从下标0出发的下一步可以到达下标1、2、3、4、5这五个位置,假设下一步选择了下标1那么再下一步可以到达下标2、3、4、5,假设下一步选择了下标2那么再下一步可以到达下标3、4、5,假设下一步选择了下标3那么再下一步可以到达下标4、5,假设下一步选择了下标4那么再下一步可以到达下标5、6,假设下一步选择了下标5结果该位置的数字为0表示掉入陷阱无法移动,于是回退一步回到下标4,重新选择下标6发现到达终点,标记为一条有效路径。然后再回退到下标4的位置发现从该位置出发的路径都走完了,于是再回退一步回到下标3的位置尝试其他选择,...一直到所有路径都走一遍为止。这个过程类似于遍历下图所示的多叉树,该图中每个节点中逗号前面为下标编号,逗号后面为该节点的值(也就是最多可以向右移动几个门)。最终找到的有效路径有(0, 1, 2, 3, 4, 6)、(0, 1, 2, 4, 6)、(0, 1, 3, 4, 6)、(0, 1, 4, 6)、(0, 2, 3, 4, 6)、(0, 2, 4, 6)、(0, 3, 4, 6)、(0, 4, 6),也就是图中红色节点表示的路径。

a644dd2a692fe5a27b257a5554acf771.png

参考代码1:

e1e62a3623a3cea1bab8dac60b995547.png

运行结果1:

79a72b955a91c8b538e89017c7748fdb.png

下面的代码也是回溯法的思路,具体实现略有区别,首先把列表转换为字典,相当于一个有向图的邻接表,然后再利用图论算法来寻找有向图中的路径。

参考代码2:

af2c7d216069bbd0664eb77a952f0798.png

运行结果:

7864826b4814d2aa4ac1bafa3d1ef80f.png

(2)使用贪心算法求解

核心思路:

每次都向右移动尽可能多的距离,如果无法到达终点就提示“无法跳到最后一个位置”。仍以[5, 4, 3, 2, 2, 0, 3]为例,使用贪心算法时从第1个门直接跳到第6个门掉入陷阱无法移动,游戏失败。如果门后数字分别为[5, 4, 3, 2, 2, 2, 3],从第1个门跳到第6个门,从第6个门跳到第7个门,成功。

88657eb94bf5a83e164dcc822bbb6a89.png

参考代码:

3fb790f0d74f06b803ad99a422a6bb1f.png

运行结果:

dfb2f8904af448e6c1cc5fffd16007bd.png

(3)使用动态规划算法求解

使用动态规划算法求解开门寻宝游戏,要求跳跃次数最少,如果有多个解的话返回门编号最小的跳跃方式。

参考代码:

115ec6f595af4c8d73a0f391db4910db.png

运行结果:

ea34d07906e43dea84f3cefacf9e515c.png

使用动态规划算法求解开门寻宝游戏,要求跳跃次数最少,如果有多个解的话返回门编号最大的跳跃方式。

参考代码:

35c21f123a14ae24487724d042a160a5.png

运行结果:

e6e83f8039650a0bda42394f52fccca7.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和776道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,让我们来写一个石头、剪刀、布游戏吧!这个游戏可以让用户输入他们想要出的手势,然后与计算机随机生成的手势进行比较,以确定谁赢了。 下面是代码: ```python import random print("欢迎来到石头、剪刀、布游戏!") print("请输入您的选择:") print("1. 石头") print("2. 剪刀") print("3. 布") choices = ["石头", "剪刀", "布"] user_choice = int(input("请输入您的选择(1/2/3):")) if user_choice not in [1, 2, 3]: print("无效选择,请重新开始游戏。") else: computer_choice = random.choice(choices) user_choice_str = choices[user_choice-1] print(f"您选择了{user_choice_str},计算机选择了{computer_choice}。") if user_choice_str == computer_choice: print("平局!") elif (user_choice_str == "石头" and computer_choice == "剪刀") or (user_choice_str == "剪刀" and computer_choice == "布") or (user_choice_str == "布" and computer_choice == "石头"): print("您赢了!") else: print("计算机赢了!") ``` 这个游戏首先打印欢迎消息和选项列表,然后要求用户输入他们的选择。如果用户输入了无效的选择,游戏会结束。否则,计算机会随机生成一个手势,并将用户选择与计算机选择进行比较,以确定胜者。 我们使用了一个if语句来检查平局、用户获胜和计算机获胜的情况,并打印相应的消息。我们还使用了一个列表来存储可供选择的选项,并使用用户输入的数字来索引列表并获取对应的字符串。 ### 回答2: 当然可以用Python写一个小游戏!这里以猜数字游戏为例。 首先,我们需要导入random模块以生成随机数。然后,我们定义一个变量来存储随机数,让家猜数字直到猜对为止。 ```python import random # 生成随机数 number = random.randint(1, 100) # 初始化猜测次数 guesses_taken = 0 print('欢迎来到猜数字游戏!') while True: # 家猜测 guess = int(input('请输入一个1到100之间的数字: ')) # 更新猜测次数 guesses_taken += 1 # 判断家猜测 if guess < number: print('太小了!') elif guess > number: print('太大了!') else: print('恭喜你,猜对了!') break print('你总共猜了', guesses_taken, '次。') ``` 以上代码通过循环让家猜数字,根据家猜测的数字与随机数的比较结果,给出相应的提示。如果家猜对了,游戏结束并显示猜测次数。 ### 回答3: 当然可以用Python来写一个小游戏Python是一种简单易用的编程语言,非常适合初学者开发小型游戏。 我来给你编写一个使用Python开发的猜数字游戏。首先,我们需要生成一个随机数作为答案,然后家需要猜测这个数字是多少,直到猜中为止。 下面是游戏的代码: ```python import random def guess_number(): answer = random.randint(1,100) # 生成1到100之间的随机数 print("欢迎来到猜数字游戏!") print("猜一个1到100之间的数字。") while True: guess = int(input("请输入你的猜测:")) if guess < answer: print("太小了,请再猜一次!") elif guess > answer: print("太大了,请再猜一次!") else: print("恭喜你,猜对了!") break guess_number() ``` 这个代码会生成一个1到100之间的随机数字,然后要求家输入猜测的数字。如果猜测的数字小于答案,则会提示太小了;如果猜测的数字大于答案,则会提示太大了;只有当猜测的数字等于答案时,会输出恭喜你猜对了,并结束游戏。 你可以把这段代码复制到一个Python编辑器中,比如PyCharm,然后运行它来这个猜数字游戏。你可以多几次,看看自己能猜对多少次!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值