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

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

ただいまの
回答率

88.23%

Javaでマス当てゲームを作りたい

解決済

回答 1

投稿 編集

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

astray78

score 9

前提・実現したいこと

Javaで5*5のマス目から当たりを見つけるプログラムを作りたいと考えています。
インターネットで下記のプログラムを見つけ応用できないかと思っています。
プログラムで追加したいこと
・5*5のマスの下に当たりの数を表示する 例 当たり:
・見つけた当たりの数を表示する 例 見つけた当たり:
・すべての当たりを見つけたらMission Conpleteと表示し、すべての当たりを見つけるまでに選択した回数を表示する 例 あなたが当たりをすべて見つけるまでX回かかりました。

以上です。よろしくお願いします。

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

該当のソースコード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;


public class sagasu2 {
    //public class Game {

        private boolean map[][];
        private boolean picked[][];

        public void init(int size) {
        if (size > 0) {
        map = new boolean[size][size];
        picked = new boolean[size][size];
        Random rand = new Random();
        int x = rand.nextInt(size);//当たりの位置
        int y = rand.nextInt(size);
        map[x][y] = true;
        } else
        System.out.println("No Such Place!!");

        }

        public boolean guess(int x, int y) throws NumberFormatException{
        if (map != null && x >= 0 && x < map.length && y >= 0
        && y < map[0].length) {
        picked[x][y] = true;
        return map[x][y];
        } else throw new NumberFormatException();
        }

        public boolean renderGrid() {
        String s = " ";
        if (picked == null)
        return false;
        for (int i = 0; i < picked.length; i++)
        s += " "+i+" ";
        s+="\n";
        for (int i = 0; i < picked.length; i++) {
        s += i+"|";
        for (int j = 0; j < picked[i].length; j++) {
        if (picked[i][j])
        s += " X |";
        else
        s += " ? |";
        }
        s += "\n";
        }
        System.out.println(s);
        return true;
        }

        public static void main(String[] args) {
        try {
        sagasu2 g = new sagasu2();
        int size = 5;
        g.init(size);
        BufferedReader br = new BufferedReader(new InputStreamReader(
        System.in));
        int x = -1;
        int y = -1;
        System.out.println("java TreasureHunter");
        while (true) {
        try {
        g.renderGrid();
        //当たりの数
        //見つけた数
        //同じところを選んだらAlready Selected!!
        //当たりをすべて見つけたら☆☆Mission Complete!!☆☆と表示.クリックした回数を表示
        System.out.print("縦の位置は?");
        x = Integer.parseInt(br.readLine());
        System.out.print("横の位置は?");
        y = Integer.parseInt(br.readLine());

        if(g.guess(x, y)){
        System.out.println("\n正解!");
        //for(int i = 0; i<g.length; i++){
        //System.out.println("Founded  :" + g.length);
        System.out.print("続ける(Y)?");
        if(!br.readLine().equals("Y")){
        break;
        }else g.init(size);

        }else System.out.println("\nはずれ!\n\n" +
        "");
        } catch (NumberFormatException e) {
        System.out.println("ERROR : 位置を確認して下さい\n");
        }

        }

        } catch (Exception e) {
        e.printStackTrace();
        }
        }

        }

試したこと

見つけた当たりや見つけるまでに選択した回数をfor文で回してできるかと思いましたがうまくいきませんでした。

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

