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

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

ただいまの
回答率

90.98%

  • Java

    12191questions

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

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

解決済

回答 1

投稿 編集

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

ryoutadesu

score 1

前提・実現したいこと

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

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

現在の進み具合は青い画面にランダムに画像が表示されクリックすると消え、得点が加算されます。
何度試してもスタートボタンが表示されないのとワニの位置を固定できない。

該当のソースコード

```import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class Wanipani extends JPanel { 
// モグラたたきのターゲット 
public class Mogura extends Canvas implements Runnable { 
// 表示非表示を行うスレッド 
// 新しいスレッドに変えると古いスレッドが停止する 
// run() の if 文参照 

Thread thread1; 
int count; 
Button button; 

public void init1() { 

setBackground(Color.yellow); 
button = new Button("スタート"); 
setLayout(new BorderLayout()); 
Panel pnl = new Panel(); 
pnl.add(button); 

private Image image; 
private int point; 
protected Thread thread; 

public Mogura(int p,String imagefile) { 
point = p; 
try{ 
FileInputStream in = new FileInputStream(imagefile); 
image = ImageIO.read(in); 
in.close(); 
}catch (IOException e) 

e.printStackTrace(); 

enableEvents(MouseEvent.MOUSE_PRESSED); 
init(); 

// いったん非表示にして状態を初期化 
// オブジェクト作成時とマウスでたたかれた時に使われる 
protected void init() { 
// 非表示 
setVisible(false); 
// 表示非表示スレッドを実行 &thread に設定 
// thread が上書きされこれまでのスレッドは停止する 
thread = new Thread(this); 
thread.start(); 

// Canvas クラスからのオーバーライド 
// MouseEvent を扱う MouseAdapter 以外のもう一つの方法 
// 使うイベントを enableEvents で登録しておく 
// (コンストラクタ参照) 
protected void processMouseEvent(MouseEvent e) { 
// MousePressed の際に、 
if (e.getID() == MouseEvent.MOUSE_PRESSED) { 
// 得点を追加して (MoguraPanel のメソッド) 
incScore(point); 
// 非表示にして状態を初期化 
init(); 

// Runnable インターフェイスからのオーバーライド 
// 表示非表示を繰り返す 
public void run() { 
// 無限ループ、thread が書き換わったら終了 
for (;;) { 
// 1秒間 sleep 
try { 
int t =(int)(Math.random()*500+1000); 
Thread.sleep(t); 

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

// thread 変数をチェック 
if (Thread.currentThread() != thread) { 
break; 

int ka =(int)(Math.random()*450); 
int ki =(int)(Math.random()*450); 

// 見た目を設定して表示 or 非表示 
setBounds(ka,ki,100,100); 
setBackground(Color.RED); 
setVisible(!isVisible()); 


public void paint(Graphics g) 

int w = getWidth(); 
int h = getHeight(); 
g.drawImage(image,0,0,w,h,null); 

// 得点 
protected int score = 0; 

public Wanipani() { 
// モグラたたきエリアの設定表示エリアの範囲 
setPreferredSize(new Dimension(500,500)); 
// モグラを1体配置 
add(new Mogura(10,"mogura.png")); 
add(new Mogura(-50,"bakudan.png")); 

// 得点を得たときの挙動 
protected void incScore(int p) 

score += p; 
repaint(); 

// JPanel からのオーバーライド 
// 中身の描画 
public void paint(Graphics g) { 
// 得点を表示 
g.drawString("得点: " + score, 10, 10); 
// 背景を描画 

public static void main(String[] args) { 
JFrame frame = new JFrame("ワニたたき"); 
frame.setContentPane(new Wanipani()); 
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
frame.pack(); 
frame.setBackground(Color.blue); 
frame.setVisible(true); 

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

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2018/01/13 13:16

    タイトルを書き換えないでください。後から他のユーザーが見たときに何のことかがわかりません。

    キャンセル

  • ryoutadesu

    2018/01/13 23:17

    申し訳ございません。すぐ直す予定でした。

    キャンセル

回答 1

checkベストアンサー

+4

楽しそうなネタなのですが、コードでフォローするにはちょっと時間がありません。
いくつかアドバイスだけします。

  • わにの出現位置を固定化したいなら、すべての出現位置をデータとして管理し、ランダム判定で次の出現位置を決定するようにします。
  • 出現する画像を、わにかボムか決めるのもランダム判定で決めます。
  • swingはスレッドセーフではないので、Threadクラスは使わず、javax.swing.Timerクラスを使いましょう。
  • 1分間を計るには、ゲームスタート時にシステム時間を保存し、Timerで呼ばれる処理で、1分経過したか、毎回判定します。
  • ゲームの状態を管理するには、「開始待ち」「ゲーム中」「結果表示中」など、自分のゲームに合わせたステートの管理が重要です。ステートによって、どういう画面を判断します。
  • ゲームの開始は、ボタンではなく、タイトル画面クリックにしてはどうでしょう。

楽しいゲームを作ってくださいね。

我慢できず作ってみました。コメントも少し入れました。
調整不十分ですけど、だいたいこんな感じでいかがですか。
あとは適当にいじり倒してください。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class WaniWaniPanic extends JFrame {
    public WaniWaniPanic() {
        super("わにわにパニック");
        setContentPane(new WaniPaniCanvas());
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
        new WaniWaniPanic();
    }
}

class WaniPaniCanvas extends JPanel {

    private static final long serialVersionUID = 1L;

    static final int START_WAITING = 0;
    static final int PLAYING       = 1;
    static final int ENDING        = 2;

    static final int IMG_TITLE        = 0;
    static final int IMG_WANI_NORMAL  = 1;
    static final int IMG_WANI_DAMAGED = 2;
    static final int IMG_BOMB_NORMAL  = 3;
    static final int IMG_BOMB_BOMB    = 4;
    static final int IMG_ENDING       = 5;

    static final int WANI_SELECTED = 0;
    static final int BOMB_SELECTED = 1;

    static final int SPEED_LOW    = 3;
    static final int SPEED_MIDDLE = 2;
    static final int SPEED_HIGH   = 1;

    static final String IMG_NAMES[] = {       // 適当に画像作ってください。
        "title.png",        //640 x 480
        "wani_normal.png",  //70 x 70
        "wani_damaged.png", //70 x 70
        "bomb_normal.png",  //70 x 70
        "bomb_bomb.png",    //70 x 70
        "ending.png"        //640 x 480
    };

    static final int TIMER_INTERVAL = 400;     //タイマー処理の間隔 0.4秒
    static final int TIMEUP         = 60000;   //タイムアップまでの時間 60秒

    static final int CANVAS_WIDTH  = 640;
    static final int CANVAS_HEIGHT = 480;

    static final int OBJECT_WIDTH  = 70;       // ワニやボム画像の幅
    static final int OBJECT_HEIGHT = 70;       // ワニやボム画像の高さ

    static final Point LOCATION[] = {          // 出現位置
            new Point( 50, 150),
            new Point(150, 150),
            new Point(250, 150),
            new Point(350, 150),
            new Point(450, 150),
            new Point(550, 150)
    };

    static final ArrayList<Image> images = new ArrayList<Image>();

    static {
        loadGameImages();
    }

    static void loadGameImages() {
        for (String name : IMG_NAMES) {
            try {
                FileInputStream in = new FileInputStream(name);
                Image img = ImageIO.read(in);
                images.add(img);
                in.close();
            } catch (IOException ex) {
                System.err.println("画像ファイル " + name + " が存在しません。");
                System.exit(1);
            }
        }
    }

    final GameState gameStates[] = { 
        new StartWaiting(),
        new Playing(),
        new Ending()    
    };

    private int     currentState     = START_WAITING;
    private int     bestScore        = 0;
    private int     score            = 0;
    private boolean overBest         = false;          // ハイスコアをとったらtrue
    private long    startTime        = 0L;
    private int     selectedLocation = 0;              // ランダムで選択した出現位置
    private int     selectedObject   = 0;              // ランダムで選択した出現オブジェクト
    private int     callCounter      = 0;
    private boolean hitObject        = false;

    private Random random = new Random(System.currentTimeMillis());

    private Timer timer = new Timer(TIMER_INTERVAL, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            callCounter++;
            if (hitObject) hitObject = false;
            long pastTime = System.currentTimeMillis() - startTime;
            if (pastTime >= TIMEUP) {
                timer.stop();
                currentState = ENDING;
                if (score > bestScore) {
                    bestScore = score;
                    overBest = true;
                }
            } else if (pastTime <= TIMEUP * 0.2) {
                if (callCounter % SPEED_LOW != 0) return;
            } else if (pastTime <= TIMEUP * 0.85) {
                if (callCounter % SPEED_MIDDLE != 0) return;
            }

            int loc = 0;
            while ((loc = selectLocation()) == selectedLocation);

            selectedLocation = loc;
            selectedObject = selectObject();

            WaniPaniCanvas.this.repaint();
        }

        private int selectLocation() {
            return Math.abs(random.nextInt()) % LOCATION.length;
        }

        private int selectObject() {
            int n = Math.abs(random.nextInt()) % 10;
            if (n == 0) return BOMB_SELECTED;
            else        return WANI_SELECTED;
        }
    });

    public WaniPaniCanvas() {
        setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                gameStates[currentState].mouseClicked(e);
            }
        });
    }

    public void paint(Graphics g) {
        gameStates[currentState].paint(g);
    }

    interface GameState {
        public void paint(Graphics g);
        public void mouseClicked(MouseEvent e);
    }

    class StartWaiting implements GameState {
        public void paint(Graphics g) {
            g.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            Image img = images.get(IMG_TITLE);
            g.drawImage(img, 0, 0, WaniPaniCanvas.this);
        }

        public void mouseClicked(MouseEvent e) {
            // タイトル画面をクリックしたらゲームスタート
            score            = 0;
            overBest         = false;
            selectedLocation = 0;
            selectedObject   = 0;
            callCounter      = 0;
            hitObject        = false;
            startTime        = System.currentTimeMillis();
            currentState     = PLAYING;
             timer.start();
            WaniPaniCanvas.this.repaint();
        }
    }

    class Playing implements GameState {
        public void paint(Graphics g) {
            g.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            int index = IMG_WANI_NORMAL;
            if (selectedObject == WANI_SELECTED && hitObject) {
                index = IMG_WANI_DAMAGED;
            } else if (selectedObject == BOMB_SELECTED) {
                if (hitObject) index = IMG_BOMB_BOMB;
                else           index = IMG_BOMB_NORMAL;
            }
            Image img = images.get(index);
            int x = LOCATION[selectedLocation].x;
            int y = LOCATION[selectedLocation].y;
            g.drawImage(img, x, y, WaniPaniCanvas.this);
            g.drawString("得点: " + score, 10, 10);
        }

        public void mouseClicked(MouseEvent e) {
            // 当たり判定
            int x = LOCATION[selectedLocation].x;
            int y = LOCATION[selectedLocation].y;
            Rectangle rect = new Rectangle(x, y, OBJECT_WIDTH, OBJECT_HEIGHT);
            if (rect.contains(e.getPoint())) score += 100;
            WaniPaniCanvas.this.repaint();
        }
    }

    class Ending implements GameState {
        public void paint(Graphics g) {
            g.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            Image img = images.get(IMG_ENDING);
            g.drawImage(img, 0, 0, WaniPaniCanvas.this);
            g.drawString("現在の最高得点: " + bestScore, 200, 200);
            g.drawString("今回の得点: " + score, 200, 230);
            if (overBest) g.drawString("ハイスコアです。おめでとう", 200, 260);
        }

        public void mouseClicked(MouseEvent e) {
            currentState = START_WAITING;
            WaniPaniCanvas.this.repaint();
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/13 11:09

    アドバイスありがとうございます。参考にして作ってみます(#^.^#)

    キャンセル

  • 2018/01/13 11:15

    いじり倒してみます!!丁寧にありがとうございました(>_<)

    キャンセル

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

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

関連した質問

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

  • Java

    12191questions

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