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

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

ただいまの
回答率

87.61%

ブロック崩しのブロックが当たった時の点数を表示したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 570
退会済みユーザー

退会済みユーザー

実現したいこと

題名の通り、ブロック崩しでボールがブロックに当たった時に点数を加えたいと思っています。
とても雑なコードですがこれしか思いつかなかったので、どうかご協力お願いします。
このコードを実行すると、開始すぐに値が30000ぐらいの値になってしまいます。具体的にブロックに当たったら、+1と足していく動きが理想です。

プログラムの説明

いろいろとコードが混ざっていますが、上のコードはelse以降のfor文がたくさんあるところだけ見てください。
一つ目のfor文はボールの数だけループさせています。次はブロックの数だけfor文で回しています。
それで、ブロックの数だけブロックに当たったらscore1として定義し、スコアを足していくようにしています。同様に二つ目も三つめもscore2とscore3としています。ブロックのあたり判定が if (block[i].isDeleted())というif文としています。したのコードは実際のブロッククラスです。つまりblock[i].Scoreに対応します。そのほかの二つは同じなので省略しました。
ブロッククラスはdeleteメソッドだけで他は関係ないので無視してください。deleteメソッドはvoid型なのでどのように返せばよいかわからない状態であります。一応isDeleteメソッドはboolean型なので使っています。

 public void displayTime(Graphics g) {
        if ( gameover ) {

          g.setFont(new Font("TimeRoman", Font.BOLD, 50));
          g.setColor(Color.red);
          g.drawString("Game Over", 300, 550); 


          for(int j=0;j<countball;j++){
            int ballsize =ball[j].Size();

          ball[j].Size();
                if(ballsize==0){

                return;
                }
          }
        } else {


            for (int i = 0; i < NUM_BLOCK; i++) {
                int score1=block[i].Score();



                if (block[i].isDeleted())
                    block[i].Score();
                    for ( int j = 0; j < NUM_BLOCK2; j++) {
                        int score2=block2[j].Score();

                        if (block2[j].isDeleted())

                       block2[j].Score();

                    for ( int k = 0; k < NUM_BLOCK3; k++) {
                        int score3=block3[k].Score();


                        if (block3[k].isDeleted())
                       block3[k].Score();
                    int  sumscore=score1+score2+score3;


          int dt = (int) (time - System.currentTimeMillis() * 0.001);
          g.setFont(new Font("TimeRoman", Font.BOLD, 50));
          g.setColor(Color.orange);
          g.drawString("Time: " + dt+""+sumscore+"",300, 550);

          if ( dt == 0 ) gameover = true;
                }
                }
            }
        }
    }
    class Block {
           public static final int WIDTH = 40;
           public static final int HEIGHT = 16;
           public static final int NO_COLLISION = 0; // 未衝突
           public static final int DOWN = 1;
           public static final int LEFT = 2;
           public static final int RIGHT = 3;
           public static final int UP = 4;
           public static final int DOWN_LEFT = 5;
           public static final int DOWN_RIGHT = 6;
           public static final int UP_LEFT = 7;
           public static final int UP_RIGHT = 8;


           // 位置(左上隅の座標)
           private int x, y;
       int score=0;
           // ボールが当たって消されたか
           private boolean isDeleted;

           public Block(int x, int y) {
               this.x = x;
               this.y = y;
               isDeleted = false;
           }
         public int Score(){
             return score+=1;
         }



           public void draw(Graphics g) {
               g.setColor(Color.CYAN);
               g.fillRect(x, y, WIDTH, HEIGHT);

               // 枠線を描画
               g.setColor(Color.BLACK);
               g.drawRect(x, y, WIDTH, HEIGHT);
           }
           public int collideWith(Ball ball) {
               Rectangle blockRect = new Rectangle(x, y, WIDTH, HEIGHT);

               int ballX = ball.getX();
               int ballY = ball.getY();
               int ballSize = ball.getSize();
               if (blockRect.contains(ballX, ballY)
                   && blockRect.contains(ballX + ballSize, ballY)) {
                   // ブロックの下から衝突=ボールの左上・右上の点がブロック内
                   return DOWN;
               } else if (blockRect.contains(ballX + ballSize, ballY)
                   && blockRect.contains(ballX + ballSize, ballY + ballSize)) {
                   // ブロックの左から衝突=ボールの右上・右下の点がブロック内
                   return LEFT;
               } else if (blockRect.contains(ballX, ballY)
                   && blockRect.contains(ballX, ballY + ballSize)) {
                   // ブロックの右から衝突=ボールの左上・左下の点がブロック内
                   return RIGHT;
               } else if (blockRect.contains(ballX, ballY + ballSize)
                   && blockRect.contains(ballX + ballSize, ballY + ballSize)) {
                   // ブロックの上から衝突=ボールの左下・右下の点がブロック内
                   return UP;
               } else if (blockRect.contains(ballX + ballSize, ballY)) {
                   // ブロックの左下から衝突=ボールの右上の点がブロック内
                   return DOWN_LEFT;
               } else if (blockRect.contains(ballX, ballY)) {
                   // ブロックの右下から衝突=ボールの左上の点がブロック内
                   return DOWN_RIGHT;
               } else if (blockRect.contains(ballX + ballSize, ballY + ballSize)) {
                   // ブロックの左上から衝突=ボールの右下の点がブロック内
                   return UP_LEFT;
               } else if (blockRect.contains(ballX, ballY + ballSize)) {
                   // ブロックの右上から衝突=ボールの左下の点がブロック内
                   return UP_RIGHT;
               }

               return NO_COLLISION;
           }

           /**
            * ブロックを消去
            * 
            */
           public void delete() {


               isDeleted = true;
            } 

            public int getX(){
                return x;
            } 
            public int getY(){

               return y;
            }
            public boolean isDeleted(){
                return isDeleted;
            }
 }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • jimbe

    2020/01/07 02:15

    「雑なコード」「いろいろとコードが混ざっています」
    と思われるのでしたら(実際その通りと思います), コードを整理して頂けませんでしょうか.
    displayTime という名前のメソッドでスコア計算するのは変ですし, そもそもスコアを足すのは, ボールが当たってブロックが消された時に行うものでありませんか?
    残り時間を表示する度にそれまでに消された(isDeleted)全てのブロックのスコアを加算していては, それは大きな値にはなるように思います.
    何かを探す前に, 整理して探し易くすることも必要かと思います.

    キャンセル

回答 1

checkベストアンサー

0

プログラムを拝見している限り、原因なのは下記だと思います。

public int Score(){
    return score+=1;//ここは+=1ではなく+1では?
}

それとscoreを加算していくやり方なら、scoreは静的変数にするべきだと思います。
私の考えですがscoreのクラスは別クラスに分けるべきです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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