Eclipseで開発しています

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • astray78

    2016/11/30 20:14

    期待していたこと System.out.print("縦の位置は?"); x = Integer.parseInt(br.readLine()); System.out.print("横の位置は?"); y = Integer.parseInt(br.readLine()); if(g.guess(x, y)){ System.out.println("\n正解!"); //for(int i = 0; i<g.length; i++){ //System.out.println("Founded :" + g.length); の部分で for文を回し、当たりの数:  見つけた数: が出ることを期待していました。 結果 System.out.println("Founded :" + g.length);が「Founded :」と出力されると思っていましたが、 表示されませんでした。

    キャンセル

  • Y.H.

    2016/11/30 20:45

    astray78さん。ここではなく質問の試したことに記載いただいた方がいいです。ここに書いても見ずらいですし、この欄は表示した時点では閉じています。

    キャンセル

  • astray78

    2016/11/30 23:59

    >>Y.H.さん ありがとうございます。ここを使うのは初めてなものでお手数かけて申し訳ございません。

    キャンセル

回答 1

checkベストアンサー

0

以下が追加後です

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.*;

public class RTS {

    private static boolean map[][];
    private static boolean picked[][];
    private static boolean at[][];

    static int atar = 6;// 当たりの数
    static int remai = atar;
    static int cou = 0;

    public void init(int size) {
        if (size > 0) {
            if (atar > (size * size) || atar < 0) {
                System.out.println("当たりのの数が多すぎるか0より少ない");
                System.exit(1);
            }
            map = new boolean[size][size];
            picked = new boolean[size][size];
            at = new boolean[size][size];

            Random rand = new Random();
            ArrayList<Integer> a = new ArrayList<>();
            for (int b = 0; b < (size * size); b++) {
                a.add(b);
            }

            Collections.shuffle(a);
            for (int y2 = 0; y2 < atar; y2++) {
                int a3 = a.get(0);
                a.remove(0);
                int x = a3 / size;// 当たりの位置
                int y = a3 % size;
                map[x][y] = true;
            }

        } else
            System.out.println("No Such Place!!");

    }

    public boolean guess(int x, int y) throws NumberFormatException {
        if (map != null && x >= 0 && x < map.length && y >= 0
                && y < map[0].length) {
            picked[x][y] = true;
            return map[x][y];
        } else
            throw new NumberFormatException();
    }

    public boolean renderGrid() {
        String s = "    ";
        if (picked == null)
            return false;
        for (int i = 0; i < picked.length; i++)
            s += "  " + i + "  ";
        s += "\n";
        for (int i = 0; i < picked.length; i++) {
            s += " " + i + " | ";
            for (int j = 0; j < picked[i].length; j++) {
                if (at[i][j]) {
                    s += " ◎ |";

                } else if (picked[i][j]) {
                    s += " × |";
                } else
                    s += " ? |";
            }
            s += "\n";
        }
        System.out.println(s);
        return true;
    }

    public static void main(String[] args) {
        try {
            RTS g = new RTS();
            int size = 5;
            g.init(size);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    System.in));
            int x = -1;
            int y = -1;
            System.out.println("java TreasureHunter");
            while (true) {
                try {
                    g.renderGrid();
                    System.out.println("見つけた当たり:" + (atar - remai));

                    // 当たりの数
                    // 見つけた数
                    // 同じところを選んだらAlready Selected!!
                    // 当たりをすべて見つけたら☆☆Mission Complete!!☆☆と表示.クリックした回数を表示
                    System.out.print("縦の位置は?");
                    x = Integer.parseInt(br.readLine());
                    System.out.print("横の位置は?");
                    y = Integer.parseInt(br.readLine());


                    cou++;

                    if (g.guess(x, y)) {
                        System.out.println("\n正解!");
                        map[x][y] = false;
                        at[x][y] = true;
                        remai--;
                        if (remai == 0) {
                            System.out.println("☆☆Mission Complete!!☆☆");
                            g.renderGrid();
                            System.out.println("あなたが全ての当たりを見つけるまで" + cou
                                    + "回かかりました");

                            System.out.print("続ける(Y)?");
                            if (!br.readLine().equals("Y")) {
                                break;
                            } else
                                g.init(size);
                        }

                    } else
                        System.out.println("\nはずれ!\n\n" + "");
                } catch (NumberFormatException e) {
                    System.out.println("ERROR : 位置を確認して下さい\n");
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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