Javaブロック崩しの当たり判定に問題がある

このQ&Aのポイント
  • Java初心者の者が文化祭の出し物としてブロック崩しを作っているが、ブロックの当たり判定に問題がある。
  • ブロックとの当たり判定自体はあるが、ブロックが消えるはずが消えない。ボールとブロックが離れると元の色に戻ってしまう。
  • フラグ管理を使ってボールとブロックが触れたら描画しないようにしているが、うまくいかない。アドバイスを求める。
回答を見る
  • ベストアンサー

Java ブロック崩し 当たり判定

こんにちは、Java初心者の者です。 今週の末に、文化祭があるので、その際の出し物で「ブロック崩し」を出すことにしたのですが、 ブロックの当たり判定がおかしいのです。 おかしいというか、正確にはブロックとの当たり判定自体はあるのですが、ブロックと当たったらブロックが消えるようにしているはずが、消えないのです。 一応、消えてはくれるのですがボールとブロックが離れたらまた元の色に戻ってしまいます。 フラグ管理を使っての処理で、ボールとブロックが触れたらフラグを「偽」。そしたらそれに該当するブロックを描画しないようにする仕組みなのですが、どうも上手くいきません。 以下コードです。 ~~~~中略~~~~ //ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; k++; } } //ブロックに当たった時の処理 for(int i=0;i<30;i++) { if(flag[i] == true) { if(y + ball_y >= block_y[i] && y <= block_y[i]+block_h && x + ball_x >= block_x[i] && x <= block_x[i] + block_w) { vy = -vy; flag[i] = false; } } } //ブロックの描画 for(int i=0;i<30;i++) { if(flag[i] == true ) { //ブロックの描画 offg.setColor(Color.yellow); offg.fillRect(block_x[i],block_y[i],block_w,block_h); //ブロックの枠線 offg.setColor(Color.black); offg.drawRect(block_x[i],block_y[i],block_w,block_h); } } ~~~~中略~~~~~ paintメソッドの部分だけ載せてます。 どこかおかしいところがあれば、アドバイスを頂ければ幸いです。 宜しくお願い致します。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • racene
  • ベストアンサー率70% (21/30)
回答No.1

//ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; // <- 明らかにここがおかしい k++; } } paintメソッドが走るたびにflagがもとに戻っていますね。

rajison
質問者

お礼

すみません、仰るとおりflagの書く位置がおかしかったようです。 flagの宣言の部分を他のところに書いたところ、上手く動作してくれました。 ご回答、ありがとうございました!

