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

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

ただいまの
回答率

87.60%

降ってきているブロックを特定の条件下で消したい

解決済

回答 2

投稿

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

score 77

ぷよぷよのコードを改造しています。
配列の一番下に行くと、降ってくるブロックが消えるというものに挑戦しています。
以下にコードを貼ります。

import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;

class YPanel extends Panel {
  //Panel innerPanel3;
  //Panel innerPanel4;
  Color bgcolor;
  static int puyomatrix[][];
  //  static Panel mypanels[][];
  //int i,Y;
  public YPanel() {

    bgcolor = super.getBackground();//親クラスのBackgroundを参照しているらしい
  }
  public void setBounds(int x, int y, int width, int height) {
    super.setBounds(x,y,width,height);
    //  innerPanel3.setBounds(4,height-4,width-8,8);
    //  innerPanel4.setBounds(width-8,4,8,height-8);
  }
  public Color getBackground() {
    return bgcolor;
  }
  public void setBackground(Color color) {
    bgcolor = color;
    super.setBackground(color);//一連の動き確認
  }
}

public class shooting2 {
  static JLabel mylabel;
  static Panel mypanels[][];
  static int puyomatrix[][];
  static Color colorList[];
  static int score = 0;
  static int puyoX = 3, puyoY = 1;//上の方のブロックのx座標とY座標
  //static int puyoX2 = 3, puyoY2 = 2;
  //static int puyoX = 9, puyoY = 2;
  //static int puyoX2 = 9, puyoY2 = 3;
  static int color3 = (int)(Math.random()*3)+2;
  static int color4 = (int)(Math.random()*3)+2;
  static int color1 = 0, color2 = 0;
  //static int rotate = 0;
  static boolean lock = false;
  static boolean lock2 = false;

  static JButton[][] Btn;//ボタン


  /*  static int puyoX3=9;
  static int puyoY3=2;
  static int puyoX4=9;
  static int puyoY4=3;*/

