pythonでオセロ(8×8)を作る方法 応用編
おはようございます!にわこまです。今回はpythonでオセロを(8×8)よりゲームっぽく作ってみました。
何かご指摘があればご連絡ください!
スポンサードサーチ
pythonでオセロを作る方法
今回は「pythonでオセロ(8×8)を作る方法」のオセロをグラフィカルに見やすくしてみました。
「pythonでオセロ(8×8)を作る方法」では、コマンドプロンプトでプレイするオセロでしたが、今回はウィンドウを生成してそこでプレイできるようにしました。
pythonでゲームを作るときに使われる「pygame」を使用しました。
約670行でプログラムを書くことができました。
また、「盤面が全て埋まる」、「両者pass」、「反則」の3つ状態によって、結果の言葉を変えなくてはいけません。
よって、プログラムが長くなってしまいました。 「pythonでオセロ(8×8)を作る方法 応用編」のコードはこちらに全て載せてあります。
アルゴリズム
「盤面が全て埋まる」、「両者pass」、「反則」の3つ状態によって、言葉を変えるアルゴリズムについて解説します。
アルゴリズム
1. 状態ごとに言葉を決める
2. 1で決めた言葉をウィンドウに表示する
3. 2の状態で画面をクリックすると盤面のみが表示される
状態毎に関数をつくり、文字列を返却するように設定しました。
しかし、返却する文字列がバラバラであると問題があったため無理やり4つの文字列になるように調整しました。
スポンサードサーチ
コード
コードはこちらに全て載せてあります。
開発環境
OS : Windows 10
CPU : intel CORE i7 7th Gen
python : 3.7
プログラムを書くにあたって、インポートしたものを紹介します。
・numpy
・random
・copy
・pygame
・QUIT, MOUSEBOTTOMDOWN(pygame)
・sys
・floor(math)
今回、定義した関数は以下の17つです。
・stone_location(stone)
・empty_location(stone_list)
・bw_turn(TURN)
・update_field(TURN, point, offset_list)
・address2point(address)
・point2offset(point, TURN)
・address_check(point, TURN)
・point2address(point)
・show_result()
・draw_stone(SURFACE, field)
・player_turn()
・computer_turn()
・draw_info(string_one, string_two, string_three, string_four)
・draw_result()
・draw_pass()
・draw_foul()
・main()
今回定義したグローバル変数は以下の通りです。
# define
global EMPTY
EMPTY = 0
global BLACK
BLACK = 1
global WHITE
WHITE = 2
global Player
global Computer
global TURN
global field
field = np.array([[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,2,1,0,0,0],
[0,0,0,1,2,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]])
global field_address
field_address = np.array([["a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"],
["a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2"],
["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"],
["a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4"],
["a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5"],
["a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6"],
["a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7"],
["a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"]]) # 4
global offset
offset = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1)]
global SURFACE
global FPSCLOCK
今回定義した関数の内、上から9つに関しては説明しません。
同様に定義したグローバル関数の内、「SURFACE」と「FPSCLOCK」以外に関しては説明しません。
説明を読みたい方は、「pythonでオセロ(8×8)を作る方法」のコードの部分で説明していますので、「pythonでオセロ(8×8)を作る方法」のページに移動してください。
定義した関数について説明します。
まず、「draw_stone(SURFACE, field)」について説明していきます。この関数は、石の配置を表示する関数です。
「draw_stone(SURFACE, field)」は引数にウィンドウの情報と配列によって表現された盤面を代入します。
次に、「player_turn()」と「computer_turn()」について説明します。この2つの関数は、石を打つ場所を決める関数です。
「player_turn()」は、石を打ちたいマスをクリックすることで、そのマスを選択することができる関数です。
「a1」や「d4」などの文字列を返却します。
「computer_turn()」は、プレイヤーが打った手に対応して更新された盤面を表示する関数です。
この関数がないと、プレイヤーが手を打った後すぐにコンピュータの手が更新されてしまうため、この関数を定義しました。
次に、「draw_info(string_one, string_two, string_three, string_four)」について説明します。この関数は、4つの文字列を表示する関数です。
「draw_info(string_one, string_two, string_three, string_four)」は、引数に4つの文字列を代入します。
1番上に表示したい文字列から順に左から代入します。 この関数によって表示されているウィンドウをクリックすると文字が消えます。
次に、「draw_result()」、「draw_pass()」、「draw_foul()」について説明します。この3つの関数は、結果を表示する関数です。
「draw_result()」は、盤面に石が全て埋まっている状態で対局が終了したときに動作します。また、その結果を表示します。
「draw_pass()」は、両者がpassを選択して、盤面に石を打つことができなくなったときに動作します。また、その結果を表示します。
「draw_foul()」は、主にプレイヤーが反則の手を打ったときに動作します。また、勝者と反則者を表示します。
次に、「main()」についてですが、「main()」の中身については、複雑であるため解説しません。
定義したグローバル関数について説明していきます。
まず、「SURFACE」について説明します。このグローバル変数は、ウィンドウのサイズを定義しています。
また、後々ウィンドウの背景を設定したり、文字を表示したり、図を表示したりします。
次に、「FPSCLOCK」について説明します。このグローバル変数は、フレームレートを定義します。
フレームレートとは、「FPS」のことであり「Frame Per Second」です。
「1秒間に静止画(frame)を何回表示するか」を設定するための変数です。
使い方
コードは全てこちらに載せてあります。
手順
(1) pythonのプログラムを任意の名前で保存して下さい。
(2) ご自身のパソコンでコマンドプロンプトを起動してください。
(3) コマンドプロンプト上で保存したフォルダまで移動してください。
(4) 「python othello.py」と入力し、エンターを押してください。(othello.pyと保存した場合)
(5) 以上でオセロをプレイできます。
注意
・コンピュータの手番のとき、ウィンドウをクリックすると次に進みます。
・passは自動で選択されます。
・手順(4)におけるコマンドで、pathの設定などにより「python」の部分を「python3」に変えないと実行できない場合もあります。
スポンサードサーチ
まとめ
今回はpythonを使って(8×8)のオセロをゲームっぽく仕上げてみました。
コマンドプロンプトでプレイするものよりも見やすく、使いやすいものに出来上がっていると思います。
pythonでゲームをつくるにあたって「pygame」を使いましたが、pythonには他にもゲームを作ることができるライブラリがあります。
「tkinter」、「kivy」、「arcade」など
pythonでゲームを作りたい人はこれらを調べてみてください。
最後までお読みいただきありがとうございます。
スポンサードサーチ