【初心者向け】KivyによるWindowsアプリ作成25 正解タイプ時のスコア加算処理の実装

タイトルの通り、今回は正解タイプが行われた際に、ゲーム画面上のスコアを加算する処理を実装し、ゲームを完成に少し近づけていきたいと思います。

コード全量については、GitHub上のファイルをご参照下さい。

<スポンサーリンク>

実装方針の整理

今回も簡単にですが、実装方針をまず整理しておきたいと思います。

これまでの記事で紹介した内容を踏まえて実装するとなると、

  • GameScreenクラス内にスコアを格納する変数を用意し、
  • 正解タイプのタイミングでそのスコアを加算し、
  • さらに、ids配列によってkvファイル上のスコアのLabelに表示されている文字列を書き換える

という手順でできそうです。

しかし今回は、KivyのPropertyというクラスを用いて、この処理を実現したいと思います。

Propertyとは、文字や数値などの値を格納できるクラスですが、KvファイルでこのPropertyをインスタンス化したものを属性値として設定すると、Pythonファイル側でこの値を変更した際、その変更がKivyファイル側にも自動的に反映されるという便利な特徴を持っています。

Propertyにはいくつかの種類があり、NumericPropertyという数値を格納するもの、StringPropertyという文字列を格納するもの、また、インスタンスを丸ごと格納できるObjectPropertyといったものがあります。

今回はNumericPropertyを使用して、スコアに関する処理を実装していきます。

実装

では、順にスコア加算処理を実装していきましょう。

まず、NumericPropertyを使用できるよう、import文を加えます。

#省略
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.properties import NumericProperty #この行を追加
#省略

続いて、GameScreenクラス内にsocreという変数を定義し、その中にNumericPropertyインスタンスを格納しておきます。

class GameScreen(Screen):
    targets = []
    score = NumericProperty(0) #追加

    def start(self):
#省略

NumericPropertyは引数として初期値を取ります。今回は「0」を指定しています。

次に、正解タイプが行われた際のスコア加算処理を、keyboardDownメソッドの最後に入れておきます。

def keyboardDown(self, keyboard, keycode, text, modifiers):
#省略
            self.targetExist[target.posY][target.posX] = False
            self.targets.remove(target)
            self.score += 10 #この行を追加

Numericインスタンスは、通常の数値型データと全く同様に加算処理ができます。

さて、Pythonファイル側の修正は以上です。続いて、Kvファイル側の修正を行います。(久しぶりですね)

GameScreen Widget内にスコアを表示するLabelがありますが、そのtext属性を変更します。

<GameScreen>:
#省略
            Label:
                size_hint_x: 0.2
                text: "Score"
            Label:
                id: score
                size_hint_x: 0.2
                text: str(root.score) #この行を"0"から変更
#省略

すぐ上に、text属性が「Score」と指定されているLabelがありますが、これはスコアそのものではなく、単に「Score」という文字列を表示するだけのLabelですので、混同しないようにご注意下さい。id属性に「score」と指定されているLabelが修正対象です。

さて、このLabelのtext属性は、もともと「0」と指定されていましたが、これを「str(root.score)」という記述に置き換えています。

rootとは、このLabelが属している大本のWidget、すなわち、GameScreen Widget(インスタンス)が該当します。ですので、「root.score」という記述で、GameScreenインスタンス中のscore変数を参照することができます。

また、text属性に指定できるのは文字列型である一方、score変数に入っているデータは数値型です。そこで、strというPythonの組み込み関数を使って、score変数の値を文字列化し、text属性に指定できるようにしています。

これで、ゲーム画面上のスコアのLabelでは、Pythonファイル側のscore変数の値をリアルタイムで表示できるようになりました。

実行

それでは、プログラムを実行し、ゲームを開始してみましょう。

画面に表示された文字をタイプすると、上部のスコアが10点ずつ加算されていくのが分かると思います。

終わりに

ゲームとしての体裁はだいぶ整ってきましたが、現状のプログラムでは気力・体力の持つ限り延々とゲームを行うことができ、止め時に困ってしまいます。

そこで次回の記事では、この問題に対応するための手始めとして、正解タイプ毎に表示速度を上げ、タイプが追い付かなくなるような処理を実装していきたいと思います。

<スポンサーリンク>

シェアする

フォローする