  public static void main(String args[]) {
    int i,x,y,j,q=0;
    final int puyoSize = 32;


    JFrame myframe = new JFrame("ウンチ撃退ゲーム");
    myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myframe.setSize(470, 580);
    myframe.setLocationRelativeTo(null);
    JLabel background = new JLabel(new ImageIcon("./png/6.png"));
    myframe.add(background);
    myframe.setVisible(true);



    ImageIcon labelicon = new ImageIcon("./png/4.png");//背景?
    mylabel =  new JLabel(labelicon);
    mylabel.setLayout(null); // does not use layout manager
    mylabel.setSize(400,600); // window size : width = 400, height = 600
    mylabel.setVisible(true); // make the window visible
    //mylabel.addWindowListener(new MyWindowAdapter());


    ImageIcon buttonicon = new ImageIcon("./png/1.png");//配列上に出る、透明のやつ
    Btn = new JButton[13][6];//真ん中
    for( j = 0; j < 13; j ++) {
      for( q = 0; q < 6; q ++) {
        Btn[j][q] = new JButton(buttonicon);
        myframe.add(Btn[j][q]);//myframeにBtnを加える
        Color transparent = new Color(0, 0, 0, 0);
        Btn[j][q].setBackground(transparent);
        Btn[j][q].setBounds(80+(32*q),200+(32*j),32,32);
        System.out.print(Btn[j][q]);
      }
    }




    mypanels = new Panel[13][6];
    puyomatrix = new int[13][6];
    colorList = new Color[5];
    colorList[0] = Color.gray;
    colorList[1] = Color.white;
    colorList[2] = Color.yellow;
    colorList[3] = Color.red;
    colorList[4] = Color.green;

    for( x = 0; x < 6; x++ ) {
      for( y = 0; y < 13; y++ ) {
        Panel p = new YPanel();
        mypanels[y][x] = p;
        myframe.add(p);
        p.setBounds(80+puyoSize*x,200+puyoSize*y,puyoSize,puyoSize);
        setpuyo(x,y,0); // no puyo is here
      }
    }
    for( x = 0; x < 6; x++ ) {
      setpuyo(x,12,1); // ground is here、 この値を221行目の仮引数に代入
    }



    boolean firstPlacing = true;
    boolean gameIsOver = false;
    int fallCount = 0;

    while( gameIsOver != true) {
      lock = false;
      sleep(100);//降りてくるのが遅くなる
      lock = true;
      while( lock2 ) { sleep(10); }
      if( firstPlacing ) {
        firstPlacing = false;
        color1 = (int)(Math.random()*3)+2;
        //color2 = (int)(Math.random()*3)+2;
        puyoX = 3; puyoY = 1; // initialPlace

        if( puyomatrix[puyoY][puyoX] == 0//上のぷよの座標が0になる=上に当たってしまった
        ) {//下の‥↑
          setpuyo(puyoX,puyoY,0);
          //setpuyo(puyoX2,puyoY2,color2);
          //System.out.print("next puyo is here.\n");
        } else {
          // GAME OVER
          //  ImageIcon icon7 = new ImageIcon("./img/7.png");
          setpuyo(puyoX,puyoY,0);
          //setpuyo(puyoX2,puyoY2,color2);
          System.out.print("batan kyu-\n");
          gameIsOver = true;
          System.exit(0);
        }
      }
      if( fallCount > 5 ) {
        fallCount = 0; // counter reset;
        puyoY++; // fall it for one block
        //puyoY2++;
        if( puyomatrix[puyoY][puyoX] == 0)
        {
          setpuyo(puyoX,puyoY-1,0);
          //setpuyo(puyoX2,puyoY2-1,0);
          setpuyo(puyoX,puyoY,color1);
          //setpuyo(puyoX2,puyoY2,color2);
        } else {
          firstPlacing = true;
          // undo falling
          puyoY--;
          //  puyoY2--;
          // fall each puyo
          while(puyomatrix[puyoY+1][puyoX] == 0) {
            setpuyo(puyoX,puyoY,0);
            puyoY++;
            setpuyo(puyoX,puyoY,0);
          }
          /*while(puyomatrix[puyoY2+1][puyoX2] == 0) {
          setpuyo(puyoX2,puyoY2,0);
          puyoY2++;
          setpuyo(puyoX2,puyoY2,color2);
        }
        */
        // clear connected puyos and falldown other puyos...
        // !!--check here--!!

        // !!--check here--!!
      }
    } else {
      fallCount++;
    }
  }

}


static void setpuyo(int x, int y, int color) {
  puyomatrix[y][x] = color;
  mypanels[y][x].setBackground(colorList[color]);
}
static int getpuyo(int x, int y) { // why don't you use this!?
//  System.out.print(puyomatrix[y][x]);
return puyomatrix[y][x];
}

static void fallPuyos() {
  int fallcount;
  int nx,ny,nr;

  do {
    fallcount = 0;
    int x,y;
    for( y = 12; y > 0; y-- ) {
      for( x = 1; x <= 6; x++ ) {
        if( puyomatrix[y][x] != 0 && puyomatrix[y+1][x] == 0 ) {
          setpuyo(x,y+1,puyomatrix[y][x]); // fall the puyo
          setpuyo(x,y,0); // the last position should be empty
          fallcount++; // count-up fallout counter
        }
      }
    }
  } while( fallcount != 0 );

}


static void sleep(long msec) {
  try{
    Thread.sleep(msec);//指定した時間の長さにわたって現在のスレッドを中断
  }catch(InterruptedException ie) {
  }
}
}

自分は

setpuyo(puyoX,puyoY,0);


も用いることで出来ると考えていました。ですが、ぷよぷよのように降ってきているブロックが積み重なってしまいます。どうすれば思うように動くでしょうか。よろしくお願いします。
追記
自分の力不足なんですけど、その場しのぎでコードを書いていたために、背景などに画像を挿入しないと動きません。ごめんなさい。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • rink

    2019/01/26 15:07

    いやいや、こちらこそすいません。
    その通りです。

    キャンセル

  • jimbe

    2019/01/26 19:55

    なるほど, 「降ってきているブロックをクリックして消す動作」ということでボタンの2次元配列があるんですね. ボタンの配列(Btn[][])も使われていないので, なんだろうと思っていました.

    キャンセル

  • rink

    2019/01/26 20:16

    分かりにくくてすいません。。。ボタンを配列にすればクリックしたところで消す動作が実現できると思いました。

    キャンセル

回答 2

checkベストアンサー

+1

