有人可以指导我如何在 class 中重用函数吗?
Can someone please guide me on how to reuse a function in a class?
有人可以指导我如何重用 class 中的函数以便通过 import random 接收不同的输出吗?
这是我使用 python 3.7 和 Conda
base 作为解释器在 VS Code 中编写的二十一点游戏。
我正在尝试重用函数 player_hand(随机卡片)并为 player_score(卡片值为整数)得到不同的结果
然后将这 2 个分数相加得到 final_player(最终分数)
我非常感谢有关如何应对这一挑战的指导和反馈...
import random
suit = {'Jack': 10, 'Queen': 10, 'King': 10, 'Ace': 11, 'Two': 2, 'Three': 3,
'Four': 4, 'Five': 5, 'Six': 6, 'Seven': 7, 'Eight': 8, 'Nine': 9}
symb = ['Spade', 'Clubs', 'Heart', 'Diamonds']
player_hand = random.sample(suit.items(), 1) + random.sample(symb, 1)
dealer_hand = random.sample(suit.items(), 1) + random.sample(symb, 1)
player_score = player_hand[0][1]
dealer_score = dealer_hand[0][1]
final_player = player_score + player_score
final_dealer = dealer_score + dealer_score
class Bet:
def __init__(self, player, bank=0):
self.bank = bank
self.player = player
def __str__(self):
return f'Player balance: ${self.bank}\n'
def bet(self):
self.amount = int(input('Place bet:'))
if self.bank <= self.amount:
return 'put more $ '
else:
self.bank -= self.amount
return f'Player balance: ${self.bank}'
class Card:
def __init__(self, suit, symb):
self.suit = suit
self.symb = symb
def deal(self, player_hand, dealer_hand, dealer_score, player_score):
while True:
print('dealer', dealer_hand)
print('dealer', dealer_score)
print('player', player_hand)
print('player', player_score)
break
class Card2:
def deal(self, player_hand, dealer_hand, dealer_score, player_score):
while True:
print('dealer', dealer_hand)
print('dealer', dealer_score)
print('player', player_hand)
print('player', player_score)
break
def total_score(self):
print(final_dealer)
print(final_player)
def winner(self):
if final_dealer < final_player:
return 'Player wins!'
elif final_player < final_dealer:
return 'dealer wins'
be = Bet('Player', bank=100)
print(be)
print(be.bet())
print('\n')
print(Card.deal('p', player_hand, dealer_hand, dealer_score, player_score))
print('\n')
print(Card2.winner('winner'))
下面的输出示例:
Player balance: 0
Place bet:5
Player balance:
dealer [('Queen', 10), 'Diamonds']
dealer 10
player [('Seven', 7), 'Heart']
player 7
None
dealer wins
我认为这里的挑战在于理解如何使用 类 对问题建模,尤其是当您是第一次接触面向对象编程 (OOP) 时。
你关于什么构成 Card
对象(即具有 rank 和 suit 的东西)的想法是合理的。 但这就是一张卡应该有的全部。所有的卡都只有这两个属性,像Card2
一样创建类意义不大。这张牌只是一张纸,它应该对持有它的玩家或荷官、手中的其他牌、玩家的钱等一无所知。包括这些无关数据会导致 "coupling" 其中您的玩家、赌注和牌都开始相互依赖,导致 "spaghetti code."
这是从我写的 Deck
中绘制 Card
对象的快速实现:
import random
class Player:
def __init__(self, money):
self.money = money
def bet(self, amount):
self.money -= amount
class Deck:
def __init__(self):
self.build()
def build(self):
self.cards = []
for rank in Card.ranks:
for suit in Card.suits:
card = Card(rank, suit)
self.cards.append(card)
def shuffle(self):
random.shuffle(self.cards)
def draw(self):
if self.cards != []:
card = self.cards.pop()
return card
else:
raise IndexError("Cannot draw from empty deck")
class Card:
ranks = {
"Two": 2, "Three": 3, "Four": 4, "Five": 5,
"Six": 6, "Seven": 7, "Eight": 8, "Nine": 9,
"Ten": 10, "Jack": 10, "Queen": 10, "King": 10,
"Ace": 11,
}
suits = ["Spade", "Club", "Heart", "Diamond"]
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
def get_value(self):
return Card.ranks[self.rank]
def __str__(self):
return "{0} of {1}s".format(self.rank, self.suit)
if __name__ == "__main__":
deck = Deck()
deck.shuffle()
for i in range(100):#should error out once deck is empty
card = deck.draw()
print(i, str(card))
请注意,一旦您编写了各个部分(例如洗牌和抓牌),主函数中的代码就应该是直观的。如果任何代码没有意义,请告诉我。
有人可以指导我如何重用 class 中的函数以便通过 import random 接收不同的输出吗?
这是我使用 python 3.7 和 Conda
base 作为解释器在 VS Code 中编写的二十一点游戏。
我正在尝试重用函数 player_hand(随机卡片)并为 player_score(卡片值为整数)得到不同的结果
然后将这 2 个分数相加得到 final_player(最终分数) 我非常感谢有关如何应对这一挑战的指导和反馈...
import random
suit = {'Jack': 10, 'Queen': 10, 'King': 10, 'Ace': 11, 'Two': 2, 'Three': 3,
'Four': 4, 'Five': 5, 'Six': 6, 'Seven': 7, 'Eight': 8, 'Nine': 9}
symb = ['Spade', 'Clubs', 'Heart', 'Diamonds']
player_hand = random.sample(suit.items(), 1) + random.sample(symb, 1)
dealer_hand = random.sample(suit.items(), 1) + random.sample(symb, 1)
player_score = player_hand[0][1]
dealer_score = dealer_hand[0][1]
final_player = player_score + player_score
final_dealer = dealer_score + dealer_score
class Bet:
def __init__(self, player, bank=0):
self.bank = bank
self.player = player
def __str__(self):
return f'Player balance: ${self.bank}\n'
def bet(self):
self.amount = int(input('Place bet:'))
if self.bank <= self.amount:
return 'put more $ '
else:
self.bank -= self.amount
return f'Player balance: ${self.bank}'
class Card:
def __init__(self, suit, symb):
self.suit = suit
self.symb = symb
def deal(self, player_hand, dealer_hand, dealer_score, player_score):
while True:
print('dealer', dealer_hand)
print('dealer', dealer_score)
print('player', player_hand)
print('player', player_score)
break
class Card2:
def deal(self, player_hand, dealer_hand, dealer_score, player_score):
while True:
print('dealer', dealer_hand)
print('dealer', dealer_score)
print('player', player_hand)
print('player', player_score)
break
def total_score(self):
print(final_dealer)
print(final_player)
def winner(self):
if final_dealer < final_player:
return 'Player wins!'
elif final_player < final_dealer:
return 'dealer wins'
be = Bet('Player', bank=100)
print(be)
print(be.bet())
print('\n')
print(Card.deal('p', player_hand, dealer_hand, dealer_score, player_score))
print('\n')
print(Card2.winner('winner'))
下面的输出示例:
Player balance: 0
Place bet:5
Player balance:
dealer [('Queen', 10), 'Diamonds']
dealer 10
player [('Seven', 7), 'Heart']
player 7
None
dealer wins
我认为这里的挑战在于理解如何使用 类 对问题建模,尤其是当您是第一次接触面向对象编程 (OOP) 时。
你关于什么构成 Card
对象(即具有 rank 和 suit 的东西)的想法是合理的。 但这就是一张卡应该有的全部。所有的卡都只有这两个属性,像Card2
一样创建类意义不大。这张牌只是一张纸,它应该对持有它的玩家或荷官、手中的其他牌、玩家的钱等一无所知。包括这些无关数据会导致 "coupling" 其中您的玩家、赌注和牌都开始相互依赖,导致 "spaghetti code."
这是从我写的 Deck
中绘制 Card
对象的快速实现:
import random
class Player:
def __init__(self, money):
self.money = money
def bet(self, amount):
self.money -= amount
class Deck:
def __init__(self):
self.build()
def build(self):
self.cards = []
for rank in Card.ranks:
for suit in Card.suits:
card = Card(rank, suit)
self.cards.append(card)
def shuffle(self):
random.shuffle(self.cards)
def draw(self):
if self.cards != []:
card = self.cards.pop()
return card
else:
raise IndexError("Cannot draw from empty deck")
class Card:
ranks = {
"Two": 2, "Three": 3, "Four": 4, "Five": 5,
"Six": 6, "Seven": 7, "Eight": 8, "Nine": 9,
"Ten": 10, "Jack": 10, "Queen": 10, "King": 10,
"Ace": 11,
}
suits = ["Spade", "Club", "Heart", "Diamond"]
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
def get_value(self):
return Card.ranks[self.rank]
def __str__(self):
return "{0} of {1}s".format(self.rank, self.suit)
if __name__ == "__main__":
deck = Deck()
deck.shuffle()
for i in range(100):#should error out once deck is empty
card = deck.draw()
print(i, str(card))
请注意,一旦您编写了各个部分(例如洗牌和抓牌),主函数中的代码就应该是直观的。如果任何代码没有意义,请告诉我。