DAY24ではDAY20で作ったスネークゲームにハイスコア機能をつけます。
今までであればプログラムを閉じたら全てのデータは消去されてしまい
起動すると全て初期化されてしまうのですが、
大事な部分はデータとして残しておくようにします。
全データはgitにて公開しています。
今回改修する部分はスコアなので、score_board.py部分。
- 初期値にハイスコアの変数
- 表示部分にハイスコアの表示
- プログラム起動時にハイスコアのデータを読み込む
- ゲーム時にハイスコアが更新されたら、現在のスコアがハイスコアになる
- ゲーム終了時に更新されたハイスコアをデータに保存する
このような感じでしょうか。
更新したコードはこちら。
from turtle import Turtle
class ScoreBoard(Turtle):
def __init__(self):
super(ScoreBoard, self).__init__()
self.score = 0
self.high_score = 0
self.penup()
self.ht()
self.goto(0, 270)
self.color("white")
self.get_highscore()
def get_score(self):
self.write(f"Score: {self.score} Highscore: {self.high_score}", font=("Sans", 20, "bold"), align="center")
def get_highscore(self):
try:
with open("score.txt", mode="r") as data:
self.high_score = int(data.read())
except:
pass
self.get_score()
def game_over(self):
self.goto(0, 0)
self.write("Game Over.", font=("Sans", 20, "bold"), align="center")
def increase_score(self):
self.clear()
self.score += 1
if self.score > self.high_score:
self.high_score = self.score
with open("score.txt", mode="w") as data:
data.write(str(self.high_score))
self.get_score()
前は初期値でget_score()を起動するようにしていましたが、
今回はget_highscore()を起動するようにしています。
with open('<file name>', mode="w or a or r") as <name>
でファイルをあけられるコードで、modeがwだと上書き、aで追記、rで読み取り
ができます。 as の後に変数名をいれることで以降その変数でコードができます。
try, exceptは後々やるのですが初めてやる場合に読み込む画像がない場合
エラーになってしまうので、入れてます。
tryでwith openを試して問題なければそのコードをそのまま続けますが、
問題があればスルーしてget_score()を動かすような流れです。
get_score()にハイスコアのコードを追加。
increase_score()には
もし現在のスコアがハイスコアより大きくなった場合に
スコア=ハイスコアを表示しつつテキストにもハイスコアを保存するようにしています。
書き込みはgame_over()の時にした方がいいのかもしれません。
今回は読み込みしたものはtxtでしたが、csvももちろん読み込めます。
今後スクレイピングなどでよく使うので覚えておかないと。