Python扑克游戏开发问题:deal_hole方法无法为玩家发放底牌
扑克游戏底牌发放失效问题解决
问题描述
我是Python新手,开发扑克游戏时遇到问题:翻牌、转牌、河牌的发牌功能正常,但给玩家发两张底牌的功能失效,调用deal_hole方法后玩家的cards列表始终为空。
相关代码
发牌核心方法
def deal(self, location, times=1): for i in range(times): location.cards.append(self.pop(0))
底牌发放方法
def deal_hole(self): count = 0 while count < 2: for player in self.players_not_out: self.deck.deal(player, 1) count += 1
测试代码
list_of_players = [player('a'), player('b'), player('c'), player('d')] game = game('q') deck = deck() a = player('a') b = player('b') c = player('c') d = player('d') game.shuffle_deck() game.deal_hole() player.show_hand(a,a)
测试结果:a's hand: []
问题原因
- 玩家实例未绑定到游戏:测试代码里创建了玩家实例,但没有把它们添加到
game对象的players_not_out列表中。deal_hole方法遍历的是self.players_not_out,这个列表为空时,发牌逻辑根本不会执行。 - 牌组未关联到游戏:单独创建的
deck实例没有赋值给game.deck,游戏对象内的deck可能未初始化,调用self.deck.deal无法操作有效牌组。
解决方案
修正测试代码
将玩家实例添加到游戏的有效玩家列表,同时把牌组关联到游戏对象:
list_of_players = [player('a'), player('b'), player('c'), player('d')] game = game('q') # 绑定玩家到游戏 game.players_not_out = list_of_players # 绑定牌组到游戏 game.deck = deck() game.shuffle_deck() game.deal_hole() # 展示玩家a的手牌 player.show_hand(list_of_players[0], list_of_players[0])
优化游戏类初始化
在game类的__init__方法中提前初始化相关属性,避免手动赋值:
class game: def __init__(self, some_param): self.players_not_out = [] self.deck = deck() # 其他初始化逻辑
替代实现思路
- 简化底牌发放逻辑:去掉while循环,直接给每个玩家一次性发两张牌,代码更简洁:
def deal_hole(self): for player in self.players_not_out: self.deck.deal(player, 2) - 封装玩家手牌操作:给
player类添加add_card方法,避免直接操作cards属性,提升代码封装性:
对应的class player: def __init__(self, name): self.name = name self.cards = [] def add_card(self, card): self.cards.append(card)deal方法修改为:def deal(self, location, times=1): for i in range(times): location.add_card(self.pop(0))
内容的提问来源于stack exchange,提问作者Nick Belterman 225538
相关产品推荐
相关产品推荐

