マイクロソフトを創業したビルゲイツが13歳の時に初めて書いたプログラムはマルバツゲームだったと言われています。
今回はそんな入門に最適な題材を、Pythonの基本的な文法のみを使ってプログラミングしてみましょう。
本記事について
本記事を一通り読むことで、マルバツゲームのプログラムを書きながら、Pythonを含むプログラミングの基本的な知識を得ることができます。
プログラミングとは
プログラミングとは、コンピュータにやってほしいことを伝えるための方法です。コンピュータは素晴らしい速度で計算できますが、命令がない限り何もしません。そこで私たち人間はプログラムを書くことによってコンピュータにやってほしいことを伝える必要があるのです。ウェブサイトを作ったり、今回のようにゲームを作ることもできるプログラミングは、まるで魔法のような技術です。
Pythonとは
Pythonとは、そんなプログラムを書くためのプログラミング言語の一つです。Pythonで書かれたプログラムはインタプリタによって0と1からなる機械語に翻訳され、それをコンピュータが実行してくれます。コードが読みやすいPythonはプログラミングが初めての方にも人気の言語です。
Google Colabで簡単にはじめよう
プログラミングにはIDE(統合開発環境。コードを書く専用のツール)があると便利ですが、今すぐ始めたいという方はインターネット環境だけで始められるGoogle Colabを使うのがおすすめです。
https://colab.research.google.com/
マルバツゲームのルール
- 二人のプレイヤ⭕️と❌が、3×3の盤面に交互に⭕️と❌を書いていきます
- タテ・ヨコ・ナナメのいずれか3列を先に揃えた方の勝ち。もし両者揃わなかった場合は引き分け
それではさっそく始めましょう!
1. 変数current_playerに現在のプレイヤを格納
- マルバツゲームは、○と×の番が交互にやってきます。そこで、今どちらの番なのかを記録しておくために、変数を用意しましょう。
- 変数というのは箱のようなものです。箱の名前は
current_player
とし、箱の中に最初は"○"
を入れておきます。○からターンが始まるからです。
current_player = "○"
=
は、プログラミングにおいては数学のイコールとは異なり、右のものを左に代入するという意味です。なのでこの場合current_player
に"○"
という文字列を入れているのです。
- 文字列というのは、文字が並んだもののことで、
""
で囲んで表現します。仮に""
をつけないで○
とだけ書くと、コンピュータはそれを箱の名前(変数名)と勘違いしてしまうので、それと区別しているのです。
- なお、続けて仮に
current_player = "×"
このように書くと、元々"○"
が入っていた変数current_player
に、今度は"×"
という文字列を入れ替えたということになります。
2. 変数turnに現在のターン数を格納
- マルバツゲームは、どちらかが勝つことによってもゲームは終了しますが、勝者が決まらなかった場合でも、全てのマスが埋まったら引き分けとなり、やはりゲームは終了します。
- この「引き分け」を実装するために、今何ターン目かを追っていくことにします。9ターン目になったら引き分けです。変数
turn
を用意し、今後、この中身が9
になるまで毎ターンの始めに1を足していくことにします。 - ターンが始まる前の現時点においては、整数値
0
を代入しておきます。
turn = 0
クイズ❶Pythonの柔軟な変数
年齢を表す変数を作り、その変数にあなたの年齢の整数値を代入してください。次に、同じ変数に、年齢を英語で表した文字列を入れ替えてください。
(例)
age = 16
age = "sixteen"
- 実は、このように、整数値が入っている箱に文字列を入れ替えることができるのは、Pythonが柔軟な言語だからです。Pythonのような、箱の種類が動的に変化することができる言語のことを動的型付け言語といいます。
- 一方、例えばCのような静的型付け言語では、整数値用の箱に文字列を入れ替えるということはできません。一度整数値用に作った箱はそのまま静かに変わらないのです。このような言語では、変数を作るときにも、どの種類の箱なのかを明記する必要があります。
(例)
int age = 16; // 整数値用の箱であることを「int」と最初に明記する必要がある
age = "sixteen"; // これはエラーになる
クイズ❷色々な値
これまで、文字列と整数値という二種類の値が登場しました。
これらは見た目が似ていても別々のものです。例えば、整数値同士の足し算1 + 1
をすると2
になりますが、文字列同士の"1" + "1"
は"2"
ではなく、文字列同士が結合して"11"
になります。
以上を踏まえて、以下の変数a
とb
それぞれの中身を予想してください。
hello = 11
kitty = 1
a = hello + kitty
b = "hello" + "kitty"
a
の中身は12
b
の中身は"hellokitty"
なお、文字列と整数値は別々の値ですが、例えば”11″を11に、逆に11を”11″にしたい時はそれぞれ
int("11")
str(11)
のように書きます。int
は整数値を意味するinteger、str
は文字列を意味するstringの略です。
3. boardリストで盤面を表す
- 次は⭕️と❌を書き込むための盤面を用意しましょう。盤面を表現するのにここではリストを使います。リストとは番号付きのロッカーのようなもので、複数の要素を順番に並べてまとめておくことができます。
- マルバツゲームは最初は全て空欄になっている状態からスタートするので、以下のように書きます。このリストを
board
リストと呼ぶことにします。
board = [
"𝟶", "𝟷", "𝟸",
"𝟹", "𝟺", "𝟻",
"𝟼", "𝟽", "𝟾"
]
"0"
から"8"
までの数字の文字列で空欄を表すことにします。各要素を,
で区切り、[ ]
で囲むことで一つのリストとしてまとめています。- リスト内の各要素には自動的にインデックスと呼ばれる番号が付きます。インデックスは
0
から始まり、これを変数名[インデックス]
のように囲むことでリスト内の各要素を指し示すことができます。たとえばboard[4]
は"4"
を指し示します。
この"4"
を"○"
に入れ替えたい場合は、
current_player = "○"
board[4] = current_player
このように書くことで、現在のプレイヤである○が、真ん中の4番の位置を選んだということになり、board
の中身は
[
"𝟶", "𝟷", "𝟸",
"𝟹", "○", "𝟻",
"𝟼", "𝟽", "𝟾"
]
このように変化します。
クイズ❸リストの基本
board = [
"○", "1", "x",
"3", "○", "○",
"𝟼", "𝟽", "x",
]
このようなリストにおいて、board[3]
は何を指すでしょうか。
また、"𝟽"
のインデックスはいくつでしょうか。
board[3]
は"x"
"𝟽"
のインデックスは7
4. print関数 & f-stringで盤面を表示
- 準備編の最後として、初期状態の盤面を表示しましょう。
これは、
print(f" {board[0]} │ {board[1]} │ {board[2]} ")
print("───┼───┼───")
print(f" {board[3]} │ {board[4]} │ {board[5]} ")
print("───┼───┼───")
print(f" {board[6]} │ {board[7]} │ {board[8]} ")
このように書くことで表示できます。
print
というのは、文字列を画面に表示してくれる関数です。関数についてはのちに学びますが、要は( )
の中に表示して欲しい文字列を書いておけばそれを表示してくれる機能なのです。
- 今回使われているのは
""
の前にf
を置くf-stringという便利な文字列です。f-stringは、文字列中の変数を{ }
で囲うことで、変数の中身を文字列に組み込めるようになります。
# f-stringの例
your_name = "太郎"
print(f"こんにちは、{your_name}!") # こんにちは、太郎!
- ターン開始前においては、
board[0]
からboard[8]
までの中にはそれぞれ”0”
から”8”
が格納されていましたから、上のコードはこの時点では
print(" 𝟶 │ 𝟷 │ 𝟸 ")
print("───┼───┼───")
print(" 𝟹 │ 𝟺 │ 𝟻 ")
print("───┼───┼───")
print(" 𝟼 │ 𝟽 │ 𝟾 ")
と同じことになります。コードを見比べて確認してみてください。
クイズ❹Pythonの柔軟なprint関数
current_player = "○"
turn = 0
board = [
"𝟶", "𝟷", "𝟸",
"𝟹", "𝟺", "𝟻",
"𝟼", "𝟽", "𝟾"
]
print(current_player)
print(turn)
print(board)
それぞれどのように表示されるでしょうか。
○
0
['𝟶', '𝟷', '𝟸', '𝟹', '𝟺', '𝟻', '𝟼', '𝟽', '𝟾']
このようにPythonのprint
関数は柔軟で、文字列以外の値であっても自動的に文字列に変換して表示してくれるようになっているのです。
- ここまでを一旦組み合わせてみます。
current_player = "○" # 現在のプレイヤー
turn = 0 # 今何ターン目か
board = [ # 盤面(リスト)
"𝟶", "𝟷", "𝟸",
"𝟹", "𝟺", "𝟻",
"𝟼", "𝟽", "𝟾"
]
print(f" {board[0]} │ {board[1]} │ {board[2]} ") # 最初の盤面を表示
print("───┼───┼───")
print(f" {board[3]} │ {board[4]} │ {board[5]} ")
print("───┼───┼───")
print(f" {board[6]} │ {board[7]} │ {board[8]} ")
- この時点で実行すると、
このように、最初の盤面が表示されました!
- これでゲームを開始するための準備は完了です。次は繰り返すターン内の処理を実装しましょう。