一、遊戲進度保存
打過遊戲的朋友一定知道,大多數遊戲都有保存進度的功能,如果一局遊戲下來,忘保存了進度,那麼下次只能從上次進度點開始重新打了。一般情況下,保存進度是要存在可持久化存儲器上,本例中先以保存在內存中來模擬實現該場景的情形。
以模擬一個戰鬥角色爲例。首先,創建遊戲角色。
class GameCharacter():
vitality = 0
attack = 0
defense = 0
def displayState(self):
print 'Current Values:'
print 'Life:%d' % self.vitality
print 'Attack:%d' % self.attack
print 'Defence:%d' % self.defense
def initState(self,vitality,attack,defense):
self.vitality = vitality
self.attack = attack
self.defense = defense
def saveState(self):
return Memento(self.vitality, self.attack, self.defense)
def recoverState(self, memento):
self.vitality = memento.vitality
self.attack = memento.attack
self.defense = memento.defense
class FightCharactor(GameCharacter):
def fight(self):
self.vitality -= random.randint(1,10)
GameCharacter定義了基本的生命值、攻擊值、防禦值以及實現角色狀態控制的方法,FightCharactor實現具體的“戰鬥”接口。爲實現保存進度的細節,還需要一個備忘錄,來保存進度。
class Memento:
vitality = 0
attack = 0
defense = 0
def __init__(self, vitality, attack, defense):
self.vitality = vitality
self.attack = attack
self.defense = defense
萬事俱備,在業務邏輯中可以進行類的調度了。
if __name__=="__main__":
game_chrctr = FightCharactor()
game_chrctr.initState(100,79,60)
game_chrctr.displayState()
memento = game_chrctr.saveState()
game_chrctr.fight()
game_chrctr.displayState()
game_chrctr.recoverState(memento)
game_chrctr.displayState()
打印如下:
Current Values:
Life:100
Attack:79
Defence:60
Current Values:
Life:91
Attack:79
Defence:60
Current Values:
Life:100
Attack:79
Defence:60
由生命值變化可知,先保存狀態值,經過一輪打鬥後,生命值由100變爲91,而後恢復狀態值,生命值又恢復成100。
二、備忘錄模式
備忘錄模式定義如下:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可以將該對象恢復到原來保存的狀態。在備忘錄模式中,如果要保存的狀態多,可以創造一個備忘錄管理者角色來管理備忘錄。
三、備忘錄模式應用場景
1、需要保存和恢復數據的相關狀態場景。如保存遊戲狀態的場景;撤銷場景,如Ctrl-Z操作;事務回滾的應用。一般情況下事務回滾有兩種方式:一是把從恢復點開始的操作都反向執行一遍;二是直接恢復到恢復點的各種狀態。兩種方式各有優缺點,要結合業務場景,決定使用哪種模式;
2、副本監控場景。備忘錄可以當作一個臨時的副本監控,實現非實時和準實時的監控。