今回はさらなる改良として、面選択の画面で既にクリアした面がわかるようにします。また一度クリアした面に再挑戦する場合には、前回の歩数が表示されるようにもしましょう。さらに再挑戦でクリアした時の歩数が前回より少なければ、その歩数でcleared.pklファイルを更新したいですね。
これらの処理を分かり易くコーディングするために「reFlag」というフラグを使います。Playerクラスのインスタンス変数に「self.reFlag = 0」「self.oldCounter = 0」の二つを追加しました。先ず再挑戦かどうかを判定し、reFlagを決定するとともに前回の歩数「oldCounter」を取得するメソッドをMapクラスにつくります。
# 再挑戦 Flagを取得 def getReFlag(self, player): for i in range(len(self.clearedList)): if self.index == self.clearedList[i][0]: # [(x,y), (x1,y1)..]の index iの xが map.indexなら player.reFlag = 1 player.oldCounter = self.clearedList[i][1] # [(x,y), (x1,y1)..]の index iの y = oldCounter break
またMapクラスのgetStage()メソッドに、再挑戦する面の番号色を赤にする処理を追加します。黄色の上に赤で上書きしています。
sysfont = pygame.font.SysFont(None, 25) for i in range(len(self.clearedList)): # cleared buttonを赤で表示 for button in buttons: if button.num == self.clearedList[i][0]: suu = sysfont.render(str(button.num), False, (255,0,0)) self.screen.blit(suu, (button.x+5, button.y+8))
あとはsouko.pyのmain()メソッドに、上のメソッドを使うためのmap.getReFlag(player)を追加し、スペースキーを押した時の処理を以下のように変更するだけです。
if event.type == KEYDOWN and event.key == K_SPACE: # stage選択画面に戻るif clearFlag == 1: # clear時の clearedList[]処理 if player.reFlag == 0: # 初挑戦でクリアしていたら map.clearedList.append([map.index, player.counter, map.playerHis]) # append elif player.reFlag == 1: # 再挑戦でクリアしていたら for i in range(len(map.clearedList)): if map.index == map.clearedList[i][0] and player.counter < map.clearedList[i][1]: # 進歩なら map.clearedList[i][1] = player.counter # 該当行のcounterを書き換え map.clearedList[i][2] = map.playerHis # 該当行のplayerHisを書き換え map.save(map.clearedList) # cleared.pklに save map.stage.clear() # stage[]クリア clearFlag = 0 # clearFlagを初期値に戻す self.main() # mainメソッドを実行
Soukoクラスのコンストラクタは、結局使わなかったので削除しました。今回変更のあった各クラスのファイルを提示します。button.pyは前々回に提示したものから変更がありません。cleared.pklファイルに保存しているplayerHisのデータは次の更新時に使います。
mapStage.py
players.py
souko.py