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

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

ただいまの
回答率

90.98%

  • Java

    12200questions

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

javaで宝探しゲームを作る

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 251

Banyan

score 0

前提・実現したいこと

javaを使って簡単な宝探しゲームを作成しようと考えています。

キーボードから座標を入力(例えば3-a, 5-cなど)して、下記の表が宝箱の有無によって表示を変えるようにしたいです。
初期状態では空欄のまま、選択した座標に宝が無ければ"-"(半角ダッシュ記号)、宝があれば"○"を表示します。
宝を2個発見できればプログラムが終了します。

また、既に選択した座標を再び入力する、存在しない座標(例えばaaaなど)を入力すると警告文が表示されるようにしたいです。

発生している問題・エラーメッセージ

###該当のソースコード

ここに言語を入力
package treasurehunter;

import java.util.Scanner;
public class TreasureHunter {

public static void main(String[] args) {
int [][] map = new int[5][5];
boolean flag;//繰り返し用
int treasure1x = (int) (5*Math.random());//宝1のx座標
int treasure1y = (int)(5*Math.random());//宝1のy座標
map [treasure1x][treasure1y] = 2;
int treasure2x = (int)(5*Math.random());//宝2のx座標
int treasure2y = (int)(5*Math.random());//宝2のy座標
map [treasure2x][treasure2y] = 2;

System.out.println("    1   2   3   4   5");
System.out.println("  +---+---+---+---+---+");
System.out.println("a |   |   |   |   |   |");
System.out.println("  +---+---+---+---+---+");
System.out.println("b |   |   |   |   |   |");
System.out.println("  +---+---+---+---+---+");
System.out.println("c |   |   |   |   |   |");
System.out.println("  +---+---+---+---+---+");
System.out.println("d |   |   |   |   |   |");
System.out.println("  +---+---+---+---+---+");
System.out.println("e |   |   |   |   |   |");
System.out.println("  +---+---+---+---+---+");
System.out.println();
System.out.println("Treasure : ");
System.out.println("Founded : ");
System.out.print("Where is Treasure? : ");

}

}

