はじめに
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()
で試合状況を表示して、O
やX
を配置するposition
を入力します。
symbol
にはターンごとにO
とX
が交互に代入され、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
でマスにO
やX
がまだ入っておらず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
が揃うと勝利フラグのwin
をTrue
にしてbreak
でループを抜けます。
ゲーム終了
view() # 盤面の最終結果を表示
if win == True:
print(symbol, "の勝ちです。")
else:
print("引き分けです。")
勝利フラグのwin
がTrue
のとき、奇数ターンのときは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("引き分けです。")
おわりに
ここまで読んでくれてありがとうございます。
きっとこれよりシンプルなコードがあるのでみなさんもつくってみてください。