pythonで作ったオセロのバグがとれたので紹介を

gistc271b1ad2371d767293f8196490f458e

ちゃんと解説出来てなかったし、バグがあったので出直してきたよ。

丁寧に説明していこう

まず1行目。これはutf-8っていう文字コードで書かれてるよっていう宣言だ。このおかげで文字化けが起きないで済む。(文字化けが起きると読めないどころか動かない)

2行目。意味ない行。ファイル名書いとくメモ。これもだけど#以降はpythonは読まない。一行目はpythonは読む。詳しくは1行目をコピペしてggると分かった気になれる。

 

4.5行目。外部にあるパッケージとかいうやつに使いたい機能があるんで呼び出す行。pythonに標準でついてるやつだけど、ネットから拾ってきてもいいし、自分で作ったやつを呼び出してもいい。

 

7行目からmain()関数とかいう物を定義している。一番下の最後の2行はその定義したmain()関数を読み込むっていう行なんだけど、ぶっちゃけこんな面倒なことはしないでmain()の中だけ書いても動く。ただ、もっとでかい物を書くとき、この書き方じゃないと死ぬことがあるからこうしてる。こうするとmain()の他にも関数を定義して綺麗に出来たりする。

 

次の行から本番だ。

 

8行目。これは入力する主体がコンピュータが画面の前の君かを決める為に作った変数だ。実はオセロは2人用ゲームなんだが、プレイヤーを二人見つけるのは大変なので、片方(若しくは両方)をコンピュータに任せることが出来る。86行目で使ってる。

input()っていうのは()の中の物を画面に表示させて、プレイヤーが入力した文字列を返す関数だ。これをint()という文字列とかを整数に変える関数を通して変数に入れている。

 

9行目。while True: ってのは要は無条件で繰り返せ、っていう命令文だ。breakとかして脱出しないと永遠にループする。

 

10行目から21行目は変数を定義している。utf-8っていうのは、ローマ字と日本語文字を区別しない。だから日本語の変数なんかを置いてしまうこともできる。分かりやすいだろ?(入力は最高に面倒だが)

 

盤面という変数はリスト変数、それも2次元リストといってリストを格納しているリストだ。変数は普通は一つのものしか入れられないがリスト変数は順番に沢山のものを入れられる。しかも中身を前から何番目といった風に指定して引っ張ってくることも可能だ。一番最初の数字は盤面[0][0]という風にだ(0から始まる)。

この盤面という変数には0.1.-1.(このあと登場する)2の4種類しか入らないことになっている。それぞれの数字の意味を説明しよう。0、これは何も駒が置かれていないという意味。1は黒い駒が置かれていることを意味し、18行目のターンという変数も同様である。-1は白い駒が置かれていることを意味している。なんで2ではなく-1なのかというと*-1でひっくり返す処理を意味することが出来るからだ。それ以上の理由はない。

2は置くことのできるマスを意味している。0の中で2に合致する奴を2にする処理が26行目から始まる。

この盤面という変数、やけにかさばる表記をしているが、これは単に見たままの分かりやすさを重視しているからである。改行しているのもそのためである。

実はよりスマートに2行で書く方法もあり、それだと盤面の大きさも変えることができるのだが、今回は採用を見送った。

 

ターンという変数はそのとき、白のターンなのか黒のターンなのかを示す為の変数だ。黒なら1、白なら-1なのは盤面と同じである。

 

マスという変数は、盤面がそのままだと意味が分かりにくいので、分かりやすいように文字に置き換えるための変数だ。〇と-1、×と0、●と1、☆と2が関連してるのは分かるだろう。しかし、リストは0から始まるので、この変数を使うときは+1して使うことになっている。

この’’でくくられたものが文字列となってそのまま出てくるようになる。’’が無いと変数として扱われてしまう

 

勝利という変数は、白も黒も置けなくなったときに試合終了して勝利判定をするための変数である。26行目の置けるかという変数と連動しているのだが、一つの変数でもいいような気がするが、ちょっとこんがらがってしまったので、このままにしている。勝利が2になったら試合終了になる。

 

符号という変数は周囲八方向をいみする変数である。オセロのひっくり返す処理のときに、これを足したり引いたりして使う。

 

23行目からこのオセロの核心で、ここを何度も繰り返すことでゲームが進んでいくのだが、結構長くなってしまったので一旦区切ろうと思う。