プログラミングは言葉で表現できる形に落とし込むこと
オセロゲームを作ろうと思ったら、まずは8×8の盤面が必要です。全部で64個のマス目があるわけです。
マス目の位置を表すために、横方向をXとして1〜8の数字で表現し、縦方向はYとして1〜8の数字で表現することにしました。一般的にオセロの横軸は a〜h で表すことが多いようですが、プログラミングを勉強する上では、数字の方が理解しやすいので、横も縦も同じ1〜8で表現するように作ってあります。
子供に教えるために作ったオセロゲームのメインプログラムはたったのこれだけです。
前回の記事で書いたように、プログラムの基本は、制御文と、条件文と、繰り返し文だけです。このオセロもこの3つを駆使して作ってあります。以下のプログラムについて説明していきましょう。
オセロゲームのメインプログラム
if __name__ == '__main__':
# オセロクラスのインスタンスを作成
myot = OthelloCls()
# 盤面の表示
myot.ot_display()
# 永久に繰り返す
while True:
# ゲームが終わったか、自分の手を置く場所があるか判断する
sts = myot.ot_checkendofgame()
if sts == 1: # ゲーム終了
break
elif sts < 0: # 自分の手は置けない
continue
# 誰のターンかを表示する関数を呼ぶ
myot.ot_yourturn()
# X座標とY座標を入力する
myx = myot.ot_inputXY("X = ")
myy = myot.ot_inputXY("Y = ")
# 指定座標に手を置く
myot.ot_place(myx,myy)
メインプログラムの開始
if __name__ == '__main__':
の宣言によって、ここから以下のインデントがメインプログラムであることを表しています。メインプログラムのブロックはインデントを下げる必要があるので、スペース4つでインデント下げが行われ、プログラムが記述されます。
メインプログラムの説明
最初にプログラムを実行するとこのような画面が表示され、キーボード入力待ちになります。
プログラムの1行目ではオセロクラスのインスタンスを実体化しています。オセロクラスと言うのは、オセロに必要な機能の各種が詰まったものとでも思ってもらえば間違いありませんが、詳細については後述するのでご安心ください。
一番最初の状態のオセロの盤面を画面に表示します。これは ot_display()
という関数を呼び出すと呼び出した時の状態の盤面を表示してくれるものです。
メインのプログラムでは、whilt True:
の部分で永久に繰り返すことから始まります。
オセロゲームは交互に白と黒が手を打っていきますが、やがてどちらかの手が置けなくなったり、両者の手が置けなくなる時もやってきます。
この永久の繰り返しから抜ける条件はただ1つ、ゲームが終了したと判断した場合だけです。ot_checkendofgame()
という関数が永久の繰り返しの中での次の動作をチェックする役割を担います。この関数から戻された値によって、次の行動が決まります。
関数からの戻り値 | 意味 | 次の動作 |
---|---|---|
0 | 自分の手が置けるので継続 | キーボードからどこに置くかXとYの座標入力に進みます |
1 | ゲーム終了 | 永久の繰り返しから脱出する |
-1 | 自分の手は置けないので相手の手に変わった | 永久の繰り返しの先頭に戻る |
上記の通り、関数の戻り値が 0 だった場合は、ot_yourturn()
という関数が「●の手です!」とか「○の手です!」など誰の番かを表示しています。
次に、キーボードからどこのマス目に置くかをXで1〜8のいずれか、Yで1〜8のいずれかを入力します。
ot_inputXY("X = ")
という関数は1〜8以外の値を受け付けないキーボード入力を行う関数で、パラメータとして X= または Y= を指定することでキーボード入力を1つの関数として実装してあります。上図の X= 6 , Y= 5 の部分がまさにこの関数で行われています。
最後にot_place(myx,myy)
という関数に、キーボードから入力されたX座標の数字と、Y座標の数字を渡してコマを置くよう指示します。
オセロのプログラムはたった5つの関数を呼べば立派にオセロゲームとしてプレイできるものが完成してしまうのです。プログラムの種類では、画面表示系、入力系、プログラムのロジック系と分かれています。将来的にグラフィカルなそれらしいオセロゲームに進化させるために、敢えてクラスの中で画面表示部分や入力系と、ロジック部分を分離した作りになっています。
オセロゲームを作るための関数 | プログラムの種類 | やっていること |
---|---|---|
ot_display() | 画面の表示 | オセロの盤面を表示する |
ot_checkendofgame() | ロジック | 永久の繰り返しの中での次の行動を教えてくれる |
ot_yourturn() | 画面の表示 | 誰の番かを表示する |
ot_inputXY() | キーボード入力 | コマを置く場所を指定するための座標入力を行う |
ot_place() | ロジック | 入力された座標にコマを置く |
メインプログラムの中での Python の勉強
繰り返し文には二種類ある
繰り返し文には前回の記事で軽く触れたように2種類あります。1つは永久に回る繰り返し文。もう1つは回る回数が分かっている繰り返し文です。以下の図では永久に繰り返すタイプでは何らからの繰り返しから抜け出すイベントが発生すると、繰り返しから脱します。もう一方は最初から10回腹筋すると決めたら、10回やったら終わるという繰り返しのパターンです。Python では永久の繰り返しは while True:
と記述します。この while True:
の下のインデントブロックは、何らかのイベントが発生しない限り永久に繰り返されることになります。永久の繰り返しの中で、先頭に戻ることを continue
と書き、永久の繰り返しから脱出するのは break
と書きます。以下の図で言えば「おやつ?」がYesの場合は break
と書き、そうじゃない場合は continue
と書きます。メインプログラムの中では、永久に繰り返すブロックの途中で、繰り返しの先頭に戻りたい場合に continue
と書いていますが、ot_place()
を呼んだ後ではわざわざ continue
は書きませんが繰り返しブロックの最後の行なので関数から戻ってきたら自動的に繰り返しの先頭に戻っています。
この2つを Python ぽく書いてみるとこんな感じになります。for の使い方は次回に詳しく書きますね。
while True:
勉強()
if おやつ=="Yes":
break
for index in range(10):
腹筋()
条件の判定
条件の判定を行うには if 条件:
を使います。条件に合致したロジックはインデントを下げたブロックに記述し、条件に合致しない場合のロジックは else:
または elif:
の下からインデントを下げて記述します。先ほどのメインプログラムを見てみましょう。ot_checkendofgame() という関数からの戻り値を sts という変数に格納しています。次の if 文で sts が 1 かどうか判定し、1 であれば brek を使って永久ループから脱出しています。elif は最初の条件に合わない場合の次の条件文で sts が 0 より小さいか判定して条件に合致すれば continue で永久の繰り返しの先頭に戻っているのがわかりますね。
sts = myot.ot_checkendofgame()
if sts == 1: # ゲーム終了
break
elif sts < 0: # 自分の手は置けない
continue
条件判定に使う記号 | 使い方 | 説明 |
---|---|---|
等号 == | if sts == 1: | sts が 1 と等しい |
不等号 != | if sts != 1: | sts が 1 と等しくない |
大なり > | if sts > 1: | sts が 1 より大きい(2以上) |
小なり < | if sts < 1: | sts が 1 未満(0以下) |
大なり等号 >= | if sts >= 1: | sts が 1 以上 |
小なり等号 <= | if sts <= 1: | sts が 1 以下 |
というわけで、次回は実際のプログラムの実行と、Python で使う変数というものについて軽く説明していきたいと思います。
<<Python3 を子供に教えるためにオセロを作ってみた(1)
Python3 を子供に教えるためにオセロを作ってみた(3)>>