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

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

ただいまの
回答率

90.50%

  • Java

    13803questions

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

  • Swing

    227questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

  • ゲーム開発

    166questions

Java マインスイーパもどきのゲームでの爆弾生成の配置

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 234

パワ○ケ3,8にあるような地雷原を1マスずつ進むようなマインスイーパもどきのゲームを作りました
下記の画像のような感じで4つの難易度があります(オレンジがスタートで青がゴール、ピンクが爆弾)
イメージ説明
大体完成したので少し遊んでみたのですが、爆弾の生成を穴掘り法でやっているせいか少し配置がよろしくないなと感じました。
自分が思う問題点は

  • 迷路用のアルゴリズムから少し壁を削ったものを爆弾としているせいで、やたら直線が多い
  • 迷路用のアルゴリズム(ry、爆弾がないところがやたらうねうねしている
  • 迷路用(ry、マインスイーパにあるような爆弾が無いところが集まった部屋のようなものがほとんどない
  • 迷(ry、いわゆる運ゲーになることがかなり多い。(これは部屋が少ないことにも関連すると思います)

といったものです。(高難易度になるほど顕著)
穴掘り法のアルゴリズムもまるまる拾ってきたものなので、こういった問題点を解消して爆弾を生成するロジックがまるで浮かびません。

そこで、皆さんに
①,もっとこういう爆弾の配置にしたほうがいい。自分ならこういう配置にする。(爆弾以外にもスタートゴールの位置なども含めて)
②,①であげた配置や、↑の問題点リストを解消するために自分ならこう書く。(これを教えていただけるとすごくありがたいです)
以上の二点で①だけでもいいのでご意見をお伺いしたいです。どうかよろしくお願いします

以下爆弾作成のソースなど

import java.util.*;
import java.security.SecureRandom;

public class Maze {
    public static int[][] maze;

//maze作成は穴掘り法そのまんまなので省略//

    public static void outputMaze(int[][] maze) {   /
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++) {
                if (maze[i][j] == 0) {
                    int ran = new SecureRandom().nextInt(10);
                    if (ran>6) {  //壁をランダムに3割削っている
                        maze[i][j] = 1; //0が壁(=爆弾),1が通路
            }
        }
    }
}
import java.security.SecureRandom;

public class Square {
    public static int[] currentSquare = {0,0};
    public static int[] goalSquare = {0,0};
    public static int difficulty; //難易度別のマスの数(9*9とか19*19とか)

    public static void decideSquare (int difficulty) {     //スタートとゴールを決める
        Square.difficulty = difficulty; 
        int[][] maze = Maze.maze;

        int center = (difficulty-1)/2-1; //ちょうど真ん中の列
        int ranStart = new SecureRandom().nextInt(3);
        int[] startSquare = {0,center + ranStart-1};  //スタートは最上列真ん中と左右1つずつからランダム
        currentSquare = startSquare;
        for(int i=1; i<4; i++) { //スタート地点を0にするように(周りに爆弾がないように)
            maze[1][startSquare[1]+i-1] = 1;
            maze[2][startSquare[1]+i-1] = 1;
        }

        for(;;){
            int ranGoal = new SecureRandom().nextInt(center*2+1)-center;
            goalSquare[0] = difficulty-3;
            goalSquare[1] = center + ranGoal; //ゴールは最下列全てからランダム(爆弾があったらやり直し)
            if (maze[goalSquare[0]+1][goalSquare[1]+1]==1) {  //爆弾がないとき
                break;
            }
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • sakura_hana

    2018/05/13 10:05

    元ゲームを知らなくて恐縮なのですが、「スタートとゴールが存在する」は必須要件なのでしょうか? またクリア条件は何なのでしょうか?(ゴールする?全部の爆弾を見付ける?)

    キャンセル

  • michaelyuki0908

    2018/05/13 12:27

    マインスイーパと違い上下左右に1マスずつしか進めないのでスタートとゴールは必須です。(場所は近すぎなければどこでもいいと思います) またクリア条件は「爆弾を踏まずにゴールする」です。一応マインスイーパのように右クリックで爆弾をマークできる機能はつけています。

    キャンセル

まだ回答がついていません

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

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

関連した質問

  • 解決済

    国旗を表示させたい(続き)

    前提・実現したいこと btn [0][1][2]をクリックすると、それに対応した国旗が表示されるようにしたい。 ソースコード import java.awt.*;   

  • 解決済

    Javaの乱数

    実現したいこと Javaで乱数(ランダムな数値(整数の正数のみ))を作成したいのですが、対象範囲は連番じゃなきゃダメですか? 例えば 1・3・5・7・9のように偶数または

  • 解決済

    javaで作れる学習プログラムってどのようなものが作れますか

    意図 javaを使って学習プログラムを作成してほしいといわれました。 しかし、イメージがわきません。 どんなものが作れるのでしょうか

  • 解決済

    java eclipseについて

    java eclipseでスライドパズルを作成しています。 9枚の画像で作成しており、現在は9枚の画像を実行するたびにランダムで表示するところまでいきました。 その後ですが9枚

  • 解決済

    ワニワニパニックをjavaで作りたいのですがうまくできません。お助けください。

    前提・実現したいこと スタートボタンによりゲームを開始、ゲーム終了後にスタート画面に戻る。 ワニの出る位置を固定したい。 1分間でゲーム終了。 得点のランキング付け。 発生して

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

  • Java

    13803questions

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

  • Swing

    227questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

  • ゲーム開発

    166questions