求Python优化版扑克牌发牌代码:凑齐4张红桃即终止并宣布赢家
优化你的扑克牌洗牌发牌游戏代码
嘿,作为Python新手能写出基础逻辑已经超棒啦!咱们来把这个游戏代码优化得更简洁、更符合Python风格,同时让逻辑更清晰~
先聊聊原代码可以优化的点
- 用
{x:y}这种字典存单张牌有点没必要,每张牌其实是花色+点数的组合,用元组(花色, 点数)会更轻量、更方便后续统计 - 手动构建牌组的嵌套循环可以用
itertools.product简化,代码更紧凑 - 玩家手牌用单独变量管理不够灵活,换成字典或者列表组会更方便扩展(比如以后加玩家)
- 发牌时可以边发边检查获胜条件,不用等全发完再判断,节省不必要的操作
优化后的完整代码
import random from itertools import product def check_heart_win(player_hand): # 统计玩家手牌中的红桃数量 return sum(1 for card in player_hand if card[0] == "Heart") >= 4 def main(): # 1. 构建完整牌组:用product生成所有花色+点数的组合 suits = ["Heart", "Spade", "Club", "Diamond"] ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"] deck = list(product(suits, ranks)) # 2. 洗牌:直接用random.shuffle打乱牌组 random.shuffle(deck) # 3. 初始化玩家手牌:用字典管理,方便后续操作 players = { "player1": [], "player2": [], "player3": [], "player4": [] } player_list = list(players.keys()) current_player_idx = 0 # 4. 发牌并检查获胜条件 while deck: # 给当前玩家发一张牌 current_player = player_list[current_player_idx] dealt_card = deck.pop() players[current_player].append(dealt_card) # 检查是否获胜 if check_heart_win(players[current_player]): print(f"🎉 {current_player}获胜!拿到了4张红桃!") print(f"{current_player}的手牌:{players[current_player]}") return # 切换到下一个玩家 current_player_idx = (current_player_idx + 1) % 4 # 如果牌发完都没人获胜的情况(理论上不可能,因为红桃有13张) print("所有牌发完,没有人拿到4张红桃") if __name__ == "__main__": main()
优化细节解释
- 牌组构建:
itertools.product(suits, ranks)会自动生成所有花色和点数的组合,比如("Heart", 2)、("Spade", "J"),比手动写嵌套循环更简洁高效。 - 洗牌逻辑:
random.shuffle(deck)直接在原列表上打乱,不用自己手动生成洗牌后的列表,是Python的标准做法。 - 玩家管理:用字典
players存储每个玩家的手牌,后续如果要修改玩家数量,只需要调整字典的键即可,比单独定义4个变量灵活太多。 - 获胜检查:用生成器表达式
sum(1 for card in player_hand if card[0] == "Heart")快速统计红桃数量,比循环计数更简洁。 - 提前终止:每发一张牌就检查一次,一旦有人满足条件立刻终止游戏,避免做无用功。
这样的代码不仅可读性更强,也更符合Python的惯用写法,以后维护或者扩展功能也会更方便~
内容的提问来源于stack exchange,提问作者Krishnaraj Gunasekar
相关产品推荐
相关产品推荐

