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()
汚いけど許して

コメントを残す