関連するQ&A

  • ブロック崩し

    大学でプログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。DXライブラリで作ってます。 #include "DxLib.h" typedef struct _racket{ int g_racket; int g_x; int g_y; }racket; typedef struct _block{ int stone; int x; int y; }block; typedef struct _tama{ int ball; int x; int y; int vx; int vy; }tama; int Key; tama ta; void ball_attack() { ta.x = 300; ta.y = 450; ta.vx = 4; ta.vy = 4; ta.ball = LoadGraph("ball.bmp"); DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //tama ta; racket ra; //ta.x = 300; //ta.y = 450; //ta.vx = 4; //ta.vy = 4; ra.g_x = 300; ra.g_y = 420; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 透過色を変更 SetTransColor( 255 , 255 , 255 ) ; ra.g_racket = LoadGraph("ziki.bmp"); //ta.ball = LoadGraph("ball.bmp"); while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } ClearDrawScreen(); ball_attack(); /* DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy*/; // キー入力取得 Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // 右を押していたら右に進む if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ; // 左を押していたら左に進む if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ; ScreenFlip(); } WaitKey(); DxLib_End(); return 0; }

  • direct3dで当たり判定

    現在direct3dでフライトゲームを作っており、当たり判定部分を考えているのですがうまくいきません。メタセコイアでxファイルを作成し、ビルボードで表示している(敵も自弾も)のですが、そもそも基準点はどこに来るのか、プログラム上で指定する縦横高さがわからないなど当たり判定以前の問題のような気もするのですが・・・。とりあえず、該当部分のコードを載せるのでご享受お願いします。 ↓ゲームメインの攻撃部分↓ if(GetKeyboardTrigger(DIK_Z)){ _for(int i = 0; i < ATTACKNUM; i++){ __if( man_bullet[i].flag.bullet == 0){ ___man_bullet[i].flag.bullet = 1; ___//自機の座標セット ___mat_world[15+i]._41 = mat_world[0]._41; ___mat_world[15+i]._42 = mat_world[0]._42+2; ___mat_world[15+i]._43 = mat_world[0]._43; ___break; __} _} } for(int i = 0; i < ATTACKNUM; i++){ _if(man_bullet[i].flag.bullet == 1){ __mat_world[15+i]._43 ++; __man_bullet[i].cnt.bullet++; __if(man_bullet[i].cnt.bullet >= 100){ ___man_bullet[i].flag.bullet = 0; ___man_bullet[i].cnt.bullet = 0; ___mat_world[15+i]._42 = -100; __} __for(int j = 0; j < ENEMYNUM; j++){ ___man_bullet[i].flag.atk_result = ___Hit_Judging(&mat_world[5+j]._41, &mat_world[5+j]._42, &mat_world[5+j]._43, ________enemy[j].x, enemy[j].y, enemy[j].z, ________&mat_world[15+i]._41 , &mat_world[15+i]._42, &mat_world[15+i]._43, ________man_bullet[i].x, man_bullet[i].y, man_bullet[i].z ); ___if(man_bullet[i].flag.atk_result == 1){ ____man_bullet[i].flag.atk_result = 0; ____man_bullet[i].flag.bullet = 0; ____man_bullet[i].cnt.bullet = 0; ____mat_world[5+j]._43 = 150; ____mat_world[15+i]._42 = -100; ____break; ___} __} _} } ↓当たり判定部分↓ int Hit_Judging( float *xpos1 , float *ypos1 , float *zpos1 , ________float x1, float y1, float z1, ________float *xpos2 , float *ypos2 , float *zpos2 , ________float x2, float y2, float z2 ) { _for(int i = 0; i < ATTACKNUM; i++){ __if(man_bullet[i].flag.bullet == 1){ ___for(int j = 0; j < ENEMYNUM; j++){ ____if( ((xpos1[j] - (x1/2) ) < (xpos2[i] + (x2/2) ) && ______(xpos1[j] + (x1/2) ) > (xpos2[i] - (x2/2) )) && ______((ypos1[j] + y1 ) < ypos2[i] && ypos1[j] > (ypos2[i] + y2 )) && _______(zpos1[j] == zpos2[i]) ){ _____return 1; ____}else _____return 0; ___} __} _} }

  • java

    java プログラミングで3×3の○×ゲームを作りたいのですが、エラーが出てしまいます。 どこに問題があるかわかりません。 教えていただけたら嬉しいです。 長くなってしまいますが、ご了承ください(コメント一部略)。 import java.io.*; // マスにの中身が // 空白: 0 // O : 1 // X : 2 class ox { // 勝敗の判定をするメソッド // 勝敗が付いていなければ0 を // O の勝ちなら1 を // X の勝ちなら2 を // 引き分けなら-1 を // それぞれ返す。 static int judge( int board[][] ) { int i, j, flag; for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][i]; // <=> flag = flag & board[j][i] if( flag != 0 ) return flag; } // 縦の列を調べる for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[i][j]; if( flag != 0 ) return flag; } // 左上→右下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][j]; if( flag != 0 ) return flag; // 右上→左下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[2-j][j]; if( flag != 0 ) return flag; // まだ置けるマスがあるかの判定 flag = 1; for( i = 0; i < 3; ++i ) { for( j = 0; j < 3; ++j ) flag *= board[i][j]; } // flag != 0 ってことは、置けるマスは無い→勝負が付いた // どちらかが勝ったのなら、上でreturn しているはず // ということで、引き分け if( flag != 0 ) return -1; // 何事もなければ、勝負続行 return 0; } // 番面の様子を表示するメソッド static void show ( int board[][] ) { String display = ""; String masu[] = { " ", "O", "X" }; int i; display += " |1|2|3\n"; for( i = 0; i < 3; ++i ) { display += "-+-+-+-\n"; display += (i+1) + "|" + masu[board[0][i]] + "|" + masu[board[1][i]] + "|" + masu[board[2} System.out.println( display ); } static int isreach( int three[], int turn ) { int i, result; // 各マスの値を2 乗して足し合わせる result = 0; for( i=0; i<3; ++i ) result += three[i]*three[i]; // リーチなら、下の条件を満たすはず if( result == 2*turn*turn ) { for( i=0; i<3; ++i ) if( three[i] == 0 ) break; return i; } return -1; } static int rival( int board[][] ) { int x,y,i,j,n; int three[] = new int[3]; // x, y が未定である事を明示 for( i=0; i<3; ++i ) { for( j=0; j<3; ++j ) three[j] = board[j][i]; 続きは追記にて

  • 当たり判定の処理がわかりません。

    CとDXライブラリでSTGを作っているのですが、あたり判定がわかりません。前、斜め右上、斜め右下の3方向に飛ぶ弾の処理を行いたいのですが、どうすればいいのでしょうか? 画面に出力することはできたのですが、ななめに飛ぶ弾だけ判定できずに困っています。 ―――――――――ソースの一部――――――――――― //拡散する弾 void JitamaMove2(){ //弾の発射 int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if( (key & PAD_INPUT_A) && (trigger == 0) ) { for( int i = 0; i < 3; i++ ){ if (jitama[i].life == 0){ jitama[i].life = 1; jitama[i].x = jikidata.x+24; jitama[i].y = jikidata.y+8; jitama[i].y1 = jikidata.y+8; jitama[i].y2 = jikidata.y+8; float dy = jikidata.y; float d = sqrt(dy*dy); jitama[i].yobi = dy/d*idouryou[4]*10; break; } } trigger = 20; } if(trigger>0) trigger = trigger - 1; //弾の移動 for(int i=0; i<3; i=i+1){ if(jitama[i].life > 0){ jitama[i].x = jitama[i].x + idouryou[10]; DrawGraph(jitama[i].x, jitama[i].y,*(jitama[i].ghandle), TRUE); float idouy = (float)jitama[i].yobi / 10; jitama[i].y2 = jitama[i].y2 - idouy; DrawGraph(jitama[i].x, jitama[i].y2 - 10, *(jitama[i].ghandle), TRUE); //斜め下に対する弾の描写 jitama[i].y1 = jitama[i].y1 + idouy; DrawGraph(jitama[i].x, jitama[i].y1 + 10, *(jitama[i].ghandle), TRUE); //斜め上に対する弾の描写 //画面外に出たときの処理 if(jitama[i].x>640) jitama[i].life = 0; } } } /*当たり判定を計算する関数*/ int IsAtari(CharaData *a, CharaData *b){ int retval = 0; int ax1 = a->x + (a->image_w - a->bounds_w)/2; int ay1 = a->y + (a->image_h - a->bounds_h)/2; int ax2 = a->x + (a->image_w + a->bounds_w)/2; int ay2 = a->y + (a->image_h + a->bounds_h)/2; int bx1 = b->x + (b->image_w - b->bounds_w)/2; int by1 = b->y + (b->image_h - b->bounds_h)/2; int bx2 = b->x + (b->image_w + b->bounds_w)/2; int by2 = b->y + (b->image_h + b->bounds_h)/2; if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){ switch (a->amode){ case A_NORMAL: //キャラ消滅 a->life = 0; break; case A_HARD: //耐久力-1 a->life = a->life -1; break; } switch (b->amode){ case A_NORMAL: //キャラ消滅 b->life = 0; break; case A_HARD: //耐久力-1 b->life = b->life -1; if(b->life > 0) SetHanten(b->x, b->y, b->image_w, b->image_h); break; } if(b->life == 0) SetBakuen(b->x, b->y); retval = 1; } return(retval); } //当たり判定の処理 int AtariHantei(){ for(int i=0; i<50; i=i+1){ if(tekidata[i].life > 0 && tekidata[i].amode != A_GHOST){//A_GHOS・・・判定なし //自機と敵の判定 if(IsAtari(&jikidata, &tekidata[i])==1) return(1); //弾と敵の判定 for(int j=0; j<3; j=j+1){ if(jitama[j].life > 0 && jitama[j].amode != A_GHOST){ IsAtari(&jitama[j], &tekidata[i]); } } } } for( int i = 0; i < 50; i++ ){ if(tekitama[i].life > 0){ if(IsAtari(&jikidata, &tekitama[i]) == 1) return(1); } } return(0); }

  • Hspゲーム

    HSPでブロック崩しを作ってます。ブロックを全て消したあとにgame clearと入れたいのですが、どのようなソースをどこに入れればいいのかわかりません。 これがソースです。 ;設定など #define Ver "3.12" #define SOFTNAME "ブロック崩し" #define TITLEBAR SOFTNAME+" #define EXENAME "block" #packopt type 0 #packopt name EXENAME #packopt runtime "hsp3c.hrt" #packopt hide 0 ;ウインドウの作成 screen 0,320,240 : title TITLEBAR ;初期化 *init ;主な変数の宣言  dim block,8,4;ブロックの状態 あれば1 repeat 4 : j=cnt repeat 8 : i=cnt block(i,j)=1 loop loop ball_flag = 0;ボールの状態 あれば1 ball_num = 2;ボールの残り数 ball_x = 320;ボールの座標 ball_y = 240;最初は見えないように画面外に ball_vx = 0;ボールの速度 ball_vy = 0 bar_x = 0;バーの座標 ;メインループ *main await 17;1秒に60回ループする ;キー入力処理 stick ky,15 if ky&128 : end;Escで終了 ;バーの座標はマウスの位置で決める bar_x = mousex - 24 ;ボールがあるときとないとき if ball_flag = 0 { if ky&256 {;クリックされたら ball_flag = 1 ball_x = bar_x + 16 ball_y = 208 ball_vx = 4 ball_vy = -4 } } else { ;前回の座標を記録(ブロックとの衝突判定で使う) ball_x_before = ball_x ball_y_before = ball_y ;速度の分だけ座標に足す ball_x += ball_vx : ball_y += ball_vy ;画面の端に当たったら反射 if ball_x < 0 { ball_x = 0 ball_vx = -ball_vx } if ball_x > 304 { ball_x = 304 ball_vx = -ball_vx } if ball_y < 0 { ball_y = 0 ball_vy = -ball_vy } if ball_y > 240 {;下に落ちたらボールを消す ball_flag = 0 ball_num-- if ball_num = -1 { pos 200,200 : color 255,255,255 mes "ゲームオーバー" stop } } ;バーに当たったら反射 if (204 < ball_y) & (ball_y < 209) { if (bar_x-16 < ball_x) & (ball_x < bar_x+48) { ball_vy = -ball_vy } } } ;ブロックとの衝突判定 tmp=0;二重のrepeat-loopから一気に抜け出すためのフラグ repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { if (32 + i*32 - 16 < ball_x) & (ball_x < 62 + i*32) { if (32 + j*16 - 16 < ball_y) & (ball_y < 46 + j*16) { block(i,j) = 0;ブロックを消す ;前回のx座標がすでに範囲に入っていた場合y方向の向きを反転 if (32 + i*32 - 16 < ball_x_before) & (ball_x_before < 62 + i*32) { ball_vy = -ball_vy tmp=1 : break } ;前回のy座標がすでに範囲に入っていた場合x方向の向きを反転 if (32 + j*16 - 16 < ball_y_before) & (ball_y_before < 46 + j*16) { ball_vx = -ball_vx tmp=1 : break } ;どちらも入ってない場合は両方判定 ball_vx = -ball_vx ball_vy = -ball_vy } } } loop if tmp=1 : break loop ;いろいろ描画 redraw 0 color 0,0,0 : boxf;白で全体を塗りつぶす ;ボールとバー pos ball_x,ball_y : color 255,255,0 : mes "●" pos bar_x,220 : mes "-------" ;ブロック repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { boxf 32 + i*32, 32 + j*16, 62 + i*32, 46 + j*16 } loop loop redraw 1 goto *main よろしくお願いします。

  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • 度々すいません、Javaについて質問なんですが

    前回回答してくださった皆様、ありがとうございました。 現在、Javaで簡単なモグラ叩きゲームを作っており、リトライボタンを追加 しようと思っているのですが、なぜか上手くボタンが表示されません・・・何故で しょうか? また、マウスのクリック待ち時間(クリック制限時間)を作りたいのですが、どのようにすれば よいでしょうか? ソースは以下の通りです。(※字数制限に引っかかった、未使用のイベントなどは省略していますがご了承ください※) import java.awt.*; import java.awt.event.*; import java.util.Random; class mole_hit extends Frame implements MouseListener, ActionListener, MouseMotionListener { int mole_point; //土竜の出現データ int fore_mole_point; //土竜の前の出現データ int mole_x, mole_y; //土竜の出現座標 int mouse_x, mouse_y; //マウスの座標 int life = 10; long t = 1000; MyCanvas mc = new MyCanvas(); public static void main(String[] args) { new mole_hit(); } mole_hit() { super("土竜叩きゲーム"); //フレーム名 setSize(700, 700); //フレームサイズ setLayout(null); if (life <= 0) //ライフが0以下になったら、 { //リトライボタンを表示 Button b = new Button("RETRY"); b.addActionListener(this); b.setSize(50, 25); b.setLocation(620, 620); add(b); } mc.setSize(600, 600); //キャンバスサイズ mc.setLocation(0, 0); //キャンバス配置座標 mc.addMouseListener(this); mc.addMouseMotionListener(this); add(mc); setVisible(true); addWindowListener(new Close()); //ウィンドウクローズ } /*** ボタン等のイベント ***/ public void actionPerformed(ActionEvent e) { life = 10; mc.repaint(); } /*** マウスボタンが押されたとき ***/ public void mousePressed(MouseEvent e) { mouse_x = e.getX(); mouse_y = e.getY(); System.out.println("(" + mouse_x + "," + mouse_y + ")"); //マウス座標確認用 mc.repaint(); } /*** キャンバス ***/ public class MyCanvas extends Canvas { /*** 描画ステータス ***/ public void paint(Graphics g) { super.paint(g); int line_x, line_y; //ライン描画用変数 int hall_x, hall_y; //ホール描画 int i, j; //ループ用変数 Dimension size = getSize(); //ウインドウのサイズを取得 Sleep s = new Sleep(); //スリープ用メソッド Random rnd = new Random(); Color brown = new Color(160, 0, 0); //茶色 /*** ライフがあるとき ***/ if (life > 0) { /***** 背景色を青にする *****/ g.setColor(Color.blue); g.fillRect(0, 0, size.width, size.height); /*** ボックスの背景色を設定 ***/ g.setColor(Color.green); g.fill3DRect(100, 100, 300, 300, true); /***** 縦軸・横軸を描画*****/ line_x = 100; line_y = 100; g.setColor(Color.red); /*** 縦軸を描画 ***/ for (i = 0; i < 4; i++) { g.drawLine(line_x, 100, line_x, 400); line_x += 100; } for (i = 0; i < 4; i++) { g.drawLine(100, line_y, 400, line_y); line_y += 100; } /*** 土竜の出現するボックスを描画 ***/ g.setColor(Color.black); hall_y = 130; for (i = 0; i < 3; i++) { hall_x = 115; for (j = 0; j < 3; j++) { g.fillOval(hall_x, hall_y, 75, 40); hall_x += 100; } hall_y += 100; } do { fore_mole_point = rnd.nextInt(9); } while(mole_point == fore_mole_point); mole_point = fore_mole_point; switch(mole_point) { case 0: mole_x = 125; mole_y = 135; break; case 1: mole_x = 225; mole_y = 135; break; case 2: mole_x = 325; mole_y = 135; case 3: mole_x = 125; mole_y = 235; break; case 4: mole_x = 225; mole_y = 235; break; case 5: mole_x = 325; mole_y = 235; break; case 6: mole_x = 125; mole_y = 335; break; case 7: mole_x = 225; mole_y = 335; break; case 8: mole_x = 325; mole_y = 335; break; default: break; } g.setColor(brown); g.fillOval(mole_x, mole_y, 50, 25); if (mole_x <= mouse_x && mole_y <= mouse_y && mole_x + 50 >= mouse_x && mole_y + 25 >= mouse_y) { /*** 成功時アクション ***/ g.setColor(Color.red); g.fillOval(mole_x, mole_y, 50, 25); } s.Sleep(500); life--; } /*** ライフが無いとき ***/ if (life <= 0) { g.setColor(Color.red); g.fillRect(0, 0, size.width, size.height); g.setColor(Color.blue); g.drawString("GAME-OVER(´・ω・`)", 250, 300); } } } }

    • ベストアンサー
    • Java
  • 祝日判定です。

    祝日判定 カレンダーですが、エラーが出てしまいます。どうかよろしくお願いいたします。ソースの一部です。 for (j=0; j<6; j++) { for (k=0; k<7; k++) { if (cal[i][j][k]==0) printf(" "); else if(hantei(yy,mm,dd,youbi) == 2){ printf("(%3d) ",cal[i][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i][j][k]); printf("\t"); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i][j][k]); printf("\t"); } else{ printf("(%3d) ",cal[i][j][k]); //printf("%d"); //日付を出力 flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } int hantei(int yy,int mm,int dd,int youbi){ if((mm==3 && dd== (int)(20.8431 + 0.

  • Javaの配列の中身の並び替え

    数独の盤面上に、数字が0から9まであり、その数がそれぞれ何個あるのか数える プログラムを書きました。(0というのは、まだマス目がうまってない状態を指します) 以下のプログラムでは、ある座標に着目し、その座標が関連する行・列・ブロックに 数字が何個あるか数えています。(0のマスの数は特に気にしていません) final int x0 = x / 3 * 3; //000 333 666 final int y0 = y / 3 * 3; //その座標が関連するブロック、行、列に存在する値の数を数える //行 for( int i=0; i<9; ++i ){ countNum[state.getNum(i, y)]++; //state.getNum座標の数字を取得しています。 } //列 for( int i=0; i<9; ++i ){ countNum[state.getNum(x, i)]++; } //ブロック    for(int i=x0;i<3;i++){    for(int j=y0;j<3;j++){     if( i!=x || j!=y){ countNum[state.getNum(i, j)]++;    }    } これで、1の数字の個数や、2の数字の個数を求めることができました。 そして、個数の少ない順に並び替えたいのですが、並び替えてしまうと 何の数字が何個なのかわからなくなってしまいます。 どのようにすれば、数字とその個数がわかったまま並び替えをおこなえますか? 配列を二つ準備するべきなのでしょうか? 順番の入った配列と個数の入った配列。というように。

    • ベストアンサー
    • Java
  • javaのエラーの意味がわかりません、お願いします

    今日は、javaを勉強している初心者です。 以下のコードを書いてやりましたが、「sleep(Graphics)は引数()に適用できません」、「Color.Whiteを解決できません」とエラーがでます、エラーの意味が分かりません。 一体何処が間違っているのでしょうか、宜しくお願いします。 ===================================================================== public class ani_Moving_Ball extends Applet { int x; public void paint(Graphics g) { for(x=0 ; x<180 ; ++x) { clear(g); g.drawOval(x,90,19,19); sleep(); } } public void clear(Graphics g) { g.setColor(Color.White); g.fillRect(0,80,200,40); g.setColor(Color.Black); } public void sleep(Graphics g) { double s=0.0; for (int j=1 ; j<100 ; ++j) { for (int k=1 ; k<100 ; ++k) { s =+ Math.sin((double)j); } } } }

    • ベストアンサー
    • Java

専門家に質問してみよう