質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

3515閲覧

ifより前の文に戻る方法が知りたいです

kitirabo3

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/10/12 09:58

Java初心者で、Eclipsで簡単なゲームを作っています。

選択肢で1か2をキーボードで入力してもらい、1ならバッドエンドの内容のあと直前の選択肢に戻し、2ならそのままゲームが続くようにしたいのですが、ifを使うとバッドエンドの後にどうやって分岐前である直前の選択肢まで戻すのかが分からず困っています。

また、ループの有無に関わらずあるポイントに戻る(ゲームでいうロード)ことはできるのでしょうか?

初歩的な質問で申し訳ありませんが、どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

root_jp

2017/10/13 00:56

今できているところまでのコードを載せた方が回答はつきやすいですよ。
guest

回答1

0

状態遷移をループ処理の中で実現する以外の実装例として、デザインパターンの1つである State パターンというものがあります。
これを各シナリオのシーンごとに実装すると状態遷移を容易にすることができるのではないかと思います。

State パターン - Wikipedia

セーブやロードの実装では、今のゲーム位置がシナリオのどの部分かといった情報の他に、その時の進行状況(俗にフラグと呼ばれるものです)を管理する必要があるかと思います。
その情報を元に、適切な状態を再現することで、ロード処理を実装することが可能です。

簡単な実装例を紹介できればと思いましたが、すぐに思いつかなかったので上記の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

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問