Python学习笔记(水桶谜题代码学习)——应用*符号解包列表所有元素传递给函数用法

原文:http://inventwithpython.com/bigbookpython/project81.html

在这个小游戏中,有三个水桶,容量分别是3升、5升和8升,需要在其中一个水桶中收集正好四升水。规则是:

1、桶只能被清空、完全装满或倒入另一个桶中。

2、把A水桶中的水倒入B水桶,要么把B水桶倒满,要么A桶水量不足,水量不足则倒空

例如,A桶8 升满桶水,把A桶里面的水倒入 空的3升的C桶,会把C倒满有3升,A桶剩余5升。

再如,B桶5升满桶水,A桶8升空,把B桶水倒入A桶,B桶将全部倒入A桶,A桶成5升,B为空。

# ///
# 水桶谜题 
# 
#import sysprint('''
***水桶谜题***
* 有三个水桶,容量分别是8升/5升/3升,需在其中一个水桶中收集正好四升水。
* 规则是:
* 1、桶只能被清空、完全装满或倒入另一个桶中。
* 2、把A桶水倒入B桶,要么把B桶倒满,要么A桶水量不足,水量不足则倒空。
* 3、例如:A桶有8升水,把A桶水倒入空的3升的C桶,会把C倒满,A桶剩余5升。
* 4、再如:B桶有5升水,A桶8升空,把B桶水倒入A桶,B桶将倒空,A桶成5升
''')GOAL = 4         # 桶中装恰好4升水才能获胜
step_count = 0   # 记录玩家解决此问题所用的步数# 每个桶的初始水量,使用一个字典记录
waterInBucket = {'8':0,'5':0,'3':0}while True:   # 游戏主循环# 显示桶内当前水量print()print(f'请让任意一个水桶中的水正好有 {GOAL} L 。')print('当前3个水桶的水量如下:')waterDisplay = []    # 用于存储表示水或者剩余空间的字符串,打印此列表元素显示3个水桶的盛水状态# 8L 水桶for i in range(1,9):if waterInBucket['8'] < i:waterDisplay.append('      ')   # 表示空白else:waterDisplay.append('wwwwww')   # 表示加水# 5L 水桶for i in range(1,6):if waterInBucket['5'] < i:waterDisplay.append('      ')   # 表示空白else:waterDisplay.append('wwwwww')   # 表示加水# 3L 水桶for i in range(1,4):if waterInBucket['3'] < i:waterDisplay.append('      ')   # 表示空白else:waterDisplay.append('wwwwww')   # 表示加水# 显示3个桶的状体print('''
8|{7}|
7|{6}|
6|{5}|
5|{4}|  5|{12}|
4|{3}|  4|{11}|
3|{2}|  3|{10}|  3|{15}|
2|{1}|  2|{9}|  2|{14}|
1|{0}|  1|{8}|  1|{13}|+------+   +------+   +------+8L         5L         3L                                              
'''.format(*waterDisplay))    # 解包waterDisplay列表# 判断是否有满足目标水量的桶for water_amount in waterInBucket.values():if water_amount == GOAL:print(f'恭喜您完成目标!您解决此问题使用了: {step_count} 步。')sys.exit()  # 让玩家选择一个动作来处理一个桶print('你可以选择下面的动作:')print('  输入 F/f 键回车,来给一个桶加满水。')print('  输入 E/e 键回车,清空一个桶。')print('  输入 P/p 键回车,把一个桶的水倒入另一个桶(加完或者加满)。')print('  输入 Q/q 键回车,将退出系统。')while True:   # 不断询问,直到玩家输入有效的动作# 玩家输入的都为大写player_action = input('>').upper()   if player_action.startswith('Q'):print('再见,欢迎有空再玩!')sys.exit()if player_action in ('F','E','P'):break   # 跳出循环,让玩家选择接下来的动作# 玩家没有输入有效的选择,提醒并返回循环print('输入无效键,请输入 F,E,P, 或者Q键。')# 让玩家选择一个桶while True:         # 继续询问,直到玩家选择有效的桶print('请输入数字选择一个桶,:8, 5, 3,或者输入Q退出。')src_bucket_id = input('>').upper()# if src_bucket_id.startswith('Q'):#     print('谢谢玩这款游戏。')#     sys.exit()if src_bucket_id in ('8','5','3'):break   # 跳出循环,否则循环继续,让玩家继续输入有效的选择# 执行选择的动作if player_action == 'F':# 将所选水桶的水量设置为最大容量src_bucket_id_size = int(src_bucket_id)  waterInBucket[src_bucket_id] = src_bucket_id_sizestep_count += 1  # 玩家执行步数 +1elif player_action == 'E':   # 清空水桶waterInBucket[src_bucket_id] = 0   step_count += 1elif player_action == 'P':# 让玩家选择要倒入水的桶while True:  # 继续询问,直到玩家选择有效的桶print('请选择要倒入水的桶,输入水桶编号:8, 5 ,或者3')dst_bucket_id = input('>').upper()if dst_bucket_id in ('8','5','3'):break    # 玩家输入了一个有效的水桶退出循环,否则继续循环dst_bucket_id_size = int(dst_bucket_id)  # 最大容量dst_bucket_empty_space = dst_bucket_id_size - waterInBucket[dst_bucket_id]  # 要倒入水的水桶剩余最大容量water_in_src_bucket = waterInBucket[src_bucket_id]  # 倒出水的桶的水的容量amount_to_pour = min(dst_bucket_empty_space,water_in_src_bucket)  # 实际倒出的水的水量# 倒出水的水桶水量更新waterInBucket[src_bucket_id] -= amount_to_pour# 倒入水的水桶水量更新waterInBucket[dst_bucket_id] += amount_to_pour# 计数step_count += 1elif player_action == 'C':pass # 未来可扩展动作

两个知识点:

print('''
8|{7}|
7|{6}|
6|{5}|
5|{4}|  5|{12}|
4|{3}|  4|{11}|
3|{2}|  3|{10}|  3|{15}|
2|{1}|  2|{9}|  2|{14}|
1|{0}|  1|{8}|  1|{13}|+------+   +------+   +------+8L         5L         3L                                              
'''.format(*waterDisplay))    # 格式化字符串,解包waterDisplay列表,填入相应数值

(1)字符串格式化

上面print()函数打印表示3个水桶及水量的字符串,字符串模板中有16个变量,分别代表3个水桶的每一升水容量,如果是1升水是“wwwwww”(6个'w'),否则是"      "(6个空格),这16个变量取自变量waterDisplay(一个列表),使用format()函数格式化。

(2)元素解包:当你想将列表的每个元素传递给一个函数时,可以使用 *

def add(a, b):  return a + b  numbers = [1, 2]  
result = add(*numbers)  # result 的值为 3

上面小游戏代码就是使用了*符号,解包waterDisplay列表,把列表中的所有元素传递给了format()函数,从而格式化3个水桶字符穿。

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

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

相关文章

《大魔界村》中的人物性格——亚瑟

《大魔界村》作为一款经典的街机动作游戏,其主角——勇敢的骑士亚瑟,以其独特的性格特点和坚定的信念,在玩家心中留下了深刻印象。本文将深入探讨亚瑟这一角色的性格特质,通过分析他在游戏中的行为表现及决策过程,展现他身上的勇气、坚韧与智慧三大要点。 一、无畏挑战的…

如何配置SSH实现无公网ip远程连接访问Deepin操作系统

&#x1f4d1;前言 本文主要是配置SSH实现无公网ip远程连接访问Deepin操作系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️** &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &…

fastapi 链接数据库,并报错问题

还有一个重点需要下载 pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simplefrom fastapi import FastAPI import uvicorn from student.urls import student_id_mysql from sqlalchemy …

go使用gopprof分析内存泄露

假设我们使用的是比如beego这样的网络框架,我们可以这样加代码来使用gopprof来进行内存泄露分析: beego框架加gopprof分析代码: 1.先在router.go里添加路由信息: beego.Router("/debug/pprof", &controllers.ProfController{}) beego.Router("/debug…

【Linux】文件周边002之初步理解文件管理(打开的文件)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.&#xff08;打开…

leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示…

XGB-3: 模型IO

在XGBoost 1.0.0中&#xff0c;引入了对使用JSON保存/加载XGBoost模型和相关超参数的支持&#xff0c;旨在用一个可以轻松重用的开放格式取代旧的二进制内部格式。后来在XGBoost 1.6.0中&#xff0c;还添加了对通用二进制JSON的额外支持&#xff0c;作为更高效的模型IO的优化。…

lua只读表

参考《programming in lua》13.4.5中&#xff0c;详细介绍了只读表的用法。建立一个函数&#xff0c;传入一个table&#xff0c;传出一个代理table&#xff0c;其__index指向传入的table&#xff0c;__newIndex直接报error即可&#xff1a; --输入一个table&#xff0c;输出一…

蓝桥杯(Web大学组)2023十四届省赛真题3:收集帛书碎片

需要实现&#xff1a; 1.将二维数组转为一维数组&#xff1b; 2.数组去重 一、将二维数组转为一维数组&#xff1a; 二、数组去重&#xff1a; function collectPuzzle(...puzzles) {// console.log(puzzles);// console.log(...puzzles);// TODO:在这里写入具体的实现逻辑/…

monaco-editor布局篇(一)-自适应大小

编辑器的宽高怎么进行自适应&#xff1f; 在create编辑时&#xff0c;通过配置 automaticLayout 实现编辑器大小自适应&#xff1a; monaco.editor.create(editorRef.value, {value: ,language: "javascript",fixedOverflowWidgets: true,fontFamily: "Arial&q…

可控概率抽奖算法

说明 本文PHP语言去实现&#xff0c;只实现核心可控概率引擎&#xff0c;库存判断等其它业务需要其它代码配合实现。 代码 /*** function 封装可控概率的抽奖功能* param $arr array 数据集合* param $weight_key string 权重字段* return array 被选…

colavoidance4

共有四个Matlab文件&#xff0c;main.m、AirCraft.m、Arena.m和mission_planner.m main.m 主文件比较简短&#xff0c;主要是模拟和控制无人机的飞行路径。 首先是一些初始定义和设置&#xff1a; num_of_UAVs 4: 定义无人机的数量为4。time 1300: 定义总时间为1300秒。s…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

九州金榜|如何做好家庭教育

孩子的家庭教育是每个家庭都要做的&#xff0c;也是每个家长面临的事情&#xff0c;同样不同的家庭教育教育出来的孩子性格也各不相同&#xff0c;有时候家长看别别人家的孩子品学兼优非常羡慕&#xff0c;很多家长会把问题归结到孩子身上&#xff0c;其实有没有想过是家庭教育…

机器学习算法与Python实战 | 2024年吴恩达预测:关于AI,这些事未来十年不会变

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年吴恩达预测&#xff1a;关于AI&#xff0c;这些事未来十年不会变 2024年&#xff0c;AI的发展会有怎样的改变&#xff1f; 在吴…

CSDN文章导出工具

源码地址&#xff1a; github:https://github.com/lishuangquan1987/CSDNExportergitee:https://gitee.com/lishuangquan1987/csdnexporter 介绍 最近有CSDN博客导出来的需求&#xff0c;翻看了很多开源工具&#xff0c;都不能用或者不好用&#xff0c;于是决定自己做一个。…

docker swarm

1.准备三台机器&#xff0c;分别安装docker,例如IP分别为&#xff1a; 192.168.88.131&#xff0c;192.168.88.136&#xff0c;192.168.88.138 2.修改/etc/hostname 分别为&#xff1a; manger,node1,node2 3.分别修改/etc/hosts添加: 192.168.88.131 manger 192.168.88.13…

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…

香港优才VS高才计划对比哪个好?详解申请条件、优缺点、续签转永居!

香港优才和高才计划对比哪个好&#xff1f;详解申请条件、优缺点、续签转永居&#xff01; 香港优才计划和香港高才通计划&#xff0c;都是热门的香港人才引进项目&#xff0c;在2023年&#xff0c;这两个项目为香港引进了超6万的优秀人才和高端人才&#xff0c;为香港经济发展…

CSRF:跨站请求伪造攻击

目录 什么是CSRF&#xff1f; DVWA中的CSRF low medium hight impossible 防御CSRF 1、验证码 2、referer校验 3、cookie的Samesite属性 4、Anti-CSRF-Token 什么是CSRF&#xff1f; CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&…