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

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

ただいまの
回答率

88.04%

JAVAのコンソールログでRPGの作成

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,574

score 35

学校の課題でコンソールログで動くRPGを作れといわれました
以下のコードなのですが主人公(●)が動きません
どうすれば動ききますか?
import java.util.Scanner;


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 = 18;
        int y = 6;
        map.main[x][y] = hero;
        int a = 0;
        do {


        //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 = {{"海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海"},
            {"海","海","山","山","山","山","山","山","山","山","山","山","山","草","草","草","草","草","海","海"},
            {"海","山","山","山","山","山","山","山","山","山","山","山","草","草","草","草","草","草","草","海"},
            {"海","山","山","山","山","山","山","山","山","山","草","草","草","草","草","草","草","草","草","海"},
            {"海","山","山","山","山","山","山","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","海"},
            {"海","森","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","森","森","森","森","森","森","森","森","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","城","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","草","森","森","森","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","森","森","森","森","海"},
            {"海","草","草","草","草","道","草","草","草","草","草","草","草","草","草","草","森","森","森","海"},
            {"海","草","草","草","道","道","道","道","道","道","道","道","道","街","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","草","草","草","道","草","草","草","草","草","草","草","草","草","草","草","草","草","草","海"},
            {"海","海","草","道","道","道","草","草","草","草","草","草","草","草","草","草","草","草","海","海"},
            {"海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海","海"}};


    


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+3

初心者らしいバグなので、丁寧めに説明します。

悪くないコードですが、インデントなど調整して少し読みやすくしました。
(個人的な好みもあるので、これが正解ではありません。)
更にコメントをして各々の処理に名前をつけました。


import java.util.Scanner;

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 = 18;
        int y = 6;

        // 主人公をマップに配置
        map.main[x][y] = hero;
        int a = 0;
        // メインループ
        do {    
            //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 RPG {
    public static void main(String[] args) {
        // 1、初期メッセージ
        // 2、最初のコマンド取得

        //3,マップの読み込み
        //4,主人公の位置設定
        //5,主人公をマップに配置

        // 6,メインループ
        do {    
            //7,Mapの表示
            // 8,次のコマンド取得
            // 9,主人公の位置を更新
        }while(true);
    }
}
メインループの中で次のコマンドを受け取り(8)、主人公の位置を変更(9)していますが、メインループの外でしか主人公をマップに配置(5)していないので、最初の配置から主人公は移動しません。主人公の配置をメインループに足しましょう(9の後?)。

そうすると、主人公の位置は更新されますが、argiusさんの1で指摘する問題が出ます。

他にも、指摘したいところ、バグありますが、グッと我慢します。一つずつ解決しプログラムが進化する楽しみを奪いたくないからです。バグにあたったらまた、質問を作成して下さい。楽しみにしています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/16 22:02

    丁寧にありがとうございます!!
    明日はおそらく台風の影響で学校が休みなのでご指摘していただいた場所の改善に没頭します!

    キャンセル

  • 2015/07/16 22:08

    応援します。

    キャンセル

  • 2015/07/17 10:31

    おはようございます・・・。
    あられから試行錯誤していろいろ試したらエラーだらけで・・・
    なにから手を付けたらいいかもわからなくなりました><
    なにをどこにどう書けばいいでしょうか。。。

    キャンセル

+1

1. マップに直接主人公を書きこんでしまうと、主人公が移動した後のマップをどうやって元に戻すのかという問題が発生します。
2.map.main[x][y] = hero;というコードは、後からxyの値を変えても、heroの位置は変わりません。


ループの中で、主人公が居る位置に来た時に、マップの代わりに主人公を出力してあげるようにしてみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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