我在为多个玩家做一个德州守住他们的游戏。到目前为止,我已经完成了博彩/呼叫序列的流程控制,播放器堆栈/壶更新,以及刚才负责绘制和分发卡片的部分。这是最后一部分,如果可能的话,我想加以审查。
本质上,我想知道我能以不同的方式/更有效率地做些什么,建议改变,实际上是任何可能有帮助的事情。检查来自玩家的正确输入等事情还没有到位,所以请忽略它们。
import itertools
import random
player_count = int(input("How many players? "))
suits = ['s', 'c', 'd', 'h']
faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K']
# Defining deck and drawing cards (5 + 2 per player):
deck = set(itertools.product(faces, suits))
drawn_cards = random.sample(deck,(5 + 2 * player_count))
# Storing a list with player object instances
players = []
class Players:
def __init__(self, stack):
self.stack = stack
self.last_action = "none" ## last action taken (check, call etc).
self.street_bets = 0 ## total bets on current street
def holecards(self):
## pop cards from list and pritifying their display. Cards will later be
## run through a function for checking value of hands:
card1 = drawn_cards.pop(len(drawn_cards)-1)
card2 = drawn_cards.pop(len(drawn_cards)-1)
self.card1 = (card1[0]+"["+card1[1]+"]")
self.card2 = (card2[0]+"["+card2[1]+"]")
self.cards = self.card1+ " - " +self.card2
print (self.cards)
class Table:
def __init__(self):
self.total_pot = 0
def flop(self):
card1 = drawn_cards.pop(len(drawn_cards)-1)
card2 = drawn_cards.pop(len(drawn_cards)-1)
card2 = drawn_cards.pop(len(drawn_cards)-1)
self.card1 = (card1[0]+"["+card1[1]+"]")
self.card2 = (card2[0]+"["+card2[1]+"]")
self.card3 = (card2[0]+"["+card2[1]+"]")
self.flop = self.card1+ " - " + self.card2 + " - " + self.card3
print (self.flop)
def turn(self):
card = drawn_cards.pop(len(drawn_cards)-1)
self.card = (card[0]+"["+card[1]+"]")
self.turn = self.card
print (self.turn)
def river(self):
card = drawn_cards.pop(len(drawn_cards)-1)
self.card = (card[0]+"["+card[1]+"]")
self.river = self.card
print (self.river)
# Add player stacks and distribute holecards:
for i in range(player_count):
players.append(i)
players[i] = Players(100)
players[i].holecards()
# Add dealer to table:
dealer = Table()
dealer.flop()
dealer.turn()
dealer.river()发布于 2016-10-22 04:14:53
合理的质量代码。以下是一些评论:
1)我添加了一个方法drawNextCard,它封装了下一张卡的检索,使代码更加可读性
def draw_next_card(drawn_cards):
card = drawn_cards.pop(len(drawn_cards)-1)
return readable_card_name(card)
def readable_card_name(short_card_name):
return (short_card_name[0]+"["+short_card_name[1]+"]")然后,例如,您的flop()方法将如下所示:
def flop(self):
(self.card1, self.card2, self.card3) = (draw_next_card(drawn_cards), draw_next_card(drawn_cards), draw_next_card(drawn_cards))
self.flop = self.card1+ " - " + self.card2 + " - " + self.card3
print (self.flop)更易读、更短,而且在途中,我们修复了一个复制/粘贴缺陷,您在这里初始化了两次card2,而不是card2和card3。
2)将每张抽签卡转换为可读的表示形式。它有利于您的调试,但不太好添加未来的功能,实际计算扑克手,和发展战略。因此,虽然上面的draw_next_card返回一个可读的表示,但最好是创建一个类Card,它有一个与readable_class_name具有相同实现的__str__方法。flop方法将保持不变,但扩展代码要容易得多。
3)注意flop和river是复制/粘贴的。两个人都可以打电话给draw_next_card。另外,虽然flow和river符合游戏术语,但它们对软件并没有多大好处;您最好将flop、turn和river合并成table_cards[5]向量。一旦你开始开发实际的游戏,它将使事情变得容易得多。
希望这能有所帮助。
发布于 2016-10-22 10:25:30
RomanK,我没有找到直接回复你的方法,但我不得不说谢谢你。所以-谢谢!
编辑:对不起,我想是“谢谢”。
另一个问题:经过深思熟虑后,使用类来处理和分配触发器、转弯和河流是否有意义?我用一个函数不是更好吗?我对它的思考越多,我就越少看到在类中使用这部分代码的任何理由--这似乎是一个更大的问题,而不是一个方便。
本质上,在洞牌被发给球员之后,drawn_cards列表中剩下的是董事会的5张牌。我现在所需要做的就是用一个函数显示它们:
def deal_community_cards(street):
if street == "flop":
flop = drawn_cards[0:3]
return flop
elif street == "turn":
turn = drawn_cards[3]
return turn
else:
river = drawn_cards[4]
return river 最后,我还会使用另一个函数对卡片显示进行“优先级化”。这难道不是比为这个创建一个完整的类更好的解决方案吗?
https://codereview.stackexchange.com/questions/144935
复制相似问题