Java初心者で、Eclipsで簡単なゲームを作っています。
選択肢で1か2をキーボードで入力してもらい、1ならバッドエンドの内容のあと直前の選択肢に戻し、2ならそのままゲームが続くようにしたいのですが、ifを使うとバッドエンドの後にどうやって分岐前である直前の選択肢まで戻すのかが分からず困っています。
また、ループの有無に関わらずあるポイントに戻る(ゲームでいうロード)ことはできるのでしょうか?
初歩的な質問で申し訳ありませんが、どうぞよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
状態遷移をループ処理の中で実現する以外の実装例として、デザインパターンの1つである State パターンというものがあります。
これを各シナリオのシーンごとに実装すると状態遷移を容易にすることができるのではないかと思います。
セーブやロードの実装では、今のゲーム位置がシナリオのどの部分かといった情報の他に、その時の進行状況(俗にフラグと呼ばれるものです)を管理する必要があるかと思います。
その情報を元に、適切な状態を再現することで、ロード処理を実装することが可能です。
簡単な実装例を紹介できればと思いましたが、すぐに思いつかなかったので上記のWikipediaにあるサンプルコードでざっくり把握頂き、もし分からない部分があればご確認ください。
また、その際に現状作成されているコード等を合わせてご提示頂けると説明がしやすいかもしれません。
追記:
ちょっとがんばって作ってみました。参考になるかはわかりませんが。。。
ここでは1つしか作成していませんが、Sceneを実装するクラスを複数定義すると、突然別のゲームが始まるような作りにもできるかもしれません。
また、このコードのイケていないところは、分岐を作るところが大変ということです。
これを改善するには、FactoryパターンやBuilderパターンといったさらに別のデザインパターンを参考に実装していくとうまくいく、かもしれません。
java
1// Game.java 2 3import java.util.*; 4 5public class Game { 6 public static void main(String args[]) { 7 GameMaster gm = new GameMaster(); 8 gm.startSession(); 9 } 10} 11 12/** シーンを定義する. */ 13interface Scene { 14 /** 選択肢を表示して、選択候補を返す. */ 15 public List<Integer> printScene(); 16 /** シーンを選択する. */ 17 public Scene chooseNext(int nextScene); 18} 19 20/** シーンを実装する. */ 21class SceneImpl implements Scene { 22 public static final int LEFT = 1; 23 public static final int RIGHT = 2; 24 25 private int sceneId; 26 private String sceneText; 27 private Scene leftNext; 28 private Scene rightNext; 29 30 public SceneImpl(int sceneId, String sceneText, Scene leftNext, Scene rightNext) { 31 this.sceneId = sceneId; 32 this.sceneText = sceneText; 33 this.leftNext = leftNext; 34 this.rightNext = rightNext; 35 } 36 37 public SceneImpl(int sceneId, String sceneText) { 38 this(sceneId, sceneText, null, null); 39 } 40 41 public List<Integer> printScene() { 42 List<Integer> choise = new ArrayList<Integer>(); 43 System.out.println(this.sceneText); 44 if (this.leftNext != null) { 45 System.out.println(String.format(" %s: %d", "左", SceneImpl.LEFT)); 46 choise.add(SceneImpl.LEFT); 47 } 48 if (this.rightNext != null) { 49 System.out.println(String.format(" %s: %d", "右", SceneImpl.RIGHT)); 50 choise.add(SceneImpl.RIGHT); 51 } 52 if (0 < choise.size()) { 53 System.out.print(" => "); 54 } 55 return choise; 56 } 57 58 public Scene chooseNext(int nextScene) throws RuntimeException { 59 switch (nextScene) { 60 case SceneImpl.LEFT: 61 return leftNext; 62 case SceneImpl.RIGHT: 63 return rightNext; 64 default: 65 throw new RuntimeException("メッセージはでないはずだよ"); 66 } 67 } 68 69 public void setLeftNext(Scene scene) { 70 this.leftNext = scene; 71 } 72 73 public void setRightNext(Scene scene) { 74 this.rightNext = scene; 75 } 76} 77 78/** 進行役. */ 79class GameMaster { 80 81 private Scene currentScene; 82 private Map<Integer, Scene> sceneList = new HashMap<Integer, Scene>(); 83 84 public GameMaster() { 85 Scene gameClear = new SceneImpl(1, "おめでとう、クリアです。"); 86 Scene gameOver = new SceneImpl(14, "ゲームオーバーです。"); 87 88 sceneList.put(1, gameClear); 89 sceneList.put(14, gameOver); 90 sceneList.put(2, new SceneImpl(2, "2: どうする?")); 91 sceneList.put(3, new SceneImpl(3, "3: どうする?")); 92 sceneList.put(4, new SceneImpl(4, "4: どうする?")); 93 ((SceneImpl)sceneList.get(2)).setLeftNext(sceneList.get(2)); 94 ((SceneImpl)sceneList.get(2)).setRightNext(sceneList.get(3)); 95 ((SceneImpl)sceneList.get(3)).setLeftNext(sceneList.get(4)); 96 ((SceneImpl)sceneList.get(3)).setRightNext(sceneList.get(14)); 97 ((SceneImpl)sceneList.get(4)).setLeftNext(sceneList.get(1)); 98 ((SceneImpl)sceneList.get(4)).setRightNext(sceneList.get(3)); 99 100 this.currentScene = sceneList.get(2); 101 } 102 103 public void startSession() { 104 Scanner scan = new Scanner(System.in); 105 while(true) { 106 List<Integer> choise = this.currentScene.printScene(); 107 if (choise == null || choise.size() == 0) { 108 break; 109 } 110 111 String inputStr = scan.next(); 112 try { 113 int inputNum = Integer.parseInt(inputStr); 114 if (choise.contains(inputNum)) { 115 this.currentScene = this.currentScene.chooseNext(inputNum); 116 } else { 117 throw new NumberFormatException("そんな選択肢ないです。"); 118 } 119 } catch(NumberFormatException e) { 120 // 14へ行け 121 this.currentScene = sceneList.get(14); 122 } 123 } 124 System.out.println("おわり"); 125 } 126}
投稿2017/10/12 10:19
編集2017/10/13 17:45退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。