クラスshooting2以下全体像です。

もともとclass shooting2{ で始まったカッコと、
mainメソッドで始まったカッコ の中身を修正してるので、{ の個数がおかしくなりがちです。
注意1) 途中の lock2 というboolean がいきなり登場しているあたり、これが動作に影響しているのかは
不明です。

注意2) 言い訳ではないですが、質問時のコードでコメントアウトされている部分に、カッコ}が1個
巻き込まれています。このせいでインデントが混乱しており、else{ fallCount++:}が本来どの部分に入っていたのか不明です。
ここかな?という場所に記述しておきました。 動作に変な影響が出る可能性を残しています。

public class shooting2 {
    static JLabel mylabel;
    static Panel mypanels[][];
    static int puyomatrix[][];
    static Color colorList[];
    static int score = 0;
    static int puyoX = 3, puyoY = 1;//上の方のブロックのx座標とY座標
    //static int puyoX2 = 3, puyoY2 = 2;
    //static int puyoX = 9, puyoY = 2;
    //static int puyoX2 = 9, puyoY2 = 3;
    static int color3 = (int) (Math.random() * 3) + 2;
    static int color4 = (int) (Math.random() * 3) + 2;
    static int color1 = 0, color2 = 0;
    //static int rotate = 0;
    static boolean lock = false;
    static boolean lock2 = false;

    static JButton[][] Btn;//ボタン


  /*  static int puyoX3=9;
  static int puyoY3=2;
  static int puyoX4=9;
  static int puyoY4=3;*/

    public static void main(String args[]) {
        int i, x, y, j, q = 0;
        final int puyoSize = 32;


        JFrame myframe = new JFrame("ウンチ撃退ゲーム");
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myframe.setSize(470, 580);
        myframe.setLocationRelativeTo(null);
        JLabel background = new JLabel(new ImageIcon("./png/6.png"));
        myframe.add(background);
        myframe.setVisible(true);

        ImageIcon labelicon = new ImageIcon("./png/4.png");//背景?
        mylabel = new JLabel(labelicon);
        mylabel.setLayout(null); // does not use layout manager
        mylabel.setSize(400, 600); // window size : width = 400, height = 600
        mylabel.setVisible(true); // make the window visible
        //mylabel.addWindowListener(new MyWindowAdapter());


        ImageIcon buttonicon = new ImageIcon("./png/1.png");//配列上に出る、透明のやつ
        Btn = new JButton[13][6];//真ん中
        for (j = 0; j < 13; j++) {
            for (q = 0; q < 6; q++) {
                Btn[j][q] = new JButton(buttonicon);
                myframe.add(Btn[j][q]);//myframeにBtnを加える
                Color transparent = new Color(0, 0, 0, 0);
                Btn[j][q].setBackground(transparent);
                Btn[j][q].setBounds(80 + (32 * q), 200 + (32 * j), 32, 32);
                System.out.print(Btn[j][q]);
            }
        }
        mypanels = new Panel[13][6];
        puyomatrix = new int[13][6];
        colorList = new Color[5];
        colorList[0] = Color.gray;
        colorList[1] = Color.white;
        colorList[2] = Color.yellow;
        colorList[3] = Color.red;
        colorList[4] = Color.green;

        for (x = 0; x < 6; x++) {
            for (y = 0; y < 13; y++) {
                Panel p = new YPanel();
                mypanels[y][x] = p;
                myframe.add(p);
                p.setBounds(80 + puyoSize * x, 200 + puyoSize * y, puyoSize, puyoSize);
                setpuyo(x, y, 0); // no puyo is here
            }
        }
        for (x = 0; x < 6; x++) {
            setpuyo(x, 12, 1); // ground is here、 この値を221行目の仮引数に代入
        }
        boolean firstPlacing = true;
        boolean gameIsOver = false;
        int fallCount = 0;

        while (gameIsOver != true) {
            lock = false;
            sleep(100);
            lock = true;
            while (lock2) {
                sleep(10);
            }
            if (firstPlacing) {
                firstPlacing = false;
                color1 = (int) (Math.random() * 3) + 2;

                puyoX = 3;
                puyoY = 1;

                if (puyomatrix[puyoY][puyoX] == 0) {
                    setpuyo(puyoX, puyoY, 0);
                } else {
                    setpuyo(puyoX, puyoY, 0);
                    System.out.print("batan kyu-\n");
                    gameIsOver = true;
                    System.exit(0);
                }
            }
            if (fallCount > 5) {
                fallCount = 0;
                puyoY++;
                if (puyoY == 13) {
                    setpuyo(puyoX, 12, 0);
                    firstPlacing = true;
                } else {
                    if (puyomatrix[puyoY][puyoX] == 0) {
                        setpuyo(puyoX, puyoY - 1, 0);
                        setpuyo(puyoX, puyoY, color1);

                    } else {
                        firstPlacing = true;
                        puyoY--;
                        while (puyomatrix[puyoY + 1][puyoX] == 0) {
                            setpuyo(puyoX, puyoY, 0);
                            puyoY++;
                            setpuyo(puyoX, puyoY, 0);
                        }
                    }
                }
            } else {
                fallCount++;
            }
        }
    }

