「セブンブリッジ」トランプゲーム
麻雀に似たゲームの系統です。カードを引いては捨て、特定の組み合わせを作っていくゲームです。
基本用語
山札
場の裏向きに配置されたカード束。
捨て札
「手札」から出され場にオモテ向きに置かれたカード。
「山札」が無くなった場合、「捨て札」をしっかりと切って裏向きにして「新しい山札」として使います。
手札
プレイヤーのカード。
メルド
「手札」の中に、同じ数字のカード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()