こんにちは。ヒトツメです。
前回に引き続き、Python 3についての記事を投稿していこうと思います。
前回は、Anacondaを使って Pythonを使える環境を作り、「Hello World!」が成功しました。
初めから一つ一つ構文などを覚えていってもいいのですが、折角なので、楽しみながら学習を進めていくべく、さっそく色々と作っていきたいと思います。
とはいえ初めから難解なデータ分析などをすることは難しいので、楽しみながらできることをやっていき、自然と言語の特性などを覚えていく方が良いと思います。
何故オセロなのか?
そこで、今回から複数回に分けて、オセロの作り方についてみていきたいと思います。
なぜオセロなのか?という疑問もあると思いますが、様々なプログラミング言語を学ぶ際、オセロを作ってみると、学習が一気に進みやすいといわれています。
理由はいくつかありますが、一つ目はルールが単純で誰もが知っているため、作る目標の確認に時間がかからないという点です。データ分析などを行う場合、そもそも分析として何をしなければならないか、ということから学んでいかなければなりません。それだと、学習をし始める前に挫折する人が続出してしまいます。
オセロのように、誰もがルールを知っているものであれば、学習コストが低く、前提知識を身に付ける間に挫折するリスクが大幅に低減できます。
二つ目は、リストやFor~Next処理など、作るためには一通りの知識を身に付ける必要があるという点です。作るのがある程度簡単な一方で、簡単すぎないため、作り終えるころにはある程度の知識が身に付いていることが予想されるということです。
また、拡張性が高いというのも非常に魅力的なポイントです。場合によっては、簡単なAIを構築して、CPUを作るといったことにも使えるため、作り終えた後さらに学習を進めることができます。
- オセロは誰もがルールを知っており、前提知識の学習コストが低い
- 完成する頃には必要最低限の知識が一通り身に付いていることが期待できる
- 更なる分野の学習のための前提とすることもできる
最初の盤面を作る
というわけで、さっそくPythonを使って、最初の盤面を作っていきます。
ただ、初めからGUI(グラフィック・ユーザー・インターフェース)を作るのは大変なので、何らかの配列をオセロの盤面に見立てて、裏側の処理を作っていきます。
そこで、8マス×8マスの配列を作って、真ん中に白と黒を表す数値なり文字列なりを入れるという作業が必要になります。
今回は、この配列を作るにあたって、NumPyというライブラリを使います。NumPyは、数値計算を効率的に行うための拡張モジュールで、効率的な計算と多次元配列のサポートを加えます。Python単体でも、リストやタプル、辞書などの配列処理はできますが、NumPyはかなり広く使われるライブラリで、データ分析や機械学習には必須のものです。
というわけで、今回は折角なので、NumPyを使います。
import numpy as np
game = np.zeros((8, 8))
game[3][3] = 1
game[4][4] = 1
game[3][4] = -1
game[4][3] = -1
print(game)
これを実行すると、次のように結果が表記されます。
1が白、-1が黒を表しており、8×8の盤面の真ん中にきちんと石が配置されたことが確認できます。0は、まだ何も置かれていないという意味です。
ちなみに、Anacondaでは、NumPyはすでにインストールされているので、「import numpy」としてあげるだけで、NumPyが使えます。
また、NumPyに限らず、Pythonのライブラリには、様々な関数が含まれています。したがって、関数の頭に、それがどのライブラリから呼び出されるべきものなのかをつけてあげなければ、意味が分からなくなってしまいます。そのために、NumPyの関数を呼び出す際には、毎回「numpy.」とつける必要があります。
ただ、これは意外と面倒です。そこで、「np.」とつけるだけでこれを呼び出せるように、後ろに「as np」とつけています。
したがって、「np.zeros」は、NumPyの「zeros」という関数を呼び出すという意味です。NumPyの「zeros」は、引数に用いられた数値の形(今回で行けば8の長さの配列を8個重ねたもの)の配列で、そのすべてが「0」のものを作る、というものです。
このようにして作られた配列は、「[]」を使うことで、特定の部分だけを切り出すことができます。例えば「game[3]」とすると、上でいう結果のうち、4行目の部分が結果として出力されます(一番上は0行目という扱いになるため、一つずつずれます。)。4行目から7行目までは、このようにして切り出した特定の場所に、1と-1を入れ込んであげるという指示を表しています。
Pythonの配列について
ちなみに、「[]」を使って、配列の特定部分を切り出すのは、何もNumPyに限った話ではありません。リストやタプル、辞書においても、この記号を使って切り出すことができるようになっています。
一つ一つの意味や構文の解説はここでは割愛しますが、よく使うのが、「game[3:5]」といった形での、範囲を指定した切り出しです。
この時何より重要なのが、後ろの数値、ここでは「5」は、切り出される範囲の最後の部分ではなく、さらにその一つ後ろを指しているという点です。なので、「game[3:5]」では、4行目と5行目が切り出されます。今は「なぜ?」となると思いますが、こうしておくことで繰り返し処理などの際に処理がすごく楽になります。
ここで割愛した部分の解説は、次の本が詳しいです。
さいごに
オセロの最初の盤面を作るときは、ボードに白の石を二つ、黒の石を二つ置くだけですが、それをプログラミングするとなると、意外と知識が必要です。初めのうちは大変かもしれませんが、慣れてくると大した話ではないと気づかされます。
次回は実際に石を置き、盤面がどのように変化するかを機械的に判断する方法について投稿していきます。
コメント