用python写一个11点游戏

Finder / 2024-05-19


这周完成了 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 可以接受一到三个整数参数:

  1. 第一个参数是起始值(包含),默认为 0。
  2. 第二个参数是结束值(不包含),必须提供。
  3. 第三个参数是步长,表示序列中每两个连续数字之间的差,如果不提供,默认为 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}

  1. user_list:这是一个可迭代对象,它包含了一些元素。这些元素是用户的名字,在示例中是 ["alex", "武沛齐", "李路飞"]

  2. for user in user_list:这是一个for循环,它遍历user_list中的每个元素。在每次迭代中,user_list中的当前元素被赋值给变量user

  3. user: 0:这是字典推导式中的键值对。user是键,它来自user_list中的元素;0是值,表示每个用户的初始分数。

  4. result_score:这是新创建字典的变量名。字典推导式的结果将被赋值给这个变量。

执行过程

  • 初始化一个空字典。
  • 遍历user_list中的每个元素。
    • 对于每个元素(即每个用户),将其作为键添加到字典中,并将值设置为0。
  • 最终,字典中包含了所有用户作为键,每个键对应的值都是0。

结果

假设user_list["alex", "武沛齐", "李路飞"],执行字典推导式后,result_score 将变为:

{
    "alex": 0,
    "武沛齐": 0,
    "李路飞": 0
}

使用场景

这种字典推导式在需要快速初始化字典时非常有用,尤其是在键已知且需要为它们设置默认值时。在这个例子中,它用于初始化一个游戏分数板,每个玩家的初始分数都是0。

总结

字典推导式提供了一种快速、简洁且易于阅读的方式来创建字典,特别是当你需要从另一个可迭代对象生成键值对时。它使得代码更加紧凑,并且可以提高代码的可读性和效率。

#Python学习记录

最后一次修改于 2024-05-19