Pythonでマルバツゲームを作ろう!(コンソール版)

自分でマルバツゲームを作ってみたい!!

この記事はこんな方におすすめ!

・Pythonを基本的な構文は学んだけれど、次に何をすればいいかわからない方

・マルバツゲームがやりたい

・pythonでプログラムを作りたい

初学者におすすめ!Pythonで作ってみよう

「Pythonでできることを調べてみても、AIやアプリ開発など難しそうなのばかりでハードルが高そう・・・」

「そもそも何ができるんだろう・・・」

プログラミング学習でおすすめされたプロラミング言語「Python」の基礎構文をとりあえず勉強してみたけど、次に何をすればいいかわからないという方も多いのではないでしょうか。

そこで、何をしたらいいか困っている方にオススメは

  • ゴミ回収の日を教えてくれる
  • 明日の天気を教えてくれる
  • お気に入りのHPが更新されたか教えてくれる
  • ルンバがアプリで設定したタイマーで掃除を初めて、完了したか教えてくれる

など、自分があったら便利だなと思うものを作ることで、Pythonへの理解を深めていくことをおすすめします!

Pythonでマルバツゲームを作ろう!

今回はコンソールで動くマルバツゲームのプログラムについて解説します。初学者の人にとって実際にプログラムをどのような立て付けで作っていくかを考えるうえでマルバツゲームはシンプルなルールなので良い題材だと思います。

是非、プログラムの解説を確認する前にでご自身でも一度考えてみることをお勧めします!

マルバツゲームのルール

プレイヤーは交互にマスを選択して、先に縦、横、斜めのいずれかで3つ並べた方が勝ちとなります。

プログラムのざっくりとした立て付け

マルバツゲームのプロググラムはざっくりと下記のような手順で実装することを考えてみます。

マルバツを書き込むリストを作ります
board = [' ' for _ in range(9)]
ボードを出力する関数を作成する
def print_board():
    #3✖︎3で出力する
勝利判定関数を作成する
def is_winner(symbol):
    #縦、横、斜めの列いずれかが同じシンボル → 勝利判定としてTrueを返す
    return True 
    #縦、横、斜めの列でシンボルが異なる → ゲーム継続としてFalseを返す
    return False 
player1とplayer2がゲームが終了するまで交互にマルバツを位置を指定する
def play_game():
    player1 = 'X'
    player2 = 'O'
    
  #交互にシンボルの位置を指定し、ボード情報を出力する。その際、勝利条件を満たしてるか判別し、ゲームが終了するかを判断する。

上記、までの情報を参考にしてマルバツゲームを実装してみましょう。

マルバツゲームのプログラムを解説

ここから、実際にマルバツゲームのプログラムを解説していきす。

プログラム詳細

#3x3=9の空マスを生成
board = [' ' for _ in range(9)]

#ボード情報を出力
def print_board():
    row1 = f"|{board[0]}|{board[1]}|{board[2]}|"
    row2 = f"|{board[3]}|{board[4]}|{board[5]}|"
    row3 = f"|{board[6]}|{board[7]}|{board[8]}|"
    
    print(row1)
    print(row2)
    print(row3)

#勝利条件を満たしているかを判定
def is_winner(symbol):
    # horizontal
    if board[0] == symbol and board[1] == symbol and board[2] == symbol:
        return True
    if board[3] == symbol and board[4] == symbol and board[5] == symbol:
        return True
    if board[6] == symbol and board[7] == symbol and board[8] == symbol:
        return True
    # vertical
    if board[0] == symbol and board[3] == symbol and board[6] == symbol:
        return True
    if board[1] == symbol and board[4] == symbol and board[7] == symbol:
        return True
    if board[2] == symbol and board[5] == symbol and board[8] == symbol:
        return True
    # diagonal
    if board[0] == symbol and board[4] == symbol and board[8] == symbol:
        return True
    if board[2] == symbol and board[4] == symbol and board[6] == symbol:
        return True
    
    return False

#メインプログラム
def play_game():
    player1 = 'X'
    player2 = 'O'
    current_player = player1
    
    while True:
        #ボード情報を出力
        print_board()
        #シンボルの位置を入力
        position = int(input(f"Enter a position (1-9) for player {current_player}: ")) - 1
        #指定した位置が空マスの場合
        if board[position] == ' ':
            board[position] = current_player
            #勝利条件を満たしている場合は、現在のプレイヤーが勝者になる
            if is_winner(current_player):
                print_board()
                print(f"Congratulations! Player {current_player} wins!")
                break
            #空マスがなくなると引き分け
            elif ' ' not in board:
                print_board()
                print("It's a tie!")
                break
            #どれでもない場合は、プレイヤーの交代
            else:
                current_player = player2 if current_player == player1 else player1
         #指定した位置が空マス出ない場合、再度入力を促す
        else:
            print("That position is already occupied. Please try again.")

play_game()

プログラムの実行結果

このコードを実行すると、次のような動作することができます。

| | | |
| | | |
| | | |
Enter a position (1-9) for player X: 1
|X| | |
| | | |
| | | |
Enter a position (1-9) for player O: 5
|X| | |
| |O| |
| | | |
Enter a position (1-9) for player X: 6
|X| | |
| |O|X|
| | | |
Enter a position (1-9) for player O: 7
|X| | |
| |O|X|
|O| | |
Enter a position (1-9) for player X: 8
|X| | |
| |O|X|
|O|X| |
Enter a position (1-9) for player O: 9
|X| | |
| |O|X|
|O|X|O|
Enter a position (1-9) for player X: 1
That position is already occupied. Please try again.
|X| | |
| |O|X|
|O|X|O|
Enter a position (1-9) for player X: 2
|X|X| |
| |O|X|
|O|X|O|
Enter a position (1-9) for player O: 1
That position is already occupied. Please try again.
|X|X| |
| |O|X|
|O|X|O|
Enter a position (1-9) for player O: 3
|X|X|O|
| |O|X|
|O|X|O|
Congratulations! Player O wins!

このように、上記のプログラムを実行するとコンソール上でマルバツゲームをプレイすることができます。

プログラムの解説

盤面はboardというリストに保持され、空白は' '、プレイヤー1が'X'、プレイヤー2が'O'として表されます。print_board()関数は、現在の盤面を表示し、is_winner()関数は、指定されたシンボルが現在の盤面で勝利しているかどうかを判定します。play_game()関数は、交互にプレイヤーがマスをinput関数を用いて選択し、盤面のリストに'X'’O'を書き込みます。これを勝者が決まるまでwhile文で繰り返し、マスの指定を行います。勝者が決まるか、引き分けとなった場合はbreakwhile文のループから抜け出し、プログラムを終了させます。

以上、Pythonでマルバツゲームを作ろう!(コンソール版)のプログラムの解説でした。ゲームとしては簡単なマルバツゲームですが、いざプログラムで実装しようとすると色々と考えることがありましたよね。こういった簡単な題材でプログラムをご自身で考えてみるとプログラム構築する訓練になりますので、初学者の方はぜひやってみて下さいね。

ゲーム作りは楽しいね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA