编写Blackjack游戏:如何避免为每位玩家重复代码?
首先先修正你代码里的一个小bug:list.remove()和list.append()都是原地修改列表,返回值是None,所以你原来写的player_cards = player_cards.remove(11)会把player_cards变成None,后续操作会报错,得改成直接调用方法、不用赋值。
接下来解决重复代码的问题,给你几个实用的思路:
思路1:封装成工具函数(最推荐)
把处理A牌(11转1)的逻辑单独写成一个函数,需要处理哪个牌组就传哪个进去,完全消除重复代码,还方便后续复用。
示例代码:
import random cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] def deal_card(): return random.sample(cards, 2) # 封装处理A牌的函数 def adjust_for_ace(cards): # 用while处理多张A的极端情况(比如两张11总和22,需要转一张为1) while 11 in cards and sum(cards) > 21: cards.remove(11) cards.append(1) player_cards = deal_card() computer_cards = deal_card() # 调用函数处理两个牌组 adjust_for_ace(player_cards) adjust_for_ace(computer_cards)
思路2:用列表存储多牌组,循环处理
如果后续可能扩展多人游戏,可以把所有玩家的牌组放到一个列表里,循环遍历处理:
import random cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] def deal_card(): return random.sample(cards, 2) def adjust_for_ace(cards): while 11 in cards and sum(cards) > 21: cards.remove(11) cards.append(1) # 将所有玩家牌组存入一个列表 all_players = [deal_card(), deal_card()] # 索引0是玩家,索引1是电脑 # 循环处理每个牌组 for cards in all_players: adjust_for_ace(cards) # 取出处理后的牌组 player_cards = all_players[0] computer_cards = all_players[1]
思路3:面向对象(进阶)
如果游戏逻辑越来越复杂,用类封装玩家的属性和行为会让代码结构更清晰:
import random cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] class Player: def __init__(self): self.cards = random.sample(cards, 2) def adjust_for_ace(self): while 11 in self.cards and sum(self.cards) > 21: self.cards.remove(11) self.cards.append(1) def get_score(self): self.adjust_for_ace() return sum(self.cards) # 创建玩家和电脑实例 player = Player() computer = Player() # 获取分数时自动处理A牌 player_score = player.get_score() computer_score = computer.get_score()
至于你提到的map、zip,这里完全用不上——这两个工具适合对可迭代对象做批量元素操作,而直接用函数调用或循环处理牌组的逻辑更直观。
内容的提问来源于stack exchange,提问作者Foothill_trudger
相关产品推荐
相关产品推荐

