Kivyでオセロ開発Part10

Kivyでオセロ開発ぱーとじゅうを表すサムネイル

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

今回は、Kivyでオセロ開発(Kivy Languageを使用しない)の仕上げと完成です。具体的には、得点板の更新と手番の更新、勝利判定です。ウィジェットの親子関係を理解する必要があります。

 

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

 

 

スポンサードサーチ


Kivyでオセロ開発Part10

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

 

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

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

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

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

 

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

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

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

 

 

今回は

今回は、Kivyを使ってオセロを開発(Kivy Languageは使用しない)の仕上げと完成です。

Kivy Languageを使わずにアプリケーションを作成する理由は、Kivy Languageを使ったときにpythonコードをどれだけ減らせるか実感して欲しいからです。

 

 

得点板の更新(石を数える)

Part9では、オセロ中に石の数が分かるように得点板を作成しましたが、盤面の更新に対応していませんでした。

ゆえに今回は、オセロの盤面が更新されるたびに、得点も更新されるようにします。

 

石を数えるためのソースコードです。othello_beta.pyに以下のコードを追記します。

# 上記省略

class FieldWidget(Widget):
    def __init__(self, **kwargs):
        # 省略
    def update(self, *args):
        # 省略
    def drawfield(self):
        # 省略
    def on_touch_down(self, touch):
        xpos = (touch.x - self.x) / (self.width / 8)
        ypos = 8 - (touch.y - self.y) / (self.height / 8)
        if(othello_alpha.Turn == othello_alpha.playerStone):
            if(len(player.getPossibleLocation()) == 0):
                othello_alpha.Turn = othello_alpha.computerStone
                pass
            else:
                if(0 <= int(xpos) and int(xpos) < 8 and 0 <= int(ypos) and int(ypos) < 8):
                    mypos = (int(ypos), int(xpos))
                    if(player.confPos(mypos)):
                        player.updateField(mypos)
                        othello_alpha.Turn = othello_alpha.computerStone
                        self.drawfield()
            pass
        elif(othello_alpha.Turn == othello_alpha.computerStone):
            mypos = comp.electRandom()
            if(mypos == None):
                othello_alpha.Turn = othello_alpha.playerStone
            else:
                comp.updateField(mypos)
                othello_alpha.Turn = othello_alpha.playerStone
                self.drawfield()
            pass
        # 石を数える
        self.parent.parent.cw.clb.text = str(np.sum(othello_alpha.field == 1))
        self.parent.parent.cw.clw.text = str(np.sum(othello_alpha.field == 2))
    pass

# 中略

class OthelloApp(App):
    def build(self):
        root = RootWidget()
        root.gotoTitle()
        return root

if __name__ == '__main__':
    OthelloApp().run()

 

コードの解説

35、36行目が黒石と白石を数えて、石の数を更新するためのものです。

self.parent.parent.cw.clb.text」は、PlayWidgetの中のCountWidgetの中のCountLabelのテキストを指しています。

self.parentは、PlayWidgetのanchor1を指します。

self.parent.parentは、PlayWidget自身を指します。

self.parent.parent.cwは、PlayWidgetでインスタンス化したCountWidgetを指します。

self.parent.parent.cw.clbは、CountWidget内で作成したCountLabelを指します。

 

 

動作確認

盤面を更新したらプレイ画面の右側の石の数も変わるか、動作確認を行います。コマンドプロンプトを開き、othello_beta.pyを保存したフォルダまで移動します。

移動したら以下のコマンドを入力し、アプリケーションを実行します。

python othello_beta.py

 

タイトル画面のスタートボタンをクリックし、先手か後手を選択します。その後プレイ画面に移動します。少しオセロをプレイして、右側の石の数が正しく数えられているか確認します。

カウントウィジェットの石を数える機能が正しく動作している画像

 

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

 

 

スポンサードサーチ


手番の更新

Part9では、現在の手番がどちらか分かるようにTurnLabelを作成した。しかし、オセロプレイ中の盤面の更新には対応していませんでした。

ゆえに今回は、オセロ中でも手番が更新されるようにします。

 

手番を更新するためのソースコードです。othello_beta.pyに以下のコードを追記します。

# 上記省略

class FieldWidget(Widget):
    def __init__(self, **kwargs):
        # 省略
    def update(self, *args):
        # 省略
    def drawfield(self):
        # 省略
    def on_touch_down(self, touch):
        xpos = (touch.x - self.x) / (self.width / 8)
        ypos = 8 - (touch.y - self.y) / (self.height / 8)
        if(othello_alpha.Turn == othello_alpha.playerStone):
            if(len(player.getPossibleLocation()) == 0):
                othello_alpha.Turn = othello_alpha.computerStone
                self.parent.parent.tl.text = 'Turn : Computer'
                pass
            else:
                if(0 <= int(xpos) and int(xpos) < 8 and 0 <= int(ypos) and int(ypos) < 8):
                    mypos = (int(ypos), int(xpos))
                    if(player.confPos(mypos)):
                        player.updateField(mypos)
                        othello_alpha.Turn = othello_alpha.computerStone
                        self.parent.parent.tl.text = 'Turn : Computer'
                        self.drawfield()
            pass
        elif(othello_alpha.Turn == othello_alpha.computerStone):
            mypos = comp.electRandom()
            if(mypos == None):
                othello_alpha.Turn = othello_alpha.playerStone
                self.parent.parent.tl.text = 'Turn : You'
            else:
                comp.updateField(mypos)
                othello_alpha.Turn = othello_alpha.playerStone
                self.parent.parent.tl.text = 'Turn : You'
                self.drawfield()
            pass
        # 石を数える
        self.parent.parent.cw.clb.text = str(np.sum(othello_alpha.field == 1))
        self.parent.parent.cw.clw.text = str(np.sum(othello_alpha.field == 2))
    pass

