Halcon探索學習 | 3 資料型別
阿新 • • 發佈:2022-12-07
遊戲角色狀態恢復問題
傳統方案解決遊戲角色恢復問題
傳統解決方案的問題分析
備忘錄模式基本介紹
備忘錄模式的原理類圖
程式碼實現
package com.sky.memento.theory; // 原始物件 public class Originator { private String state; // 狀態資訊 // 提供set get 方法 public String getState() { return state; } public void setState(String state) {this.state = state; } // 編寫一個方法,可以儲存一個狀態物件 Memento public Memento saveStateMemento(){ return new Memento(state); } // 通過備忘錄物件,恢復狀態 public void getStateFromMemento(Memento memento){ state = memento.getState(); } }
package com.sky.memento.theory; // 備忘錄 publicclass Memento { private String state; // 通過構造器進行state的注入 public Memento(String state){ this.state = state; } public String getState() { return state; } }
package com.sky.memento.theory; import java.util.ArrayList; // 備忘錄容器 public class CareTaker { // 建立一個備忘錄集合,來儲存備忘錄private ArrayList<Memento> mementoList = new ArrayList<>(); public void add(Memento memento){ mementoList.add(memento); } public Memento get(int index){ return mementoList.get(index); } }
package com.sky.memento.theory; // 客戶端 public class Client { public static void main(String[] args) { Originator originator = new Originator(); CareTaker careTaker = new CareTaker(); originator.setState("狀態#1 攻擊力 100"); // 儲存了當前的狀態 careTaker.add(originator.saveStateMemento()); originator.setState("狀態#2 攻擊力 80"); // 儲存了當前的狀態 careTaker.add(originator.saveStateMemento()); originator.setState("狀態#3 攻擊力 50"); // 儲存了當前的狀態 careTaker.add(originator.saveStateMemento()); System.out.println("當前的狀態是 = " + originator.getState()); // 希望得到狀態1,將originator恢復到狀態1 originator.getStateFromMemento(careTaker.get(0)); System.out.println("恢復到狀態1,當前狀態是 "); System.out.println("當前的狀態是 = "+ originator.getState()); } }
當前的狀態是 = 狀態#3 攻擊力 50
恢復到狀態1,當前狀態是
當前的狀態是 = 狀態#1 攻擊力 100
遊戲角色恢復狀態的例項
思路分析及類圖
程式碼實現
package com.sky.memento.game; // 遊戲角色 屬性類 public class GameRole { private int vit; // 攻擊力 private int def; // 防禦力 // 建立備忘錄Memento,即根據當前的狀態得到Memento public Memento createMemento(){ return new Memento(vit,def); } // 從備忘錄物件,恢復初始狀態 public void recoveryGameRoleFromMemento(Memento memento){ this.vit = memento.getVit(); this.def = memento.getDef(); } // 顯示當前遊戲的角色狀態 public void display(){ System.out.println("當前角色的攻擊力:"+ this.vit + " 防禦力:"+ this.def); } // 提供get set 方法供外部進行修改 public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.sky.memento.game; // 備忘錄 public class Memento { // 攻擊力 private int vit; // 防禦力 private int def; // 通過構造器,進行初值注入 public Memento(int vit, int def) { this.vit = vit; this.def = def; } public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } }
package com.sky.memento.game; // 守護者物件,儲存遊戲角色的狀態 public class Caretaker { // 如果只儲存一次狀態 private Memento memento; // 如果對一個物件需要儲存多次狀態 // private ArrayList<Memento> mementos; // // 對多個遊戲角色儲存多個狀態 // private HashMap<String, ArrayList<Memento>> rolesMementos; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
package com.sky.memento.game; import com.sky.memento.theory.CareTaker; public class Client { public static void main(String[] args) { // 建立遊戲角色 GameRole gameRole = new GameRole(); gameRole.setVit(100); gameRole.setDef(100); System.out.println("和boss大戰前的狀態"); gameRole.display(); // 把當前狀態儲存到 caretaker 中 Caretaker careTaker = new Caretaker(); careTaker.setMemento(gameRole.createMemento()); System.out.println("和boss 大戰~~~"); gameRole.setVit(50); gameRole.setDef(50); gameRole.display(); System.out.println("大戰後,使用備忘錄物件恢復到戰前"); gameRole.recoveryGameRoleFromMemento(careTaker.getMemento()); gameRole.display(); } }
和boss大戰前的狀態
當前角色的攻擊力:100 防禦力:100
和boss 大戰~~~
當前角色的攻擊力:50 防禦力:50
大戰後,使用備忘錄物件恢復到戰前
當前角色的攻擊力:100 防禦力:100
備忘錄模式的注意事項和細節