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

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

ただいまの
回答率

87.51%

JavaのコンソールログでRPG

受付中

回答 4

投稿

  • 評価
  • クリップ 5
  • VIEW 2,549

score 35

こんにちは
先日同じ内容を質問させていただきヒントをもらって少しだけ進歩しました。
ですがやはりわからないことが何個もあり、お尋ねしたいです。
質問内容
1、主人公(●)を移動させたら足跡のように●が増えていくのですがそれを解消するにはどうすればいいですか?
2、Mapで海や壁には●は入り込めなくするにはどうすればいいですか?
3、城のマスに●が来た時にマップをcastleにするにはどうすればいいですか?

考えていろいろ試行錯誤したのですがもう限界です・・・。
模範回答を教えてください・・・。
理解したいのでできれば説明もほしいです
お願いだらけで申し訳ありません
public class RPG {

    public static void main(String[] args) {
        System.out.println("hで左、kで右、uで上、jでした");
        Scanner sc = new Scanner(System.in);

        Map map = new Map();
        String hero = "●";
        int x = 6;
        int y = 18;
        map.main[y][x] = hero;
        //do~whileを回すためにとりあえず入れている
        int a = 0;
        do {
            String temp = map.main[y][x];
            map.main[y][x] = hero;


        //Map
        for(int i = 0; i < map.main.length; i++){
            for(int j = 0; j < map.main[0].length; j++){
                if(j % 20 == 0){
                    System.out.println();
                }else {
                    System.out.print(map.main[i][j]);
                }
            }
        }


        System.out.println();
        System.out.println("下に入力");
        String action = sc.next();

        switch(action){

        case "h":
            x--;
            break;

        case "k":
            x++;
            break;

        case "u":
            y--;
            break;

        case "j":
            y++;
            break;

        default:
            break;
        }



    }while( a == 0);

}
}
public class Map {
    String[][] main = {{"海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海"},
            {"海","海","山","山","山","山","山","山","山","山","山","山","山","草","草","草","草","草","海","海"},
            {"海","山","山","山","山","山","山","山","山","山","山","山","草","草","草","草","草","草","草","海"},
            {"海","山","山","山","山","山","山","山","山","山","草","草","草","草","草","草","草","草","草","海"},
            {"海","山","山","山","山","山","山","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","城","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","草","森","森","森","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","森","森","森","森","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","草","森","森","森","海"},
            {"海","草","草","草","道","道","道","道","道","道","道","道","道","街","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","海","草","道","道","道","草","草","草","草","草","草","草","草","草","草","草","草","海","海"},
            {"海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海"}};

    String[][] town = {{"出","出","出","出","出","出","出","出","出","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","草","武","草","草","草","草","道","草","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","草","防","草","草","草","草","宿","草","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","草","草","草","草","草","草","草","草","出"},
            {"出","出","出","出","出","出","出","出","出","出"}};

    
    String[][] castle = {{"壁","壁","壁","壁","壁","壁","壁","壁","壁","壁"},
            {"壁","壁","壁","壁","王","壁","壁","壁","壁","壁"},
            {"壁","道","道","道","道","道","道","道","道","壁"},
            {"壁","道","道","道","道","道","道","道","道","壁"},
            {"壁","道","壁","道","道","道","道","壁","道","壁"},
            {"壁","道","道","道","道","道","道","道","道","壁"},
            {"壁","道","道","道","道","道","道","道","道","壁"},
            {"壁","道","壁","道","道","道","道","壁","道","壁"},
            {"壁","道","壁","道","道","道","道","壁","道","壁"},
            {"壁","壁","壁","壁","出","出","壁","壁","壁","壁"}};


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

すごい・・・
なかなか面白い試みですね。

1.足跡の様に残ってしまうのは、mapの中身を書き換えてしまっているので
前回書き換えた情報がmapの中に残ってしまっているためですね。
なので、mapの値を書き換えるのではなく、mapを出力する中で
座標がキャラクターの座標なら、●を出す。
という風にしてあげればいいです。
            for (int i = 0; i < map.main.length; i++) {
                for (int j = 0; j < map.main[0].length; j++) {
                    if (j % 20 == 0) {
                        System.out.println();
                    } else if(i == y && j == x) {
                        System.out.print(hero);
                    } else {
                        System.out.print(map.main[i][j]);
                    }
                }
            }
こんな感じですね。で、map.main[y][x] = hero;としている個所は削除で。

2.行けない場所を作りたいのであれば、キーを入力した後、座標をそのまま修正するのではなく
行こうとしている場所がなんなのかを取得して、NGだったら動かさない、とすれば行けます。
switch(action)の中でtempXやtempYを作って、map[x][tempY]が"海"か"壁"なら、yは変えずに
メッセージを出す。 という感じでやってみてください。

3.2と同じやり方で次に行こうとしている場所はわかるはずなので、それが"城"だったら
mapをcastleにする、とすればいけます。

すごく面白い試みなので頑張ってください。

あと、一通り動くようになったら、是非オブジェクト化を考えて作り直してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/26 06:31

    卒業がかかっているのでふざけてなどいません
    その立っている場所という意味が理解できません
    どんだけ考えても条件式がわかりませんでした
    念を押させてもらいますがみなさんに教えていただき私の力不足で解決に至りませんでしたがふざけている気持ちなど一切ないのでご理解ください

    キャンセル

  • 2015/07/26 09:21

