Kivyでオセロ開発Part2

Kivyでオセロ開発パートにを示すサムネイル

こんにちわ、にわこまです。

今回は、プレイヤーとコンピュータのそれぞれ個別に必要な機能を開発します。前回のPart1では、プレイヤーとコンピュータの両者に必要な機能を開発したため、その機能を使って個別に必要な機能を作成します。

 

誤字脱字など、何かございましたらご連絡お願い致します。

 

 

スポンサードサーチ


Kivyでオセロ開発Part2

今回のシリーズは、Kivyを使ってオセロを開発することを目的としています。

 

今回のシリーズの主な内容

1.コマンドプロンプト上で遊べるオセロの開発←今ここ

2.kivyを使ってオセロを開発(Kivy Languageは使用しない)

3.kivyを使ってオセロを開発(Kivy Languageを使用する)

 

目的を達成するためにも、まずはコマンドプロンプト上で遊ぶことができるオセロを開発します。

 

次に、kivyを使ってオセロを開発します。しかし、Kivy Languageは使用しません。つまり、pythonだけをつかってオセロアプリケーションを開発します。

 

最後に、Kivy Languageとpythonを使ってオセロアプリケーションを開発します。

 

 

今回は

今回は、コマンドプロンプト上で遊べるオセロの中でも、プレイヤーとコンピュータのそれぞれ個別に必要な機能を開発します。

 

 

プレイヤーとコンピュータ

プレイヤーに必要な機能とコンピュータに必要な機能を改めて考えます。

 

プレイヤー

・アドレス(a1、c8、etc…)からマスの座標へ変換する機能

・プレイヤーが選択したマスに置くことが可能か調べる機能

・盤面を更新する機能

 

コンピュータ

・石を置くことができるマスからランダムにマスを選択する機能

・盤面を更新する機能

 

以上がプレイヤーとコンピュータに必要な機能です。Part1では、共通機能として「盤面を更新する機能」と「石を置くことができるマスを取得する機能」を開発しました。

ゆえに、今回はそれ以外の機能を開発することになります。

プレイヤーに必要な機能としては、「アドレス(棋譜)からマスの座標へ変換する機能」と「プレイヤーが選択したマスに置くことが可能か調べる機能」です。

コンピュータ必要な機能としては、「石を置くことができるマスからランダムにマスを選択する機能」です。

 

 

スポンサードサーチ


プレイヤーの機能

プレイヤーに必要な機能は、「アドレス(棋譜)からマスの座標へ変換する機能」と「プレイヤーが選択したマスに置くことが可能か調べる機能」です。

 

「アドレス(棋譜)からマスの座標へ変換する機能」について説明します。

「アドレス(棋譜)からマスの座標へ変換する機能」は、アドレス(a8やc5などの棋譜から)マスの座標を示す(行,列)の形へ変換する機能です。

オセロにおける棋譜は以下のようになっています。

上記の表と同じような配列を作成し、入力された棋譜が代入されている座標を取得します。

 

「プレイヤーが選択したマスに置くことが可能か調べる機能」について説明します。

「プレイヤーが選択したマスに置くことが可能か調べる機能」は、プレイヤーが入力したアドレスを座標に変換後、その座標がgetPossibleLocationに含まれているか確認します。

 

プレイヤーの必要な機能のソースコードです。othello_alpha.pyに以下のコードを追記します。

import numpy as np
import random
import sys

class CommonFunc:
  # 省略

class Player(CommonFunc):
    def address2pos(self, address):
        if(address in addressTable):
            tlist = list(zip(*np.where(addressTable == address)))
            pos = tlist[0]
            return pos
    def confPos(self, pos):
        if(pos in self.getPossibleLocation()):
            return True
        return False

# global 変数
# 省略
global addressTable
addressTable = 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"]])

 

コードの解説

8行目の「class Player(CommonFunc)」は、CommonFuncを継承してPlayerクラスを作成しています。

 

9行目~13行目の「address2pos」は、アドレスを座標に変換する関数です。

10行目では、引数に与えられたアドレスがグローバル変数のaddressTableに存在するか確かめています。

11、12行目では、アドレスがどの座標に存在しているか抽出しています。

