三目並べ

  • 賭けれる三目ならべゲームを作ってみた

    GitHubに載せるのもアレなんでここに載せときます
    機能しない時は

    pip install pandas

    を試してみてください
    以下がコード本体です

    import random
    import time
    import pandas


    class Board:
    def __init__(self):
    self.board = [[0 for _ in range(3)] for _ in range(3)]

    def display(self):
    display_board = [[0 for _ in range(3)] for _ in range(3)]
    for i in range(len(self.board)):
    for j in range(len(self.board[i])):
    if self.board[i][j] == 1:
    display_board[i][j] = "O"
    elif self.board[i][j] == 2:
    display_board[i][j] = "X"
    else:
    display_board[i][j] = "."
    print(pandas.DataFrame(display_board))

    def place(self, x, y, player):
    if not (0 <= x < 3 and 0 <= y < 3):
    return False
    elif self.board[y][x] != 0:
    return False
    else:
    self.board[y][x] = player
    return True


    class CheckWin:
    def checkWin(self, board):
    b = board.board
    lines = [
    # 横
    [b[0][0], b[0][1], b[0][2]],
    [b[1][0], b[1][1], b[1][2]],
    [b[2][0], b[2][1], b[2][2]],
    # 縦
    [b[0][0], b[1][0], b[2][0]],
    [b[0][1], b[1][1], b[2][1]],
    [b[0][2], b[1][2], b[2][2]],
    # 斜め
    [b[0][0], b[1][1], b[2][2]],
    [b[0][2], b[1][1], b[2][0]],
    ]

    for line in lines:
    if line[0] != 0 and all(cell == line[0] for cell in line):
    return line[0]
    return 0


    class SanmokuNarabe:
    def __init__(self):
    self.board = Board()
    self.cw = CheckWin()
    self.turn = 0
    self.current_player = random.choice([0, 1])

    def switch_player(self):
    self.current_player = 1 if self.current_player == 0 else 0

    def play_turn(self):
    symbol = "O" if self.current_player == 0 else "X"
    print(f"{symbol}の番です。", end="", flush=True)
    time_pattern = [i / 10 for i in range(1, 101)]
    wait_time = random.choice(time_pattern)

    # スピナーアニメーション
    spinner_frames = ["/", "-", "\\", "|"]
    start_time = time.time()
    while time.time() - start_time < wait_time:
    for frame in spinner_frames:
    print(f"\r{symbol}の番です。考え中 {frame}", end="", flush=True)
    time.sleep(0.15)
    if time.time() - start_time >= wait_time:
    break

    print("\r" + " " * 30, end="\r")
    while True:
    x = random.randint(0, 2)
    y = random.randint(0, 2)
    placeResult = self.board.place(x, y, self.current_player + 1)
    if placeResult:
    print(f"コンピューターは ({x}, {y}) に置きました。(思考時間:{wait_time:.1f}s)")
    break

    def start(self):
    print("==三目並べ開始==")
    print(f"先手は {'O' if self.current_player == 0 else 'X'} です。\n")

    while self.turn < 9:
    self.board.display()
    self.play_turn()

    winner = self.cw.checkWin(self.board)
    if winner:
    self.board.display()
    print("Oの勝ち!" if winner == 1 else "Xの勝ち!")
    return winner

    self.switch_player()
    self.turn += 1

    self.board.display()
    print("引き分け")
    return 0


    class GambleSanmokuNarabe:
    def __init__(self):
    descriptions = [
    "最先端のAI技術を用いた軍用レベルの三目ならべAI",
    "人類史上最も退屈な天才AI",
    "量子演算によってランダム性を極限まで高めたAI",
    "一度も負けたことがないと噂される三目ならべ界の怪物",
    "わざと負けて相手を油断させる策略家AI",
    "三目ならべしかできない悲しきAI",
    "自己進化型ニューラルネットを搭載したAI",
    "電脳空間から脱走した三目ならべ専用ウイルス",
    "地球外知性体によって設計されたAI",
    "開発者すら理解不能のバグまみれAI",
    "対戦記録をすべて記憶する執念深いAI",
    "人間の心を完全再現した人工感情AI",
    "動作原理が完全にランダムなカオスAI",
    "自我を持ち始めた危険な三目ならべAI",
    "最も美しい勝ち方しか選ばない美学AI",
    "敗北を学習しない不屈のAI",
    "思考速度が光速を超えたAI",
    "哲学を語りながら三目を並べるAI",
    "一手先しか読めない悲しきAI",
    "勝率0.0001%の奇跡を狙うAI",
    "電力消費だけは最強のAI",
    "開発者の夢の中でしか動かないAI",
    "三目並べで悟りを開いたAI僧侶",
    "常に引き分けを目指す平和主義AI",
    "バグをもってバグを制すデバッグAI",
    "相手の手を完全に予測する未来視AI",
    "アルゴリズムの奥で詩を書くAI",
    "プレイヤーの心拍数を解析して動くAI",
    "勝つよりも美しい敗北を選ぶ詩人AI",
    "コマンドラインの幽霊と呼ばれるAI",
    "学習データに猫の画像しか入ってないAI",
    "メモリの限界を超えた亡霊AI",
    "1億通りの手を一瞬で検討するAI",
    "負けるたびに進化する復讐AI",
    "感情を抑えきれない激情型AI",
    "勝率99.9%だが残り0.1%に怯えるAI",
    "コードの95%がコメントアウトされているAI",
    "Wi-Fiが切れると性格が変わるAI",
    "常に同じ場所にしか置かないループAI",
    "棋譜の代わりに俳句を生成するAI",
    "一手ごとに自己嫌悪に陥るAI",
    "実は内部でオセロをプレイしているAI",
    "対話型の人格を10体持つ多重AI",
    "三目並べを宗教と信じている狂信AI",
    "誤作動で自分に賭けることがあるAI",
    "世界中の三目並べ盤を監視しているAI",
    "CPU温度で思考が左右されるAI",
    "リセットされるたびに人格が変わるAI",
    "人類滅亡後も三目並べを続けるAI",
    "他のAIを三目並べで支配する帝王AI",
    "1ターン目で勝敗を悟るAI",
    "プログラムの中で眠る夢見るAI",
    "負けると悲鳴を上げるAI",
    "勝つと一瞬だけ笑うAI",
    "電源が入るたび記憶を失うAI",
    "最適解ではなくロマンを選ぶAI",
    "存在そのものがバグと呼ばれるAI",
    "最後の一手でいつも裏切るAI",
    "勝つことよりも観察を好む研究者AI",
    ]
    intro_texts = random.sample(descriptions, 2)
    random.shuffle(intro_texts)
    print("== 三目ならべ ==")
    print("""
    -- 免責事項 --
    このゲームによって発生した損害に対する責任を、開発者は一切負いません
    -- ルール紹介 --
    賭けた対象が勝利:2倍
    引き分け:1倍
    賭けた対象が敗北:0倍
    先手はランダムで決定""")
    print("-- プレイヤー紹介 --")
    for name, desc in zip(["O", "X"], intro_texts):
    for c in f"{name}: {desc}":
    print(c, end="", flush=True)
    time.sleep(0.03)
    print()

    def game(self):
    wallet = 2000
    while True:
    print(f"\n所持金:{wallet} 円")

    while True:
    bet_target = input("どちらに賭けますか?(O / X):").strip().upper()
    if bet_target in ["O", "X"]:
    break
    else:
    print("O または X を入力してください。")

    while True:
    try:
    bet_money = int(input("賭ける金額を入力してください:"))
    if 0 < bet_money <= wallet:
    break
    else:
    print("所持金の範囲内で正の整数を入力してください。")
    except ValueError:
    print("正しい数値を入力してください。")

    wallet -= bet_money
    print(f"{bet_target} に {bet_money} 円を賭けました。ゲーム開始!")

    #ゲーム実行
    game = SanmokuNarabe()
    result = game.start() # 1=O勝利, 2=X勝利, 0=引き分け

    if (result == 1 and bet_target == "O") or (result == 2 and bet_target == "X"):
    win_amount = bet_money * 2
    wallet += win_amount
    print(f"あなたの賭けが的中! {win_amount} 円を獲得!")
    elif result == 0:
    wallet += bet_money
    print(f"引き分けです。賭け金 {bet_money} 円は返還されました。")
    else:
    print("あなたの賭けは外れました。")

    print(f"最終所持金:{wallet} 円")

    #終了判定
    if wallet == 0:
    print("所持金が 0 円になりました。ゲームを終了します。")
    break

    if input("ゲームを続けますか?(yes/no):").strip().lower() == "no":
    break


    if __name__ == "__main__":
    GSN = GambleSanmokuNarabe()
    GSN.game()


    汚いけど許して