    諦めたなら時間に追われずゆっくり取り組めますね^^
    さて、hero == map.main[10][5]という条件式ですが、
    左辺のheroが保持しているのは「●」という主人公のアイコン情報で、
    主人公の位置を一切保持していないことはわかると思います。
    方や右辺のmap.main[10][5]ですが、こちらは書き換えないことにしたので、
    常に「城」を返すこともわかると思います。
    MakotoMiyazakiさんが言っていた
    if("●" == "城") {
    と同じです。
    とはこういうことです。
    では主人公の位置を保存している変数はどれでしょうか?
    x,yですね。
    現在のmapはcurrentMap[][]で表すことにしたのですから
    主人公の位置が"草"なのか"道"なのか...は
    currentMap[x][y]で取得できるということです
    swordoneさんの言いたいことは多分こういうことです。

    キャンセル

  • 2015/07/26 10:25

    これまでのコードの流れからするとcurrentMap[y][x]ですが、その通りです。
    あとはその場所が城なのかという判定はcurrentMap[y][x].equals("城")でできます。
    (x,y)=(10,5)という条件でもいいのですが、マップの城の位置が変わったときに応用できません。

    キャンセル

+1

答えそのものではないです。

一週間考えて、それでもできないのなら、
おそらく考え方が効率的でないのかなと思いますので、
考え方の例を書きます。

机上でのステップ実行をおすすめします。
それも、データをもっと小さくし、扱いやすくしてからです。

まずは草だけのMapにします。

public class Map {
    String[][] main = {
        {"草","草","草","草","草"},
        {"草","草","草","草","草"},
        {"草","草","草","草","草"},
        {"草","草","草","草","草"},
        {"草","草","草","草","草"}};
town、castleはそのままで良いです。

Mapに合わせて、
xとyの初期値も変えておきましょう。

        int x = 2;
        int y = 2;

それから、ノートに手書きでも、エディタなどで書いても良いのですが、
x、yを初期化した次の行から以下を実施します。

  1. x、y、map.mainの内容を書く
  2. 行の内容を頭の中で実行する。
  3. 実行した結果、何かキー入力が必要なら、適当に決めてそれを書く。
  4. 実行した結果、画面に何か出力する場合はそれを書く。
  5. 次の行に進み、1.に戻る。

時間はかかりますが、
これを実施するとどの様に動いているか、
問題が何かを把握できるかと思います。
また、疑問点1についても、どうして●が増えていくのか
分かるのではないでしょうか。

それで問題の原因が分かれば、MakotoMiyazakiさんの
回答の意味も分かるのでは?
と思います。

問題が一つ解消したら、
今度はMapに海、壁をひとつずつ入れてみて、
同様に机上ステップ実行していくと、どこに判定処理を
入れれば良いのかなども分かりそうです。

慣れてくると、
ある程度は頭の中で実行できるようになりますが、
最初は書き出してみると良い、と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/23 22:17

    プログラミングの習得は結局
    「頭のなかに動作環境を作る」事になると思います。
    「脳内動作環境で動かす」→「現実との結果と比べる」→「脳内動作環境を修正する」の
    繰り返しで、コードを見て動作がわかるようになります。(多分)
    で、慣れないうちはeripongさんの回答のように紙とペンを補助に使って動作をシミュレーションするのが
    結構効果的だと思います。

    キャンセル

+1

どんなアドバイスが出来るかな、と考えながらコーディングしました。
https://gist.github.com/iwamoto-takaaki/e58aab72ed5db31c1378

残念ながら、使う機会は無いようですが、一応公開します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コメント欄のソースを拝見しましたが、コピペプログラムになっています。
「//Mapmain」と「//Mapcastle」は似たことを繰り返しています。
メソッドに切り出せば、半分くらいの長さになりそうです。

「class RPG」は一枚岩ですが、そろそろメソッドに切り出したい。
たとえば、初期化と、マップ表示と、移動判定の、3つのメソッドに切り出せます。
(ご自分でもキリが良いと感じているから、空白行で仕切っているのでしょうし)

ですから、まずなるべくメソッドへ切り出すことをおすすめします。
期限に追われて余裕もないでしょうが、そのほうが結局は早く完成します。
もし今回はもう見送るとしても、切り出しの習得はいずれ必須でしょう。

元のソースは保存すればいつでも戻れるので、
メソッドの切り出しに挑戦するのをおすすめします。


なぜ、メソッドに分けるのが重要かというと、メソッドのレベルで考えられるからです。
行や命令文のレベルだけで考えていても、直しては詰まり、直しては詰まりのいたちごっこです。

たとえば、「●は入り込めなくする」「マスに●が来た時」は移動判定のメソッドの役割だし、
「マップをcastleにする」はマップ表示のメソッドの役割だと、責任分担をすぐ特定できます。
メソッド化、構造化によって、日本語(要件の言葉)とコードを翻訳しやすくなるのです。

問題を分割して解決するのは、どんな言語や開発手法でも通用する普遍的な定石です。

コピペをメソッドにくくり出して共通化すると、複雑性が減って考えやすくなります。
テストもしやすくなります。それだけで問題は半分解決したようなものです。

(もっとも、Javaで本格的に組むなら、さらにクラスやオブジェクトに切り出すのですが、
本格的なOOPは難しいので、とりあえずは関数(メソッド)への構造化で良いでしょう。)


ご質問されたYoshinoriさんの過去の質問にもお答えしましたが、
JavaScriptのときはfunctionに切り分けられていました。

もしかしたら、Javaのクラスやメソッドを書く手続き(を調べるの)が煩雑で面倒、
と感じられているのかもしれませんが、それだと後にツケを回すことになります。

インデントの対応など、切り出し以外でのコードの書き方はわりとキレイで良いと思います。
切り出し(構造化)をマスターすると飛躍的に伸びるので、がんばってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る