这周完成了 python 数据类型和循环语句的学习,因为之前有过了解,学习还相对轻松。做作业时,有个题目很有意思,记录一下。
题目 #
Python代码模拟一个简单的抓牌游戏,游戏规则如下:
扑克牌由四种花色(黑桃、红桃、梅花、方块)和1到14的数字组成,加上大王和小王两张特殊牌。
记分规则: J、Q、K、小王、大王代表的值为0.5,其他就是则就是当前的牌面值。
发牌规则: 默认先给用户发一张牌,用户根据自己的情况判断是否继续要牌。要,则再给他发一张。不要,则开始给下个玩家发牌。
如果用户手中的所有牌相加大于11,则表示爆了,分数归0,并且自动开始给下个人发牌。
输赢规则:将所有牌抓完后,比较分数大小,分数大的获胜
Python方法 #
python
import random
# 初始化纸牌
poker_color = ['黑桃', '红桃', '梅花', '方块']
poker_list = [('大王', 15), ('小王', 14)]
for color in poker_color:
for number in range(1, 14): # 扑克牌的数字通常是A到K
poker_list.append((color, number)) # 修正为添加花色和数字的元组
# 初始化玩家和分数
user_list = ["alex", "武沛齐", "李路飞"]
result_score = {user: 0 for user in user_list} # 初始化每个玩家的分数为0
while poker_list: #抓牌流程,直到纸牌被抓空,列表为空时为False
for user in user_list: #3个用户完成一轮抓牌
#1个玩家的抓牌流程
while poker_list:
print(f"轮到 {user} 抓牌。")
if not poker_list:
print(f"{user} 抓牌时发现牌堆已经空了。")
break
index = random.randint(0, len(poker_list) - 1)
poker = poker_list.pop(index)
print(f"{user} 抓到的牌是 {poker}。")
value = poker[1]
if value > 10:
value = 0.5
result_score[user] += value
if result_score[user] > 11:
print("爆炸了,得分归 0。")
result_score[user] = 0
break # 继续下一次抓牌
doornot = input(f"{user} 的当前得分是 {result_score[user]},是否继续抓牌?(Y/N): ").upper()
if doornot == 'N':
print(f"{user} 停止抓牌。")
break
print("游戏结束,最终得分为:")
for user, score in result_score.items():
print(f"{user}: {score}")
一些有意思的写法 #
range() #
range
是 Python 中的一个内置函数,用于生成一个整数序列,这个序列通常用于 for
循环中进行迭代。它提供了一种简洁的方式来创建一个序列,而不需要手动编写序列中的每个数字。
基本用法
range
可以接受一到三个整数参数:
- 第一个参数是起始值(包含),默认为 0。
- 第二个参数是结束值(不包含),必须提供。
- 第三个参数是步长,表示序列中每两个连续数字之间的差,如果不提供,默认为 1。
示例
# 只提供结束值,生成从 0 到 n-1 的序列
for i in range(5):
print(i, end=' ') # 输出: 0 1 2 3 4
# 提供起始值和结束值,生成从 m 到 n-1 的序列
for i in range(2, 5):
print(i, end=' ') # 输出: 2 3 4
# 提供起始值、结束值和步长,生成从 m 到 n-1 的序列,步长为 p
for i in range(1, 10, 2):
print(i, end=' ') # 输出: 1 3 5 7 9
特点
range
生成的是一个“范围对象”(range object),这是一个不可变的序列,只能通过迭代来访问其中的元素。range
可以生成非常大的序列,因为它不存储所有的值,而是按需生成每个值。range
常用于for
循环中,也可以转换为列表(list(range(...))
)来获取所有的值。
注意事项
range
的结束值是不包含的,也就是说,生成的序列中不包括结束值。- 如果步长是负数,
range
会生成一个递减的序列。
与 xrange
的区别
在 Python 2 中,range
返回一个列表,而 xrange
返回一个范围对象。在 Python 3 中,range
的行为与 Python 2 中的 xrange
相同,即返回一个范围对象。因此,Python 3 中不再有 xrange
。
总结
range
是 Python 中一个非常有用的内置函数,它提供了一种简单且高效的方式来生成整数序列。通过掌握 range
的用法,可以编写出更加简洁和高效的代码。
result_score = {user: 0 for user in user_list} #
当然,让我们更详细地探讨这个字典推导式 result_score = {user: 0 for user in user_list}
。
字典推导式
字典推导式是Python中的一种简洁的构造字典的方法,它允许你从一个可迭代对象中生成键值对。
语法结构
result_score = {key_expression: value_expression for item in iterable}
key_expression
:每个键的表达式,可以是变量或任何产生键的表达式。value_expression
:每个值的表达式,可以是变量或任何产生值的表达式。item
:在迭代中当前元素的变量名。iterable
:一个可迭代对象,比如列表、元组、字典等。
解析代码
result_score = {user: 0 for user in user_list}
-
user_list
:这是一个可迭代对象,它包含了一些元素。这些元素是用户的名字,在示例中是["alex", "武沛齐", "李路飞"]
。 -
for user in user_list
:这是一个for循环,它遍历user_list
中的每个元素。在每次迭代中,user_list
中的当前元素被赋值给变量user
。 -
user: 0
:这是字典推导式中的键值对。user
是键,它来自user_list
中的元素;0
是值,表示每个用户的初始分数。 -
result_score
:这是新创建字典的变量名。字典推导式的结果将被赋值给这个变量。
执行过程
- 初始化一个空字典。
- 遍历
user_list
中的每个元素。- 对于每个元素(即每个用户),将其作为键添加到字典中,并将值设置为0。
- 最终,字典中包含了所有用户作为键,每个键对应的值都是0。
结果
假设user_list
是 ["alex", "武沛齐", "李路飞"]
,执行字典推导式后,result_score
将变为:
{
"alex": 0,
"武沛齐": 0,
"李路飞": 0
}
使用场景
这种字典推导式在需要快速初始化字典时非常有用,尤其是在键已知且需要为它们设置默认值时。在这个例子中,它用于初始化一个游戏分数板,每个玩家的初始分数都是0。
总结
字典推导式提供了一种快速、简洁且易于阅读的方式来创建字典,特别是当你需要从另一个可迭代对象生成键值对时。它使得代码更加紧凑,并且可以提高代码的可读性和效率。
#Python学习记录最后一次修改于 2024-05-19