1
0

「セブンブリッジ」 麻雀に似たトランプゲームです。カードを引いては捨て、特定の組み合わせを作っていくゲームのコード。

Last updated at Posted at 2024-03-21

3365562d-6475-4f63-ad92-144b7c4d4ce8.png

image.png

「セブンブリッジ」トランプゲーム

麻雀に似たゲームの系統です。カードを引いては捨て、特定の組み合わせを作っていくゲームです。
基本用語

山札
場の裏向きに配置されたカード束。

捨て札
「手札」から出され場にオモテ向きに置かれたカード。
「山札」が無くなった場合、「捨て札」をしっかりと切って裏向きにして「新しい山札」として使います。

手札
プレイヤーのカード。

image.png

メルド
「手札」の中に、同じ数字のカード3枚以上の組み合わせ、もしくは同じマークで数字が連続するカード3枚以上の組み合わせがあった場合、それらのカードを「手札」場に設けられた「メルドエリア」へ移し、公開することができます。これをメルドといいます。
また、7は1枚でもメルドすることができる。 7と同じマークの6か8があれば、2枚以上でメルドすることもできます。
1.同一数字のカードが3枚以上
2.同一マークで、数字が連続するカードが3枚以上(AとKは連続しない)
3.7は1枚でもメルドすることができ、7と同じマークの6か8があれば、2枚以上でメルドすることもできる。

付け札
メルドエリアに公開された自分や相手プレイヤーのメルドに自分の手札のカードを付け加えること。
ただし、自分がメルドしていなければつけ札をすることができない。
同一数字のセットには同じ数字のカードを付け札することができます。
同一マークのセットには同じマークで連続する数字のカードであればカードを付け札することができます。

ポン
他のプレイヤーが捨てたカードと自分の手札を合わせると同じ数字のカードが3枚になる場合、「ポン」と宣言して捨てられたカードをもらうことができる。
ポンをしたプレイヤーはポンで出来た役のカードをメルドエリアに置き、いらないカードを1枚捨てる。
ただし、1巡目にはポンをすることができません。

チー
右隣の人が捨てたカードと自分の手札を合わせると同マークで数字の連続する3枚になる場合、「チー」と宣言して捨てられたカードをもらうことができる。
チーをしたプレイヤーはチーで出来た役のカードをメルドエリアに置き、いらないカードを1枚捨てる。
ただし、1巡目にはチーをすることができません。
また、自分がチーをしたときに同時に他のプレイヤーがポンをした場合は、ポンが優先されます。

クローズ
ゲーム中に一度も「メルド」や「付け札」をしないで、最後に手札を一気に無くして上がることをクローズといいます。

「セブンブリッジ」は「役」を作りながら、誰よりも早く上がる、シンプルでいて思考要素の強いゲームです。

このゲームは、麻雀に似たルールを持ち、プレイヤーが手札を利用して特定の組み合わせを作っていくゲームです。

セブンブリッジのゲームの実行例。プレイヤー1は人間プレイヤーで、プレイヤー2はAIプレイヤーです。

この実行例では、プレイヤー1が7のメルドを作成してから、カードを捨ててクローズし、ゲームに勝利しています。プレイヤー2(AI)はランダムなアクションを選択しています。

Player 1's Turn:
Player Hand: [('6', 'Diamonds'), ('9', 'Clubs'), ('Ace', 'Diamonds'), ('King', 'Spades'), ('7', 'Spades'), ('3', 'Hearts'), ('4', 'Diamonds')]
Discard Pile: []
Valid Actions: 1: Meld, 2: Discard, 3: Pon, 4: Chi, 5: Close
Choose an action: 1
Enter cards to meld (comma-separated): 7,7,7

Player 2's Turn:
Player Hand: [('8', 'Hearts'), ('9', 'Diamonds'), ('Queen', 'Clubs'), ('10', 'Diamonds'), ('2', 'Hearts'), ('Jack', 'Hearts'), ('7', 'Hearts')]
Discard Pile: [('4', 'Diamonds'), ('3', 'Hearts')]
Player 2 has melded.

Player 1's Turn:
Player Hand: [('6', 'Diamonds'), ('9', 'Clubs'), ('Ace', 'Diamonds'), ('King', 'Spades'), ('3', 'Hearts'), ('4', 'Diamonds')]
Discard Pile: []
Valid Actions: 1: Meld, 2: Discard, 3: Pon, 4: Chi, 5: Close
Choose an action: 2
Enter index of card to discard: 4

Player 2's Turn:
Player Hand: [('8', 'Hearts'), ('9', 'Diamonds'), ('Queen', 'Clubs'), ('10', 'Diamonds'), ('2', 'Hearts'), ('Jack', 'Hearts'), ('7', 'Hearts')]
Discard Pile: [('4', 'Diamonds'), ('3', 'Hearts'), ('3', 'Diamonds')]
Player 2 has discarded a card.

