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

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

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

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

Q&A

2回答

1532閲覧

javaで宝探しゲームを作る

Banyan

総合スコア6

Java

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

0グッド

0クリップ

投稿2017/09/23 14:53

###前提・実現したいこと
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

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

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

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

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

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

guest

回答2

0

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

Java

1// TreasureHunter.java 2public class TreasureHunter { 3 private TreasureHunter() { 4 Map map = new Map(5, 2); 5 map.printMapWithoutTreasure(); 6 7 System.out.println("Treasure : "); 8 System.out.println("Founded : "); 9 System.out.print("Where is Treasure? : "); 10 } 11 12 public static void main(String[] args) { 13 new TreasureHunter(); 14 } 15}

Java

1// Map.java 2public class Map { 3 static private final int TREASURE = 2; 4 private int[][] map; 5 6 public Map(int mapSide, int numOfTreasure) { 7 map = new int[mapSide][mapSide]; 8 9 for(int i = 0; i < numOfTreasure; i++) { 10 Point pt; 11 do { 12 pt = Point.getRandomPoint(mapSide); 13 } while(!setTreasure(pt)); 14 } 15 } 16 17 public void printMapWithoutTreasure() { 18 printMapWithTreasure(' '); 19 } 20 private void printMapWithTreasure(char mark) { 21 int side = map.length; 22 23 System.out.print(" "); 24 for(int x = 0; x < side; x++) { 25 System.out.print(x + " "); 26 } 27 System.out.println(""); 28 for(int y = 0; y < side; y++) { 29 System.out.print((char)('a' + y) + " "); 30 for(int x = 0; x < side; x++) { 31 if(isTreasure(new Point(x, y))) { 32 System.out.print( "| " + mark + " "); 33 } 34 else{ 35 System.out.print( "| " ); 36 } 37 } 38 System.out.println("|"); 39 } 40 } 41 42 private boolean setTreasure(Point pt) { 43 if(isTreasure(pt)) return false; 44 45 setAt(pt, TREASURE); 46 return true; 47 } 48 private boolean isTreasure(Point pt) { 49 return getAt(pt) == TREASURE; 50 } 51 52 private int getAt(Point pt) { 53 return map[pt.x()][pt.y()]; 54 } 55 private void setAt(Point pt, int arg) { 56 map[ pt.x() ][ pt.y() ] = arg; 57 } 58}

Java

1// Point.java 2class Point { 3 private int x_, y_; 4 5 public Point(int x, int y) { 6 this.x_ = x; 7 this.y_ = y; 8 } 9 @override 10 public String toString() { 11 return x_ + ", " + y_; 12 } 13 public int x() { return x_; } 14 public int y() { return y_; } 15 16 static public Point getRandomPoint(int mapSide) { 17 int x = (int)(mapSide * Math.random()); 18 int y = (int)(mapSide * Math.random()); 19 return new Point(x, y); 20 } 21}

実行結果

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

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

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


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

投稿2017/09/23 15:46

LouiS0616

総合スコア35658

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

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

LouiS0616

2017/09/23 15:52

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

2017/09/23 15:54

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

2017/09/23 16:43

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

2017/09/23 17:12

結構適当に作ったので、必要に応じて作り変えてくださいね。 単に、『Javaならオブジェクト指向しようよ』という主張をしたかっただけなので。 にしこくんの始球式の動画を見たときにキュンときました。
guest

0

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

投稿2017/09/23 15:05

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問