LoginSignup
1
2

More than 1 year has passed since last update.

【Python】初心者がマルバツゲームをつくってみた

Last updated at Posted at 2022-09-20

はじめに

Python、Qiita、Markdown初心者ですが勉強に記事を書かせていただきました。
わたしと同じようにひとまずなにかつくりたいと思った人に読んでみてほしいです。

読んだ本

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ 森 巧尚 著

ゲームを作りながら楽しく学べるPythonプログラミング 田中 賢一郎 著

ゲーム概要

3マスx3マスの盤面に専攻がOを、後攻がXを配置していき先に1列揃えた方の勝ちです。

O | X | O
 --+---+--
 X | O | X
 --+---+--
 O | 8 | 9

盤面をつくる

board = [[(i + 1) + (j * 3) for i in range(3)] for j in range(3)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

3x3のリストをつくります。

def view():

    print(board[0][0], "|", board[0][1], "|", board[0][2], "\n", "--+---+--", "\n", \
        board[1][0], "|", board[1][1], "|", board[1][2], "\n", "--+---+--", "\n", \
        board[2][0], "|", board[2][1], "|", board[2][2])
1 | 2 | 3 
 --+---+-- 
 4 | 5 | 6
 --+---+--
 7 | 8 | 9

リストから盤面をつくります。

ゲームの核をつくる

turn = 1
symbol = "O"
# 9ターン目が終わるとループを抜ける
while turn <= 9:

    # 盤面を表示
    view()

    # ex. 1 ターン目。 O を置く場所を選んでください。
    # ex. 入力:
    print(turn, "ターン目", symbol, "を置く場所を選んでください。")
    position = input("入力:")

    # ---(中略)---

    # 奇数ターンならXに、偶数ターンならOに交代
    symbol = "X" if turn % 2 == 1 else "O"

    # 1ターン進める
    turn += 1

9ターン目が終わるとループを抜けゲーム終了へ向かいます。
view()で試合状況を表示して、OXを配置するpositionを入力します。
symbolにはターンごとにOXが交互に代入され、1ターン進みます。

マルバツを配置する

    # ex. 1 ターン目。 O を置く場所を選んでください。
    # ex. 入力:
    print(turn, "ターン目", symbol, "を置く場所を選んでください。")
    position = input("入力:")
    if position == "1":
        board[0][0] = symbol
O | 2 | 3 
 --+---+-- 
 4 | 5 | 6
 --+---+--
 7 | 8 | 9

positionに1が入力されるとboard[0][0]つまり「盤面の1」にOが配置されます。
しかしこれだけではXで上書きできたり1から9の文字列以外が入力できてしまうので、

    if position == "1" and board[0][0] == 1:
        board[0][0] = symbol

andでマスにOXがまだ入っておらず1が表示されているときだけ配置できるように条件を足し、

    else:
        print("表示されている数字を入力してください。") 
        continue

elseで1から9の文字列以外が入力されるとcontinueでやり直します。

    if position == "1" and board[0][0] == 1:
        board[0][0] = symbol
    elif position == "2" and board[0][1] == 2:
        board[0][1] = symbol
    elif position == "3" and board[0][2] == 3:
        board[0][2] = symbol
    elif position == "4" and board[1][0] == 4:
        board[1][0] = symbol
    elif position == "5" and board[1][1] == 5:
        board[1][1] = symbol
    elif position == "6" and board[1][2] == 6:
        board[1][2] = symbol
    elif position == "7" and board[2][0] == 7:
        board[2][0] = symbol
    elif position == "8" and board[2][1] == 8:
        board[2][1] = symbol
    elif position == "9" and board[2][2] == 9:
        board[2][2] = symbol
    else:
        print("表示されている整数を入力してください。") 
        continue

盤面に表示されているのは数値ですが、positionに入力されるのは文字列なので注意が必要です。

勝利条件を設定する

    win = False
    if board[0][0] == board[0][1] == board[0][2] == symbol or \ # 1行目
        board[1][0] == board[1][1] == board[1][2] == symbol or \ # 2行目
        board[2][0] == board[2][1] == board[2][2] == symbol or \ # 3行目
        \
        board[0][0] == board[1][0] == board[2][0] == symbol or \ # 1列目
        board[0][1] == board[1][1] == board[2][1] == symbol or \ # 2列目
        board[0][2] == board[1][2] == board[2][2] == symbol or \ # 3列目
        \
        board[0][0] == board[1][1] == board[2][2] == symbol or \ #左上から右下の斜め
        board[2][0] == board[1][1] == board[0][2] == symbol: # 右上から左下の斜め

        win = True # 勝利フラグをTrueにする
        break # ループを抜ける

奇数ターンのときはOが、偶数ターンのときはXが揃うと勝利フラグのwinTrueにしてbreakでループを抜けます。

ゲーム終了

view() # 盤面の最終結果を表示

if win == True:
    print(symbol, "の勝ちです。")

else:
    print("引き分けです。")

勝利フラグのwinTrueのとき、奇数ターンのときはOが、偶数ターンのときはXが勝利宣言し、
9ターン目が終わってループを抜けてきた場合は引き分け宣言をします。

完成

turn = 1
symbol = "O"
win = False

board = [[(i + 1) + (j * 3) for i in range(3)] for j in range(3)]

def view():

    print(board[0][0], "|", board[0][1], "|", board[0][2], "\n", "--+---+--", "\n", \
        board[1][0], "|", board[1][1], "|", board[1][2], "\n", "--+---+--", "\n", \
        board[2][0], "|", board[2][1], "|", board[2][2])

while turn <= 9:

    view()

    print(turn, "ターン目。", symbol, "を置く場所を選んでください。")
    position = input("入力:")

    if position == "1" and board[0][0] == 1:
        board[0][0] = symbol
    elif position == "2" and board[0][1] == 2:
        board[0][1] = symbol
    elif position == "3" and board[0][2] == 3:
        board[0][2] = symbol
    elif position == "4" and board[1][0] == 4:
        board[1][0] = symbol
    elif position == "5" and board[1][1] == 5:
        board[1][1] = symbol
    elif position == "6" and board[1][2] == 6:
        board[1][2] = symbol
    elif position == "7" and board[2][0] == 7:
        board[2][0] = symbol
    elif position == "8" and board[2][1] == 8:
        board[2][1] = symbol
    elif position == "9" and board[2][2] == 9:
        board[2][2] = symbol
    else:
        print("表示されている数字を入力してください。") 
        continue

    if board[0][0] == board[0][1] == board[0][2] == symbol or \
        board[1][0] == board[1][1] == board[1][2] == symbol or \
        board[2][0] == board[2][1] == board[2][2] == symbol or \
        \
        board[0][0] == board[1][0] == board[2][0] == symbol or \
        board[0][1] == board[1][1] == board[2][1] == symbol or \
        board[0][2] == board[1][2] == board[2][2] == symbol or \
        \
        board[0][0] == board[1][1] == board[2][2] == symbol or \
        board[2][0] == board[1][1] == board[0][2] == symbol:

        win = True
        break

    symbol = "X" if turn % 2 == 1 else "O"

    turn += 1

view()

if win == True:
    print(symbol, "の勝ちです。")

else:
    print("引き分けです。")

おわりに

ここまで読んでくれてありがとうございます。
きっとこれよりシンプルなコードがあるのでみなさんもつくってみてください。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2