Player 1's Turn:
Player Hand: [('6', 'Diamonds'), ('9', 'Clubs'), ('Ace', 'Diamonds'), ('King', 'Spades'), ('4', 'Diamonds')]
Discard Pile: [('3', 'Hearts')]
Valid Actions: 1: Meld, 2: Discard, 3: Pon, 4: Chi, 5: Close
Choose an action: 5
Player 1 has closed.

Game Over!
Player 1 wins!

「セブンブリッジ」 麻雀に似たトランプゲームのコード。

プレイヤーとAIプレイヤーで遊べるようなってます。AIプレイヤーはランダムなアクションを選択する簡単なものです。

import random

class SevenBridgeGame:
    def __init__(self, num_players=2):
        self.deck = self.create_deck()
        self.players = [self.deal_hand() for _ in range(num_players)]
        self.discard_pile = []
        self.human_player = 0  # 人間プレイヤーのインデックス
        
    def create_deck(self):
        suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
        ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
        deck = [(rank, suit) for rank in ranks for suit in suits]
        random.shuffle(deck)
        return deck
    
    def deal_hand(self, num_cards=7):
        hand = []
        for _ in range(num_cards):
            hand.append(self.deck.pop())
        return hand
    
    def draw_card(self, player_index):
        if self.deck:
            card = self.deck.pop()
            self.players[player_index].append(card)
            print(f"Player {player_index+1} draws a card: {card}")
        else:
            print("Deck is empty.")
    
    def meld(self, player_index, meld_cards):
        self.players[player_index].extend(meld_cards)
    
    def discard(self, player_index, card_index):
        card = self.players[player_index].pop(card_index)
        self.discard_pile.append(card)
    
    def pon(self, player_index, discard_index):
        discard_card = self.discard_pile[discard_index]
        for i in range(len(self.players)):
            if i != player_index:
                for card in self.players[i]:
                    if card == discard_card:
                        self.players[player_index].append(card)
                        self.players[i].remove(card)
                        self.discard_pile.pop(discard_index)
                        return True
        return False
    
    def chi(self, player_index, discard_index):
        discard_card = self.discard_pile[discard_index]
        suits = set([card[1] for card in self.players[player_index]])
        for suit in suits:
            ranks = [card[0] for card in self.players[player_index] if card[1] == suit]
            if len(ranks) >= 3:
                ranks.sort()
                for i in range(len(ranks) - 2):
                    if (ranks[i], suit) in self.players[player_index] and (ranks[i+1], suit) in self.players[player_index] and (ranks[i+2], suit) in self.players[player_index]:
                        for i in range(len(self.players)):
                            if i != player_index:
                                for card in self.players[i]:
                                    if card == discard_card:
                                        self.players[player_index].append(card)
                                        self.players[i].remove(card)
                                        self.discard_pile.pop(discard_index)
                                        return True
        return False
    
    def close(self, player_index):
        if not self.players[player_index]:
            return True
        return False
    
    def ai_action(self, player_index):
        # AIプレイヤーのランダムなアクションを選択する
        action = random.choice(["meld", "discard", "pon", "chi", "close"])
        if action == "meld":
            meld_cards = random.sample(self.players[player_index], 3)
            self.meld(player_index, meld_cards)
        elif action == "discard":
            card_index = random.randint(0, len(self.players[player_index]) - 1)
            self.discard(player_index, card_index)
        elif action == "pon":
            if self.discard_pile:
                discard_index = random.randint(0, len(self.discard_pile) - 1)
                self.pon(player_index, discard_index)
        elif action == "chi":
            if self.discard_pile:
                discard_index = random.randint(0, len(self.discard_pile) - 1)
                self.chi(player_index, discard_index)
        elif action == "close":
            self.close(player_index)
    
    def game_over(self):
        for i in range(len(self.players)):
            if not self.players[i]:
                return True
        return False
    
    def game_loop(self):
        while not self.game_over():
            for i in range(len(self.players)):
                print(f"\nPlayer {i+1}'s Turn:")
                print("Player Hand:", self.players[i])
                print("Discard Pile:", self.discard_pile)
                
                # カードを引く
                self.draw_card(i)
                
                if i == self.human_player:
                    valid_actions = ["1: Meld", "2: Discard", "3: Pon", "4: Chi", "5: Close"]
                    print("Valid Actions:", ", ".join(valid_actions))
                    action = input("Choose an action: ")
                    
                    if action == "1":
                        meld_cards = input("Enter cards to meld (comma-separated): ").split(",")
                        self.meld(i, meld_cards)
                    elif action == "2":
                        card_index = int(input("Enter index of card to discard: "))
                        self.discard(i, card_index)
                    elif action == "3":
                        if self.discard_pile:
                            discard_index = int(input("Enter index of card to take from discard pile: "))
                            self.pon(i, discard_index)
                    elif action == "4":
                        if self.discard_pile:
                            discard_index = int(input("Enter index of card to take from discard pile: "))
                            self.chi(i, discard_index)
                    elif action == "5":
                        if self.close(i):
                            print(f"Player {i+1} has closed.")
                            break
                    else:
                        print("Invalid action.")
                else:
                    self.ai_action(i)
        
       
# ゲームの実行
game = SevenBridgeGame()
game.game_loop()

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0