13行目では、変換された座標を返却しています。アドレスを変換することが出来なければ、Noneが返却されます。

 

14行目~17行目の「confPos」は、プレイヤーが入力したアドレスの座標に石を置くことができるか確認する関数です。

15行目では、CommonFuncから継承したgetPossibleLocationを使って、プレイヤーが入力したアドレスの座標に石を置くことができるか確認しています。

確認できればTureを返却します。確認できなければFalseを返却します。

 

動作確認

Playerクラスの関数の動作確認を行います。コマンドプロンプトを開きothello_alpha.pyを保存したフォルダまで移動します。また、そのフォルダでインタプリタを起動させます。

 

インタプリタを起動させたら、othello_alpha.pyからPlayerをインポートします。

>>> from othello_alpha import Player
>>>

 

インポートをしたら、Playerオブジェクトを作成します。また、アドレスを指定します。

>>> player = Player(1, 2)
>>> address = 'e6'
>>>

 

次に、address2pos関数を実行してc6が(5, 4)になることを確認します。

>>> pos = player.address2pos(address)
>>> pos
(5, 4)
>>>

 

さらに、変換後の座標に石を置くことができるか確認します。Trueが返されれば問題ありません。

>>> player.confPos(pos)
True
>>>

 

他のアドレスなどでも試してみてください。

以上で動作確認は完了です。

 

 

コンピュータの機能

コンピュータに必要な機能は、「石を置くことができるマスからランダムにマスを選択する機能」です。

 

「石を置くことができるマスからランダムにマスを選択する機能」は、getPossibleLocationによって見つけられた、石を置くことができるマスの一覧から1つマスをランダムに選択する機能です。

 

コンピュータに必要な機能のソースコードです。othello_alpha.pyに以下のコードを追記します。

import numpy as np
import random
import sys

class CommonFunc:
  # 省略

class Player(CommonFunc):
  # 省略

class Computer(CommonFunc):
    def electRandom(self):
        pl = self.getPossibleLocation()
        if(len(pl) == 0):
            print("pass")
            return
        r = random.randrange(0, len(pl))
        for i in enumerate(pl):
            if(i[0] == r):
                return i[1]
        print("Error : electRandom")
        sys.exit()

# 以下省略

 

コードの解説

11行目の「class Computer(CommonFunc)」は、CommonFuncを継承してComputerクラスを作成しています。

 

12行目~22行目の「electRandom」は、石を置くことができるマスからランダムにマスを選択する関数です。

13行目の「pl = self.getPossibleLocation」では、getPossibleLocationによって、石を置くことができるマスの辞書を取得しています。

14行目~16行目では、石を置くことができるマスがあるかどうかを確かめています。つまり、passかどうかを確かめています。

17行目の「r = random.randrange(0, len(pl))」では、取得した辞書の長さをmaxとして、ランダムに数字を選んでいます。

18行目~20行目では、ランダムに選んだ数字番目の座標を取得して返却しています。

21、22行目は、念のためにエラー処理を行っています。なくてもOKです。

 

動作確認

Computerクラスの関数の動作確認を行います。コマンドプロンプトを開きothello_alpha.pyを保存したフォルダまで移動します。移動したフォルダでインタプリタを起動させます。

 

インタプリタを起動させたら、othello_alpha.pyからComputerクラスをインポートします。

>>> from othello_alpha import Computer
>>>

 

次に、Computerクラスのオブジェクトを作成し、electRandomを実行します。(2, 3)、(3, 2)、(4, 5)、(5, 4)のどれかが出力されれば、問題ありません。

>>> comp = Computer(1, 2)
>>> comp.electRandom()
(3, 2)
>>>

 

以上で動作確認は完了でです。

 

 

スポンサードサーチ


まとめ

今回は、プレイヤーとコンピュータのそれぞれ個別に必要な機能を開発しました。Part1で共通機能を作っていたため、PlayerクラスとComputerクラスは比較的、コードを短くすることができました。

以下に本記事で作成したコードを示します。

 

Part3では、コマンドプロンプトに表示する関数を開発します。盤面を表示させたり、先攻後攻を決める質問を表示したりする関数を開発します。

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