```

試したこと

「java 宝探し」で検索したりして手がかりを探したのですが、結局自力では完成させることができませんでした。
何をどうすれば良いか、どの処理をどう組み合わせればいいかも分かりません。
記載したソースコードを訂正・完成させてくださるのは勿論のこと、ヒントの提示(できるだけ具体的に)だけでも構いません。
皆さんの智恵を貸していただければ幸いです。

補足情報(言語/FW/ツール等のバージョンなど)

主に参考にしたページです。
http://www.fit.ac.jp/~m-ishihara/Lectures/JavaProgramming1/11/JavaProgramming1_Assignment(11).pdf

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

即興で、質問者様のコードを改造してみました。

// TreasureHunter.java
public class TreasureHunter {
    private TreasureHunter() {
        Map map = new Map(5, 2);
        map.printMapWithoutTreasure();

        System.out.println("Treasure : ");
        System.out.println("Founded : ");
        System.out.print("Where is Treasure? : ");
    }

    public static void main(String[] args) {
        new TreasureHunter();
    }
}
// Map.java
public class Map {
    static private final int TREASURE = 2;
    private int[][] map;

    public Map(int mapSide, int numOfTreasure) {
        map = new int[mapSide][mapSide];

        for(int i = 0; i < numOfTreasure; i++) {
            Point pt;
            do {
                pt = Point.getRandomPoint(mapSide);
            } while(!setTreasure(pt));
        }
    }

    public void printMapWithoutTreasure() {
        printMapWithTreasure(' ');
    }
    private void printMapWithTreasure(char mark) {
        int side = map.length;

        System.out.print("    ");
        for(int x = 0; x < side; x++) {
            System.out.print(x + "   ");
        }
        System.out.println("");
        for(int y = 0; y < side; y++) {
            System.out.print((char)('a' + y) + " ");
            for(int x = 0; x < side; x++) {
                if(isTreasure(new Point(x, y))) {
                    System.out.print( "| " + mark + " ");
                }
                else{
                    System.out.print( "|   " );
                }
            }
            System.out.println("|");
        }
    }

    private boolean setTreasure(Point pt) {
        if(isTreasure(pt)) return false;

        setAt(pt, TREASURE);
        return true;
    }
    private boolean isTreasure(Point pt) {
        return getAt(pt) == TREASURE;
    }

    private int getAt(Point pt) {
        return map[pt.x()][pt.y()];
    }
    private void setAt(Point pt, int arg) {
        map[ pt.x() ][ pt.y() ] = arg;
    }
}
// Point.java
class Point {
    private int x_, y_;

    public Point(int x, int y) {
        this.x_ = x;
        this.y_ = y;
    }
    @override
    public String toString() {
        return x_ + ", " + y_;
    }
    public int x() { return x_; }
    public int y() { return y_; }

    static public Point getRandomPoint(int mapSide) {
        int x = (int)(mapSide * Math.random());
        int y = (int)(mapSide * Math.random());
        return new Point(x, y);
    }
}

実行結果

    0   1   2   3   4   
a |   |   |   |   |   |
b |   |   |   |   |   |
c |   |   |   |   |   |
d |   |   |   |   |   |
e |   |   |   |   |   |
Treasure : 
Founded : 
Where is Treasure? : 

出力して終わりのプログラムですが、それでもこれくらい長くなります。

『かえって複雑になったじゃないか』と思うかもしれません。
しかし、ある程度柔軟な設計をしないと、後々とんでもない構造になってしまいます。
例えば、マップのサイズを変えたときを想像してみるといいです。
...私のコードも正方形のマップにしか対応していませんが。手抜きです。


『宝探し』、題材としてはとてもワクワクするのですが、案外難問だったりします。
まずはクラスの作り方/使い方を勉強した方がいいです。
いろんな資料を見て、あるいは話を聞いて、いい題材を探してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/24 00:52

    リンク先を覗いてみましたが、このような課題の指示なのですね。
    講師がどのようなレベルの回答を期待しているのかわかりませんが、そこそこ複雑な課題なので、適当に作ると地獄を見ます。
    じっくり設計することをお勧めします。

    キャンセル

  • 2017/09/24 00:54

    いや、でも、条件がかなり絞られてるんですね...
    それだったらごり押しでも作れますが、そうして得られるものがどれくらいあるか疑問です。

    キャンセル

  • 2017/09/24 01:43

    丁寧なご回答、誠にありがとうございます。
    記述していただいたコードを参考に、もう少し頑張ってみます。
    リンク先の課題そのものが出たわけではありませんが、そこそこ似通ったものだったので参考にしていました。

    …ちなみに私もにしこくんが好きです。

    キャンセル

  • 2017/09/24 02:12

    結構適当に作ったので、必要に応じて作り変えてくださいね。
    単に、『Javaならオブジェクト指向しようよ』という主張をしたかっただけなので。

    にしこくんの始球式の動画を見たときにキュンときました。

    キャンセル

0

そんなピンポイントなキーワードでヒットしません。
要件としては、「その座標を過去に選択したか否か」がわかる必要があるわけです。
こういえば何を使えばいいかわかるのではないですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    単語ごとの出現回数を出現順に表示するには、HashMapとArrayListが必要か

    単語ごとの出現回数を出現順に表示するには、HashMapとArryaListが必要でしょうか。 下記の例よりももっとスマートかつコード量が少なく使用するメモリの量が少ない方法がある

  • 受付中

    ループ化の方法

    public class Gohkaku {     public static void main(String[] args){         int math = ne

  • 解決済

    java カレンダー 土曜日改行

    4/22質問内容を少々修正いたしました。 ?????に何を入れれば土曜日で改行となりますでしょうか? ヒントとして、【int week = cal.get(java.util.

  • 解決済

    乱数表示から最大値を表示する Java

    いつもお世話になっております。 現在変数を表示させてから、最大値を求めるプログラムを組んでいます。 乱数は表示できる状態です。 開発環境Eclipse、言語はJavaです

  • 解決済

    3人のジャンケンの勝敗判定で詰まりました。オブジェクト指向でジャンケンの手をクラスに変えるには?

    うーん、欲を言えば、オブジェクト指向でこなしたいです。 ヒントはもらっています。「ジャンケンの手をクラスにする」です。 オブジェクト指向でジャンケンの手のクラスにすると、ど

  • 受付中

    ENTER実行処理

    Enterキーを押して、次の処理に移るCUIを作りたいのですが、思うようにいきません。勇者の攻撃のあとと、HP、MP表示のあとEnter押すまで次の処理しないようにしたのですが、教

  • 解決済

    00

    oooooooooooooooooooooooooooooooooooooooo

  • 解決済

    改行区切りでの出力

    ランダムな整数を改行区切りで3個出力したくて以下のコードを打ってみたんですが間違いといわれました。どこが違うのか指摘お願いします  public class Main {  p

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

  • Java

    12200questions

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