• 締切済み

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; ___} __} _} }

  • zzaqq
  • お礼率83% (15/18)

みんなの回答

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.1

この一部のコードだけ見ても何ともコメントできません。クラスや変数の役割は分からないですし、「15+i」などのハードコーディングの意味も分かりませんので。 ただ一般的な当たり判定の話をすると、「球体当たり判定」が一番簡単で高速です。2つの物体の距離を求めて、その距離が一定以下なら当たりと判定する方法です。 参考までに2点の距離を求める関数を載せておきます。 FLOAT FindDistance(const D3DVECTOR& v1, const D3DVECTOR& v2) { FLOAT dx = v2.x - v1.x; FLOAT dy = v2.y - v1.y; FLOAT dz = v2.z - v1.z; return sqrtf(dx*dx + dy*dy + dz*dz); }

zzaqq
質問者

お礼

>この一部のコードだけ見ても何ともコメントできません。クラスや変数の役割は分からないですし、 >「15+i」などのハードコーディングの意味も分かりませんので。 言われてみればそうですね。すみませんでした。ご迷惑をおかけしました

関連するQ&A

  • http://csharpimage.blog60.fc2.com/b

    http://csharpimage.blog60.fc2.com/blog-entry-19.html をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____) プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、 そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_< どなたかご教授願います。 FILE *fpt; _wfopen_s(&fpt,Common_Data_Raw->filename,L"rb"); FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale;//拡大、縮小後の幅が入っている int hySize=Common_Data_Raw->height_rescale;//拡大、縮小後の高さが入っている。 // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)(xSize - 1) / hxSize; double hokanY = (double)(ySize - 1) / hySize; int i,j; unsigned char **layer,**bufdata,**rescale; //メモリの確保→省略します。 if ((xSize < hxSize)&&(ySize<hySize)) { // X方向の補間 for (i=0;i<ySize;i++) { xpos = 0.0; for (j = 0; j < hxSize; j+=3) { bufdata[i][j] = (unsigned char)(((double)layer[i][(int)xpos + 1] - (double)layer[i][(int)xpos]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos]); bufdata[i][j+1] = (unsigned char)(((double)layer[i][(int)xpos + 1+1] - (double)layer[i][(int)xpos+1]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+1]); bufdata[i][j+2] = (unsigned char)(((double)layer[i][(int)xpos + 1+2] - (double)layer[i][(int)xpos+2]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+2]); xpos += hokanX;} } // Y方向の補間 for (i = 0; i < hxSize; i+=3) {ypos = 0.0;for (j = 0; j <hySize; j++) {rescale[j][i] = (unsigned char)(((double)bufdata[(int)ypos + 1][i] - (double)bufdata[(int)ypos][i]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i]);rescale[j][i+1] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+1] - (double)bufdata[(int)ypos][i+1]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i+1]); rescale[j][i+2] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+2] - (double)bufdata[(int)ypos][i+2]) * (ypos - (int)ypos) + (double)bufdata[(int)ypos][i+2]); ypos += hokanY;}} } else { //rescaledata = SimpleRescaleImage(data, hxSize, hySize);

  • シューティングゲームの当たり判定

    現在directxを用いた(DXライブラリは使わない)インベーダーゲームを作っているのですが、当たり判定の部分がなぜかうまくいきません。自機と敵の弾の当たり判定部分のコードを載せるのでどなたかご享受ください。 //============敵の攻撃======================== if(enemy[rand_atk].tamaflag == 0 && shot_save % 100 == 0 ){ __enemy[rand_atk].tamaflag = 1; __enemy_atk[rand_atk].x = enemy[rand_atk].x+17; __enemy_atk[rand_atk].y = enemy[rand_atk].y+17; } for(i = 0; i < 11; i++){ __if(enemy[i].tamaflag == 1){ ____enemy_atk[i].y+=1; ____if(enemy_atk[i].y >= 480){ ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} ____if( ( move.x - 7 < enemy_atk[i].x && move.x + 32 > enemy_atk[i].x ) && ________( move.y - 13 < enemy_atk[i].y && move.y + 24 > enemy_atk[i].y ) ){ ______move.zanki--; ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} __} } move.x,move.yは自機のx,y座標で横32縦24 敵の弾の大きさは横7縦13 rand_atkはrand_atk = timeGetTime() % 11;でランダムに攻撃させようとしています。

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

    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); }

  • 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
  • C言語による間引き拡大縮小

    http://csharpimage.blog60.fc2.com/blog-entry-18.html をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、 rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。 24bppのRawファイル(RGB)を拡大縮小しようとしています。 rescale[i+j] =layer[(int)xpos+(int)ypos];の layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。 layer:24bppRawを読み込むメモリ アドバイスお願い致します。m(___)m FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale; int hySize=Common_Data_Raw->height_rescale; // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)xSize / hxSize; double hokanY = (double)ySize / hySize; unsigned char *layer,*rescale; //読み込み layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); //拡大縮小後のサイズ rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char)); ypos = 0.0; for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize) { xpos = 0.0; for (int j=0;j<3*hxSize;j+=3) { // 単純補間・間引き rescale[i+j] =layer[(int)xpos+(int)ypos]; rescale[i+j+1]=layer[(int)xpos, (int)ypos]; rescale[i+j+2]=layer[(int)xpos, (int)ypos]; xpos += hokanX; } ypos += hokanY; } _wfopen_s(&fpt_output,L"output.raw",L"wb"); fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(rescale); return 0;

  • 祝日判定です。

    祝日判定 カレンダーですが、エラーが出てしまいます。どうかよろしくお願いいたします。ソースの一部です。 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.

  • C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまく

    C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまくいきません。ReverseOthello関数の石を探して裏返す処理がおかしいと思われます。一番裏返せる石が多い位置を裏返すという処理をしています。プログラミング経験が豊富な方よろしくお願いします。 #include "stdafx.h" bool Othello(int (*pBoard)[8] ){ int i; int j; int ans; int k = 0; int num[3] = {0,0,0}; int sum[28][3]; i = 0; while(i < 28){ j = 0; while(j < 3){ sum[i][j] = 0; j++; } i++; } i = 0; while(i < 8){ j= 0; while(j < 8){ if(pBoard[i][j] == 0){ ans = SeachStone(i,j,pBoard); if(ans != 0){ sum[k][0] = i; sum[k][1] = j; sum[k][2] = ans; k++; } } j++; } i++; } i = 0; while(i < 28){ if(num[2] < sum[i][2]){ num[0] = sum[i][0]; num[1] = sum[i][1]; num[2] = sum[i][2]; } i++; } if(num[2] == 0){ return false; } ReverseStone(num[0],num[1],pBoard); return true; } void ReverseStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int y2; int x2; int i; int j; int k; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ k = 0; while(k < cnt + 1){ y2 = y2 + (y1 - i); x2 = x2 + (x1 - j); pBoard[y2][x2] = 1; printf("%d\n",pBoard[y2][x2]); k++; } } j++; } i++; } } int SeachStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int sumCnt = 0; int y2; int x2; int i; int j; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ sumCnt = sumCnt + cnt; } j++; } i++; } return sumCnt; }

  • 敵との当たり判定

    現在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に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • 初心者です。Circle

    class Circle { Paint pat; int xpos, ypos, radius; public Circle(Paint p, int x, int y, int r) { pat = p; xpos = x; ypos = y; radius = r; } public void draw(Graphics2D g) { g.setPoint(pat); g.fillCircle(xpos-radius, ypos-radius, radius); } } というソースを作りましたが、 コンパイルの際に 以下のエラーが出ます。 シンボルを見つけられません シンボル:メソッド fill Circle(int,int,int) 場所:g.fillCircle(xpos-radius, ypos-radius, radius); どこが間違っていて、どう直せばいいのか、教えてください。 お願いします。

  • C言語にて至急質問!!

    授業でゲーム作成してますがタイム表示とえさの残り数表示と残りのライフ表示 のプログラムがわかりません プログラムは下にあります #include<stdio.h> #include<stdlib.h> #include<time.h> #include"utility.h" int map[25][40]; typedef struct{ int x; int y; int life; int col; }CHAR; void disp(int,int); void main(void) { FILE *fp; CHAR man,mapsize,teki[5]; int i,j,cnt = 0,x,y,flg,wx,wy,stime = 0,etime = 0 ; GetConsoleHandle( ); srand(time(NULL)); fp = fopen("map.txt","r"); if(fp == NULL){ printf("ファイルエラー\n"); return; } fscanf(fp,"%d %d",&mapsize.y,&mapsize.x); fscanf(fp,"%d %d",&man.y,&man.x); wy = man.y; wx = man.x; fscanf(fp,"%d" "%d",&y,&x); for(i = 0;i < mapsize.y;i++) for(j = 0;j < mapsize.x;j++){ fscanf(fp,"%d",&map[i][j]); if(map[i][j] == 1) cnt++; } fclose(fp); disp(mapsize.x,mapsize.y); Locate(man.x * 2 +10,man.y + 3); printf("Э"); if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } man.life = 10; man.col = 0x0e; for(i = 0;i < 5;i++){ teki[i].y = y; teki[i].x = x; teki[i].life = 1; teki[i].col = rand() % 7 + 9; } while(cnt && man.life){ Wait(100); if(KeyCheck(ESCAPE)) break; Locate(man.x * 2 + 10,man.y + 3); SetColor2(0x00); printf(" "); if(KeyCheck (LEFT) && map[man.y][man.x - 1] != 9){ man.x--; } if(KeyCheck (RIGHT) && map[man.y][man.x + 1] != 9){ man.x++; } if(KeyCheck (UP) && map[man.y - 1][man.x] != 9){ man.y--; } if(KeyCheck (DOWN) && map[man.y + 1][man.x] != 9){ man.y++; } flg = -1; for(i = 0;i < 5;i++){ if(man.y == teki[i].y && man.x == teki[i].x) flg = i; } if(flg == -1){ if(map[man.y][man.x] > 9){ j = map[man.y][man.x]; man.x = j / 100; man.y = j % 100; } if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } else if(map[man.y][man.x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ stime = time(NULL); if(stime < etime){ teki[flg].life--; if(map[teki[flg].y][teki[flg].x] == 1){ map[teki[flg].y][teki[flg].x] = 0; cnt--; }else if(map[teki[flg].y][teki[flg].x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ man.life--; SetColor(0x0f); Locate(60,3); Locate(teki[flg].x * 2,teki[flg].y); SetColor2(teki[flg].col); printf("Ψ"); man.x = wx; man.y = wy; Wait(3000); Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); } } Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); for(i = 0;i < 5;i++){ if(teki[i].life == 1){ Locate(teki[i].x * 2 + 10,teki[i].y +3); switch(map[teki[i].y][teki[i].x]){ case 0:SetColor2(0x0f); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; } j = rand() % 4; if(j == 0 && map[teki[i].y - 1][teki[i].x] != 9){ teki[i].y--; } if(j == 1 && map[teki[i].y][teki[i].x + 1] != 9){ teki[i].x++; } if(j == 2 && map[teki[i].y + 1][teki[i].x] != 9){ teki[i].y++; } if(j == 3 && map[teki[i].y][teki[i].x - 1] != 9){ teki[i].x--; } Locate(teki[i].x * 2 + 10,teki[i].y + 3); stime = time(NULL); if(stime < etime) SetColor2(teki[i].col << 4); else SetColor2(teki[i].col); printf("Ψ"); }else{ stime = time(NULL); if(stime >= etime){ teki[i].life = 1; teki[i].y = y; teki[i].x = x; } } } } } void disp(int x,int y){ int i,j; for(i = 0;i < y;i++){ for(j = 0;j < x;j++){ Locate(j*2 + 10,i + 3); switch(map[i][j]){ case 0:SetColor2(0x00); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; case 9:SetColor2(0x99); printf("■"); break; default:SetColor2(0x0d); printf(" "); } } } } このどこかに質問したプログラムがはいるかもおしえてほしいです。 至急回答をどうかおねがいします

専門家に質問してみよう