真的很奇怪,我制作了一個紙牌游戲并制作了這個功能:
def draw_card_from_top(destination, departure):
if len(departure.cards) > 0:
destination.add_card(departure.cards.pop(0))
如果我放入目的地甲板和出發甲板,它會按預期作業。目的地甲板從出發甲板的頂部獲取卡片。
但我也做了這個功能,應該給每個玩家發 8 張牌:
def deal_new_game(players, departure):
for i in range(len(players)):
for j in range(CARDS_PER_ROUND):
draw_card_from_top(players[i].deck, departure)
現在我有以下問題;每位玩家應將出發牌組中的 8 張牌添加到他自己的目標牌組中。但出于某種原因,每個玩家現在都有一套完整的套牌副本,所以所有 32 張牌都是 1 個而不是 8 個和 2 個。每個人都有相同的順序
------ 完整原始碼-------
主要.py:
import _card, _deck, _player, game
is_invalid = True
while is_invalid:
try:
player_count = int(input('How many players? (3 or 4): '))
if player_count == 3 or player_count == 4:
is_invalid = False
except ValueError:
pass
player = []
for i in range(player_count):
player.append(_player.Player())
game_deck = _deck.Deck(game.create_new_deck())
game_deck.shuffle_deck()
_player.py:
import _deck
class Player():
def __init__(self):
self.deck = _deck.Deck()
self.score = 0
_deck.py:
from random import shuffle
class Deck():
# Ein Deck ist eine Ansammlung von einer oder mehreren Karten ('Card()''s)
def __init__(self, _cards=[]):
self.cards = _cards
def print_deck(self):
for i in range(0, len(self.cards)):
print(self.cards[i].term)
def shuffle_deck(self):
shuffle(self.cards)
def deck_size(self):
return len(self.cards)
def add_card(self, card):
self.cards.append(card)
_card.py:
class Card():
# Eine Karte besteht aus folgenden 3 Attributen:
# 1. color, die Color gibt an, um welche Farbe es sich handelt, 'Kreuz', 'Pik', 'Herz', 'Raute'
# 2. value, die Value gibt an, welchen Wert eine Karte hat. ZB hat die Herz 10 die value 10 und ein Kreuz Bube die value 11
# 3. term, der Term gibt an wie die Karte im Spiel bereichnet wird, so ist die Herz 7 die 'H7' oder die Pik Dame 'PQ'
def __init__(self, _color, _value, _term):
self.color = _color
self.value = _value
self.term = _term
游戲.py:
import _card
CARDS_PER_ROUND = 8
def create_new_deck():
cards = []
for i in range(4):
if i == 0:
color = 'Kreuz'
term_color = 'K'
if i == 1:
color = 'Pik'
term_color = 'P'
if i == 2:
color = 'Herz'
term_color = 'H'
if i == 3:
color = 'Raute'
term_color = 'R'
for value in range(7, 15):
if value <= 10:
term_value = str(value)
if value == 11:
term_value = 'B'
if value == 12:
term_value = 'D'
if value == 13:
term_value = 'K'
if value == 14:
term_value = "A"
cards.append(_card.Card(color, value, term_color term_value))
return cards
def draw_card_from_top(destination, departure):
if len(departure.cards) > 0:
destination.add_card(departure.cards.pop(0))
def draw_card_by_index(destination, departure, index):
if len(departure.cards) >= index:
destination.add_card(departure.cards.pop(index))
def deal_new_game(players, departure):
for i in range(len(players)):
for j in range(CARDS_PER_ROUND):
draw_card_from_top(players[i].deck, departure)
# TODO irgendwas buggt hier voll rum. Spieler-Decks bestehen nach Aufruf der Funktion komplett aus vollst?ndigen Decks.
uj5u.com熱心網友回復:
造成這個問題可變默認引數你的_deck.py模塊。
當您創建一個新的 Deck() 時,它的 self.card 屬性對于所有實體都是相同的(因為card=[]在 init 定義中)。
如果你把它改成這樣,它應該可以正常作業:
def __init__(self, _cards=None):
self.cards = [] if _cards is None else _cards
這個想法是為了避免對引數使用可變默認值。當使用卡片串列(制作副本或使用參考)創建卡組時,根據您希望卡組執行的操作,您可能需要以不同的方式實作它。
第一個示例使用對 _cards 串列的參考。要使用副本,您可以保留可變默認值,因為您不會將其保存在物件實體中:
def __init__(self, _cards=[]):
self.cards = _cards.copy()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396516.html
上一篇:PythonXML-遍歷元素,如果滿足屬性條件,則將該元素及其所有子元素添加到串列中
下一篇:在java中將地圖轉換為串列
