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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

1回答

1888閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

0クリップ

投稿2020/01/06 16:31

編集2020/01/06 16:42

##実現したいこと
題名の通り、ブロック崩しでボールがブロックに当たった時に点数を加えたいと思っています。
とても雑なコードですがこれしか思いつかなかったので、どうかご協力お願いします。
このコードを実行すると、開始すぐに値が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; } }
退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/01/06 17:15

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

回答1

0

ベストアンサー

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

java

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

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

投稿2020/01/07 00:48

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問