一、遊戲規則
13×13是一款撲克牌遊戲,使用一副撲克牌(大小王除外)。遊戲每局都會隨機出牌並分配給兩名玩家,然後每個玩家持有一部分牌進行操作。
每次操作可以出任意數量的順子、對子,或者三條,並且必須按照牌點從小到大排列。比如,可以出:2 3 4、6 6、7 7 7,但是不能出:3 2 4、6 6 5 或者 6 7 6。
如果當前玩家無法出牌,則另一位玩家可以任意出牌,直到有一方手牌全部出完或者無法出牌為止。
遊戲結束後,雙方牌數少的一方獲勝。
二、遊戲實現
1、牌型
class Card: def __init__(self, number): self.number = number self.weight = number % 13 def __str__(self): suits = ['S', 'H', 'C', 'D'] ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K'] return ranks[self.weight] + suits[self.number // 13]
使用Card類表示撲克牌,其中number表示牌的編號,weight表示牌的點數。
2、出牌規則
def is_valid(cards): if len(cards) == 0: return False if len(cards) == 1: return True if len(cards) == 2 and cards[0].weight == cards[1].weight: return True if len(cards) == 3 and cards[0].weight == cards[1].weight and cards[1].weight == cards[2].weight: return True if len(cards) >= 5 and judge_shunzi(cards): return True return False def judge_shunzi(cards): if cards[-1].weight - cards[0].weight != len(cards) - 1: return False for i in range(len(cards) - 1): if cards[i + 1].weight != cards[i].weight + 1: return False return True
is_valid函數接受一組牌,判斷這組牌是否可以出。如果可以出,則返回True,否則返回False。出牌必須按照順子、對子、三條的順序進行。
judge_shunzi函數則判斷是否為順子。
3、遊戲邏輯
class Game: def __init__(self, deck): self.players = [Player(), Player()] random.shuffle(deck) for i in range(26): self.players[i % 2].add_card(deck.pop()) self.last_player = None self.last_cards = [] def run(self): player = self.last_player or random.choice(self.players) while self.players[0].get_card_count() and self.players[1].get_card_count(): if player == self.last_player: self.last_cards = [] self.last_player = player valid_cards = [] while not is_valid(valid_cards): print(f"Player {player.get_id()} cards:", player) if self.last_cards: print("Last cards:", self.last_cards) cards_str = input("Enter cards to play: ") valid_cards = [Card(int(card_str, 16)) for card_str in cards_str.split()] player.remove_cards(valid_cards) print(f"Player {player.get_id()} plays:", valid_cards) self.last_cards = valid_cards if player.get_card_count() == 0: break player = self.players[1] if player == self.players[0] else self.players[0] winner = [p for p in self.players if p.get_card_count() > 0][0] print(f"Player {winner.get_id()} wins!")
Game類用於表示一個遊戲,初始化時分配兩個玩家的牌。每次操作時,詢問當前玩家出牌,判斷是否符合規則,然後將出的牌交給對方。如果當前玩家無法出牌,則交給對方操作。
最後,判斷哪個玩家手牌數量最少,即為勝利方。
三、測試結果
if __name__ == '__main__': deck = [Card(i) for i in range(52)] game = Game(deck) game.run()
測試結果截圖:
四、總結
通過實現13×13這個撲克牌遊戲,我們可以學習到如何使用類和函數來表示基礎的遊戲規則和邏輯。如果想要玩起來更順暢,可以考慮增加AI模塊,讓電腦自動出牌。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/153443.html