Освен ако играта ви не е много кратка, помага да можете да запазите напредъка. Дори кратките игри могат да се възползват от запазването на високи резултати.
Добавянето на система за запазване и зареждане към вашата игра може значително да подобри изживяването на играча. Той позволява на играчите да продължат напредъка си, да възобновят сесиите на игра и да експериментират с различни стратегии, без да губят трудно спечелени постижения.
Ще бъдете приятно изненадани от това колко лесно е да добавите тази функция към играта си с помощта на библиотеката Arcade на Python.
Създайте проста игра
Започнете със създаване проста игра, в която играчът може да се движи ляво и дясно.
Кодът, използван в тази статия, е достъпен в това GitHub хранилище и е безплатен за използване под лиценза на MIT.
Създайте нов файл с име проста-игра.py и добавете кода по-долу:
импортиране аркада
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_SPEED = 5
синьо = arcade.color. СИНкласGameWindow(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
self.player_x = ширина // 2дефon_draw(себе си):
arcade.start_render()
arcade.draw_rectangle_filled (self.game_state.player_x,
50, 50, 50, син)дефактуализация(самостоятелно, делта_време):
пасдефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. НАЛЯВО:
self.player_x -= PLAYER_SPEED
елиф ключ == arcade.key. ДЯСНО:
self.player_x += PLAYER_SPEEDдефосновен():
прозорец = GameWindow (SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()
ако __име__ == '__основен__':
основен ()
Кодът създава прозорец със син правоъгълник, представляващ играча. Играчът може да се движи наляво и надясно с помощта на клавишите със стрелки наляво и надясно.
Управление на състоянията на играта
За да внедрите система за запазване и зареждане, трябва да управлявате различни състояния на играта. Състоянието на играта представлява текущото състояние на играта, включително позициите на обектите, резултатите и други подходящи данни. За този пример се съсредоточете само върху x-координатата на играча.
За да управлявате състоянията на играта, въведете a GameState клас, който капсулира данните на играта и предоставя методи за тяхното запазване и зареждане. Ето кода:
класGameState:
деф__в него__(себе си):
self.player_x = 0
Запазване на данните за играта
За да запазите данните за играта, разширете GameWindow клас и добавете метод за запазване на състоянието на играта, когато е необходимо. Използвайте JSON формата за простота. Ето кода:
В запази играта метод, създайте речник на Python съдържащи съответните данни за играта. След това го сериализирайте в JSON файл, наречен save.json.
импортиране json
класGameWindow(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
self.game_state = GameState()дефзапази играта(себе си):
данни = {
'player_x': self.game_state.player_x
}
с отворен('save.json', "w") като файл:
json.dump (данни, файл)
печат (данни)дефon_draw(себе си):
arcade.start_render()
arcade.draw_rectangle_filled (self.game_state.player_x,
50, 50, 50, син)дефактуализация(самостоятелно, делта_време):
пас
дефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. НАЛЯВО:
self.game_state.player_x -= PLAYER_SPEED
елиф ключ == arcade.key. ДЯСНО:
self.game_state.player_x += PLAYER_SPEED
елиф ключ == arcade.key. С:
self.save_game()
Зареждане на данните за играта
За да заредите данните за играта, разширете GameWindow клас допълнително и добавете метод за зареждане на състоянието на играта. Създайте нов файл с име load-game.py и добавете кода със следните актуализации:
класGameWindow(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
self.game_state = GameState()
self.load_game()дефзареди игра(себе си):
опитвам:
с отворен('save.json', "р") като файл:
данни = json.load (файл)
self.game_state.player_x = данни['player_x']
с изключение FileNotFoundError:
пас
дефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. Л:
self.load_game()
The зареди игра метод се опитва да отвори save.json файл и извлечете данните от играта. След това актуализира състоянието на играта със заредените данни. Ако файлът не съществува, можете просто да игнорирате изключението, оставяйки състоянието на играта по подразбиране.
Включително допълнителни функции
Можете да добавите още функции, за да подобрите системата за запазване и зареждане на играта.
Запазване на високи резултати
Запазването на високи резултати заедно със състоянието на играта е обичайна характеристика в много игри. Можеш управлявайте резултатите и запазете високия резултат с помощта на тази система. Създайте нов файл с име high-score.py и добавете кода със следните актуализации:
класGameWindow(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
self.high_score = 0дефзареди игра(себе си):
опитвам:
с отворен('save.json', "р") като файл:
данни = json.load (файл)
печат (данни)
self.player_x = data.get('player_x', self.player_x)
self.high_score = data.get('висока оценка', self.high_score)
с изключение FileNotFoundError:
пасдефзапази играта(себе си):
данни = {
'player_x': self.player_x,
'висока оценка': self.high_score
}
с отворен('save.json', "w") като файл:
json.dump (данни, файл)
печат (данни)
дефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. НАЛЯВО:
self.player_x -= PLAYER_SPEED
елиф ключ == arcade.key. ДЯСНО:
self.player_x += PLAYER_SPEED
self.high_score += 1
Функция за автоматично запазване
За да осигурите на играчите спокойствие и да предотвратите загуба на прогрес, можете автоматично да запазвате състоянието на играта на редовни интервали. Създайте нов файл с име auto-save.py и добавете кода със следните актуализации:
импортиране време
класGameWindow(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
self.game_state = GameState()# Запазване на всеки 6 секунди
self.autosave_interval = 6
self.last_save_time = time.time()дефактуализация(самостоятелно, делта_време):
текущо_време = време.време()
time_diff = current_time - self.last_save_time
ако time_diff >= self.autosave_interval:
self.save_game()
печат ("Запазено")
self.last_save_time = текущо_време
В този кодов фрагмент, актуализация метод проверява дали зададеният интервал от време е изтекъл от последното записване. Ако е така, това задейства запази играта метод на GameWindow клас за автоматично запазване на състоянието на играта. Регулирайте autosave_interval стойност според изискванията на вашата игра.
Валидиране на данните за играта
Валидирането на заредените данни за играта е от съществено значение, за да се гарантира тяхната цялост и последователност. Можете лесно да включите валидирането на данни в нашата система за запазване и зареждане:
класGameState:
деф__в него__(себе си):
self.player_x = 0дефsave_state(себе си):
ако self.is_valid_state():
данни = {
'player_x': self.player_x
}с отворен('save.json', "w") като файл:
json.dump (данни, файл)дефload_state(себе си):
с отворен('save.json', "р") като файл:
данни = json.load (файл)ако self.validate_loaded_data (данни):
self.player_x = данни['player_x']
друго:
печат ("Грешка!")дефе_валидно_състояние(себе си):
# Изпълнете логика за валидиране тук
# Връща True, ако състоянието е валидно, False в противен случай
пас
дефvalidate_loaded_data(себе си, данни):
# Извършете проверка на заредените данни
# Връща True, ако данните са валидни, False в противен случай
пас
Чрез включването на тези допълнителни функции в системата за запазване и зареждане можете да създадете по-гъвкав и стабилен геймплей опит, предлагайки на играчите възможността да запазват множество състояния на играта, да проследяват високи резултати, да активират автоматично запазване и да гарантират данни интегритет.
Най-добри практики за системата за запазване и зареждане
Внедряването на система за запазване и зареждане е важен аспект от разработката на играта. За да осигурите стабилна и надеждна система, е важно да следвате най-добрите практики. Ето някои ключови практики, които трябва да имате предвид:
Шифроване на чувствителни данни
Ако вашата игра включва чувствителна информация, като пароли, лични данни или покупки в приложението, от решаващо значение е да шифровате запазеното състояние на играта. Шифроването добавя допълнителен слой сигурност, защитавайки поверителността на играча и предотвратявайки неоторизиран достъп до неговите данни. Използвайте алгоритми за криптиране и библиотеки, за да защитите поверителна информация.
Валидирайте заредените данни
Преди да заредите данните за играта, важно е да ги потвърдите, за да гарантирате тяхната цялост и последователност. Уверете се, че заредените данни се придържат към очаквания формат, структура и ограничения на вашата игра.
Извършвайте проверки за валидиране на критични полета с данни, за да избегнете сривове или измама. Внедрете стабилни механизми за валидиране на данни, за да се справите с потенциални грешки или неочаквани данни.
Отнасяйте се към грешките елегантно
Когато работите с файлови I/O операции, могат да възникнат грешки. От решаващо значение е тези грешки да се обработват елегантно и да се предоставят информативни съобщения за грешки на играча. Улавяне и обработка на изключения, като напр FileNotFoundError или PermissionError, по време на операции за запазване и зареждане.
Показвайте удобни за потребителя съобщения за грешки, за да насочвате играчите и да предотвратявате разочарованието. Освен това, помислете за внедряване на регистриране на грешки, за да помогнете за диагностициране и отстраняване на проблеми.
Тествайте функцията за запазване и зареждане
Тествайте старателно функцията за запазване и зареждане на вашата игра, за да се уверите в нейната надеждност и коректност. Създавайте тестови случаи, които обхващат различни сценарии, като например запазване в различни състояния на играта, зареждане от валидни и невалидни файлове за запазване и тестване на крайни случаи.
Уверете се, че състоянието на играта е правилно запазено и заредено и че се случва очакваното поведение. Автоматизираните рамки за тестване могат да помогнат при създаването на цялостни тестови пакети.
Направете игрите по-забавни със системата за запазване и зареждане
Добавянето на система за запазване и зареждане може да направи игрите по-ангажиращи, като предоставя на играчите усещане за непрекъснатост и прогрес. Играчите могат да експериментират свободно, да изпробват различни подходи и да се върнат към играта по-късно, без да губят своите постижения.
Тази функция също позволява на играчите да се състезават с приятели или да се предизвикват да победят предишните си високи резултати, добавяйки възможност за преиграване и дългосрочна ангажираност към вашата игра.