乱数で自動対戦!Pythonで作る〇×(Tic Tac Toe)ゲームの実装方法
この記事では、プレイヤーの操作を一切必要としない「自動〇×ゲーム(Tic Tac Toe)」をPythonで実装する方法を紹介します。盤面へのマークはユーザー入力ではなく乱数によって自動的に配置され、各ターンが終わるたびに盤面の状態が表示されます。どちらかのプレイヤーが勝利した時点でゲームが終了し、盤面がすべて埋まって引き分けになった場合は -1 を返します。
使用するのは、Pythonの標準ライブラリ random と、数値計算ライブラリ NumPy の2つのモジュールです。空きマスの中からランダムに場所を選び、プレイヤー1とプレイヤー2が交互にマークを置いていくシンプルな仕組みです。
サンプルコード
import numpy as np
import random
from time import sleep
# まず空の盤面を作成する
def my_create_board():
return np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])
# 盤面上の空きマスをすべて取得する
def my_possibilities(board):
l = []
for i in range(len(board)):
for j in range(len(board)):
if board[i][j] == 0:
l.append((i, j))
return l
# プレイヤーのマークを置く場所をランダムに選択する
def my_random_place(board, my_player):
selection = my_possibilities(board)
current_loc = random.choice(selection)
board[current_loc] = my_player
return board
# 行がそろっているかチェックする
def my_row_win(board, my_player):
for x in range(len(board)):
win = True
for y in range(len(board)):
if board[x, y] != my_player:
win = False
continue
if win == True:
return win
return win
# 列がそろっているかチェックする
def my_col_win(board, my_player):
for x in range(len(board)):
win = True
for y in range(len(board)):
if board[y][x] != my_player:
win = False
continue
if win == True:
return win
return win
# 斜めがそろっているかチェックする
def my_diag_win(board, my_player):
win = True
for x in range(len(board)):
if board[x, x] != my_player:
win = False
return win
# ゲーム全体の勝敗を評価する
def evaluate_game(board):
my_winner = 0
for my_player in [1, 2]:
if (my_row_win(board, my_player) or
my_col_win(board, my_player) or
my_diag_win(board, my_player)):
my_winner = my_player
if np.all(board != 0) and my_winner == 0:
my_winner = -1
return my_winner
# ゲームを開始するメイン関数
def my_play_game():
board, my_winner, counter = my_create_board(), 0, 1
print(board)
sleep(2)
while my_winner == 0:
for my_player in [1, 2]:
board = my_random_place(board, my_player)
print("Board after " + str(counter) + " move")
print(board)
sleep(2)
counter += 1
my_winner = evaluate_game(board)
if my_winner != 0:
break
return my_winner
# ドライバーコード
print("Winner is: " + str(my_play_game()))
コードのポイント
- my_create_board():3×3のゼロ行列で空の盤面を生成します。「0」は空きマス、「1」「2」はそれぞれ2人のプレイヤーのマークを表します。
- my_possibilities():値が0のマスを座標(タプル)のリストとして収集し、配置可能な場所を返します。
- my_random_place():
random.choice()を使って空きマスから1つを無作為に選び、そこへマークを置きます。 - my_row_win() / my_col_win() / my_diag_win():行・列・斜めのいずれかが同じマークでそろっていれば True を返す勝敗判定用の関数です。
- evaluate_game():プレイヤー1と2の双方について勝敗を判定します。盤面がすべて埋まっていて勝者がいない場合は、引き分けとして -1 を返します。
- my_play_game():
sleep(2)により2秒間隔でターンを進め、各手番の後に盤面を出力しながらゲームを進行させます。
実行結果
[[0 0 0] [0 0 0] [0 0 0]] Board after 1 move [[0 1 0] [0 0 0] [0 0 0]] Board after 2 move [[0 1 0] [0 0 0] [0 0 2]] Board after 3 move [[0 1 0] [0 0 0] [0 1 2]] Board after 4 move [[0 1 0] [0 0 2] [0 1 2]] Board after 5 move [[0 1 1] [0 0 2] [0 1 2]] Board after 6 move [[0 1 1] [2 0 2] [0 1 2]] Board after 7 move [[0 1 1] [2 1 2] [0 1 2]] Winner is: 1
この例では7手目でプレイヤー1のマークが中央の列(1列目)に3つ並び、勝者が「1」と判定されました。配置は乱数に依存するため、実行するたびに盤面の展開や勝者は変わります。何度か実行して、勝利パターンや引き分け(戻り値 -1)になるケースを観察してみると、動作の理解がさらに深まるでしょう。
-
Pythonで作るコンウェイのライフゲーム:基本ルールと実装方法を徹底解説
1970年頃、イギリスの数学者ジョン・ホートン・コンウェイによって考案された「ライフゲーム(Game of Life)」は、生物の集団が見せるカオス的でありながらも秩序のある増殖の様子を表現する、シンプルな一連のルールです。盤面は「生存」セルと「死亡」セルで構成される二次元グリッドとして表現されます。 ライフゲームの基本ルール 過密(Overpopulation):あるセルの周囲に3つより多い生存セルが存在する場合、そのセルは次の世代で死滅します(OFF)。 維持(Static):周囲に2つまたは3つの生存セルが存在する場合、そのセルは次の世代でも生存し続けます(ON)。 過疎(Under
-
【Python】Tkinterで作るカラーゲーム – 30秒で文字の色を当てるGUIゲーム開発
GUIアプリケーションの開発において、Pythonの標準ライブラリ「Tkinter」は非常に人気が高く、初心者でも扱いやすいツールです。追加のインストール作業なしに使えるため、Tkinterを活用すればシンプルなGUIゲームでも手軽に開発できます。 この記事では、Tkinterを使った「カラーゲーム」の作り方を紹介します。このゲームでは、画面に表示される単語の文字色をプレイヤーが入力し、正解するたびにスコアが1点ずつ加算されます。制限時間は30秒で、使用される色は赤(Red)、青(Blue)、緑(Green)、ピンク(Pink)、黒(Black)、黄(Yellow)、オレンジ(Orange)、