# 下記省略

 

コードの解説

16行目、24行目は、プレイヤーからコンピュータに手番か移るため、手番を更新しています。

31行目、35行目は、コンピュータからプレイヤーに手番が移るため、手番を更新しています。

self.parent.parent.tl.text」について解説します。

self.parentは、PlayWidgetのanchor1を指します。

self.parent.parentは、PlayWidget自身を指します。

self.parent.parent.tlは、PlayWidgetでインスタンス化したTurnLabelのことを指します。

self.parent.parent.tl.textは、TurnLabelのテキストのことです。

 

 

動作確認

手番が正しく更新されるか、動作確認を行います。コマンドプロンプトを開き、othello_beta.pyを保存したフォルダまで移動します。

移動したら以下のコマンドを入力し、アプリケーションを実行します。

python othello_beta.py

 

プレイ画面まで移動し、オセロをプレイすると、右側の手番が更新されていることを確認します。

以下の図は、先手を選び、1回だけ盤面を進めた図です。手番がコンピュータになっています。

手番が更新されていることを示す画像

 

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

 

 

勝利判定

コマンドプロンプト上でプレイするオセロでは、処理判定を表示していました。ゆえに、Kivyでも勝利判定を表示します。

オセロが終われば手番は不必要になるため、TurnLabelに勝利判定を表示させます。

 

勝利判定を表示させるためのソースコードです。othello_beta.pyに以下のコードを追記します。

# 上記省略

class FieldWidget(Widget):
    def __init__(self, **kwargs):
        # 省略
    def update(self, *args):
        # 省略
    def drawfield(self):
        # 省略
    def on_touch_down(self, touch):
        xpos = (touch.x - self.x) / (self.width / 8)
        ypos = 8 - (touch.y - self.y) / (self.height / 8)
        if(othello_alpha.Turn == othello_alpha.playerStone):
            if(len(player.getPossibleLocation()) == 0):
                othello_alpha.Turn = othello_alpha.computerStone
                self.parent.parent.tl.text = 'Turn : Computer'
                pass
            else:
                if(0 <= int(xpos) and int(xpos) < 8 and 0 <= int(ypos) and int(ypos) < 8):
                    mypos = (int(ypos), int(xpos))
                    if(player.confPos(mypos)):
                        player.updateField(mypos)
                        othello_alpha.Turn = othello_alpha.computerStone
                        self.parent.parent.tl.text = 'Turn : Computer'
                        self.drawfield()
            pass
        elif(othello_alpha.Turn == othello_alpha.computerStone):
            mypos = comp.electRandom()
            if(mypos == None):
                othello_alpha.Turn = othello_alpha.playerStone
                self.parent.parent.tl.text = 'Turn : You'
            else:
                comp.updateField(mypos)
                othello_alpha.Turn = othello_alpha.playerStone
                self.parent.parent.tl.text = 'Turn : You'
                self.drawfield()
            pass
        # 石を数える
        self.parent.parent.cw.clb.text = str(np.sum(othello_alpha.field == 1))
        self.parent.parent.cw.clw.text = str(np.sum(othello_alpha.field == 2))
        # 勝者出力
        if(len(player.getPossibleLocation()) == 0 and len(comp.getPossibleLocation()) == 0):
            self.parent.parent.tl.text = othello_alpha.confResult()
        pass
    pass

# 下記省略

 

コードの解説

42、43行目は、プレイヤーとコンピュータの両者が石を置くところが無くなったら勝利判定を行います。

勝利判定には、othello_alpha.pyのconfResult関数を使用します。

 

 

動作確認

試合が終了したとき、勝利判定が正しく表示されるか、動作確認を行います。コマンドプロンプトを開き、othello_beta.pyを保存したフォルダまで移動します。

移動したら以下のコマンドを入力し、アプリケーションを実行します。

python othello_beta.py

 

オセロを実際に最後までプレイして、勝利判定が右側に表示されるか確認します。

勝利判定が正しくされている画像

 

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

 

 

スポンサードサーチ


まとめ

今回は、kivyライブラリを使用して、Kivy Languageを使用せずpythonコードのみでオセロを開発し完成させました。

他のクラスからでも、textなどを変更させることができると理解できたと思います。

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

 

次回Part11からは、Kivy Languageを使ったオセロを開発します。

Kivy Languageを使用すると、pythonコードは半分くらいの記述で済みます。

 

 

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


スポンサードサーチ