【初心者向け】KivyによるWindowsアプリ作成31 難易度調整処理の実装

今回の記事では、前回作成した難易度調整画面から、実際に難易度(表示する文字種類)を調整する処理を実装していきたいと思います。

<スポンサーリンク>

実装方針の確認

今回もまず簡単に、難易度調整機能をどのように実装するか、確認しておきたいと思います。

現在、文字の表示は、GameScreenクラスのupdateメソッド内で、以下のコードにより行っています。

target = Target(x, y)
target.pos = (x * 75 + 26, y * 75 + 1)
target.text = choice(CHARACTER_SET[difficulty])
self.targetField.add_widget(target)

重要なのは3行目で、どのクラスにも属さないグローバル変数であるdifficultyを使って、同じくグローバル変数のCHARACTER_SETに定義された難易度毎の文字集合を取得し、そこから1文字をランダムに選択しています。

つまり、難易度を変更して表示する文字の種類を変えるためには、このdifficultyの値を変えてやればよさそうです。

なお、CHARCTER_SETはディクショナリ形式で、キーとしてeasy, normal, hardの3つしか定義されていないため、difficultyの値も、これらのうちいずれかである必要があることに注意して下さい。

また、このdifficultyに設定する値をどのように決めればよいか、ですが、難易度調整画面には、Easy, Normal, Hardの3つのボタンがありますので、どのボタンが押されたか、という情報が取得できれば、それに応じたdifficultyの設定ができそうです

実装

それでは、実装に移りましょう。

まずは、難易度調整画面でどのボタンが押されたかの情報をPythonファイル側で取得する処理を実装します。

ボタンの種類を取得するためには、Kvファイル側の各ボタンにon_pressを追加し、ボタン押下時に実施するメソッドを指定します。このメソッドは、現時点では未定義です。

そして、指定するメソッドの引数に、押されたボタンのインスタンスそのものを指定します。これで、対応するPythonファイル側のメソッドで、このボタンを扱うことができます。

ということで、まずはKvファイルを修正しましょう

<DifficultyScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            ・・・
        Label:
            ・・・

        BoxLayout:
            ・・・
            BoxLayout:
                padding: 20, 40
                Button:
                    id: easy
                    text: "Easy"
                    font_size: 48
                    on_press: root.difficultySelected(self) #追加
                Button:
                    id: normal
                    text: "Normal"
                    font_size: 48
                    on_press: root.difficultySelected(self) #追加
                Button:
                    id: hard
                    text: "Hard"
                    font_size: 48
                    on_press: root.difficultySelected(self) #追加
            Label:
                ・・・

各ボタンのon_press属性に、difficultySelectedというメソッドを登録しました。また、引数にselfと指定することで、自分自身(Button)をメソッド側に渡すようにしました。

なお、各ボタンごとに異なるメソッドを定義してやることももちろん可能ですが、実行される処理はそう大して変わりませんので、1つのメソッドで対応することにしたいと思います。

さて、続いてPythonファイルのDifficultyScreenクラス内にdifficultySelectedメソッドを追加してやる必要があります。

このメソッドの引数は、毎度指定しているself(DifficultyScreenインスタンス)の他、押されたButtonインスタンスを指定する必要がありますね。ここでは、「btn」という変数名で受けることにしましょう。

def difficultySelected(self, btn):

さらに、受け取ったButtonインスタンスからdifficulty変数に設定すべき難易度値を取得します。ボタンに表示されている文字列(例:Easy)を小文字化したもの(例:easy)が難易度値として使えます。

btn.text.lower()

あとは、この値をdifficultyに設定してやるだけです。

ここで1点注意して頂きたいのは、思わず、

difficulty = btn.text.lower()

と書きたくなるところですが、これではプログラムが正しく動作しないということです。

このように書くと、グローバルで定義したdifficulty変数とは別に、difficultySelectedメソッド内でのみ利用できる同名の変数が作成され、そこに代入が行われてしまう(=グローバル変数であるdifficultyは変更されない)ことになります。

これを防ぐためには、

global difficulty
difficulty = btn.text.lower()

というように、変数名の前にglobalを付けて、それがグローバル変数であることを明示します。

さて、最終的に、difficultySelectedメソッドの中身は以下のようになります。

def difficultySelected(self, btn):
    global difficulty
    difficulty = btn.text.lower()

テスト実行

それではプログラムを実行してみて、難易度が調整できるか確認してみましょう。

難易度調整画面で「Normal」ボタンを押してタイトル画面に戻り、ゲームをスタートしてみて下さい。(ちなみに、難易度調整画面は、別の回で見た目を少しリッチにしていきます。)

さて、Normalでゲームをスタートすると、アルファベット小文字に加え、大文字も表示されるようになりました。

同様に、難易度をHardにしてみると、今度は数字も表示されることが確認できると思います。

折角ですので、少しゲームをプレイしてみて下さい。

するとお気付きになるかと思いますが、アルファベットの大文字が表示された時に正しいキーを押しても、文字が消えるどころかミスタイプとみなされ、スコアが減ってしまいますね

これは、プログラム側では、ユーザがタイプしたキーが、我々の意図した通りには受け取られていないために発生しています。

終わりに

ということで、次回はキー入力のロジックを少し修正し、大文字の入力も適切にプログラム側で受け取ることができるようにしていきたいと思います。

<スポンサーリンク>

シェアする

フォローする