##実現したいこと
題名の通り、ブロック崩しでボールがブロックに当たった時に点数を加えたいと思っています。
とても雑なコードですがこれしか思いつかなかったので、どうかご協力お願いします。
このコードを実行すると、開始すぐに値が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; } }
回答1件
あなたの回答
tips
プレビュー