    static void setpuyo(int x, int y, int color) {
        puyomatrix[y][x] = color;
        mypanels[y][x].setBackground(colorList[color]);
    }
    static int getpuyo(int x, int y) { // why don't you use this!?
//  System.out.print(puyomatrix[y][x]);
        return puyomatrix[y][x];
    }

    static void sleep(long msec) {
        try{
            Thread.sleep(msec);//指定した時間の長さにわたって現在のスレッドを中断
        }catch(InterruptedException ie) {
        }
    }



}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/27 03:33

    二つをつなげていただくと実行できると思います。

    キャンセル

  • 2019/01/27 09:08

    さっきのコードで、コンパイルエラーは解決したということでよろしいでしょうか?
    私の手元では、これを実行する環境がないので
    文法が合っているかどうか、しかチェックできません。
    非常に労力がかかるので今日はお休みを頂きますが、まずやって頂きたいことがひとつ。
    最下段に落ちたら消える、と処理を書いた部分(if puyoY=13の中身)に、ログ出力をしてみてください。たとえばplintlnでもいいです。反応が目に見えるものなら何でもいいです。

    処理がifの中身に進入していれば、plintlnが実行されるはずです。
    ログが出ないときは、ifに進入してないことになりますよね。そのときはifの条件を直す。
    ログが出るなら、ifは実行していることになりますよね。それで下段が透明にならないのであれば、そのときはメソッドが働いていない。setpuyo()に抜け穴があるってことになる。

    ここからやりましょう。

    キャンセル

  • 2019/01/27 11:35

    色々とありがとうございます。。。
    少しだけですけど何かわかってきたような気がします!
    firstPlacing = true;
    の後に入れたplintlnは実行されていましたが、消えていませんでした。なのでsetpuyo()に問題があると思います。

    キャンセル

+1

puyomatrix[y][x]は、y==12が最下段を表すようですので、
最下段のぷよをsetpuyo( , ,0)でクリアする方針です。

for( y = 12; y > 0; y-- ) {
      for( x = 1; x <= 6; x++ ) {
        if( puyomatrix[y][x] != 0 && puyomatrix[y+1][x] == 0 ) {
          setpuyo(x,y+1,puyomatrix[y][x]); // fall the puyo
          setpuyo(x,y,0); // the last position should be empty
       //挿入
          fallcount++; // count-up fallout counter
        }
      }
    }


この挿入部分に

if(y==12 && puyomatrix[y][x] !=0){
  setpuyo(puyoX,puyoY,0);
}


を差し込んでみるとか、どうでしょうか。手元に検証環境がないので、そちらで試してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/28 11:32

    色々と自分で見直してみたところ、配列の数を一つ減らして、それに対応する部分のsetpuyoを言われてみたとおりにしてみたところ、消えるようになりました!!
    色々と助けていただいてとっても助かりました!
    Kota_Kappaさん、いろいろとありがとうございました!

    キャンセル

  • 2019/01/28 12:13

    なんで?って思ったときには、ログ出力して確かめると解決もするし仕組みもわかるので、今後も詰まったらデバッグの一つとして実施してみてください。
    おめでとうございます。

    キャンセル

  • 2019/01/28 21:11

    なるほど…、とてもためになります!
    ありがとうございました!

    キャンセル

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

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

関連した質問

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