C言語でのゲーム作成に関する質問

このQ&Aのポイント
  • C言語でゲーム作成中のプログラムについて質問です。
  • 特にタイム表示やえさの残り数表示、残りのライフ表示のプログラムがわかりません。
  • プログラムは提供されており、それを参考に自分でエディタで開いています。
回答を見る
  • ベストアンサー

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(" "); } } } } このどこかに質問したプログラムがはいるかもおしえてほしいです。 至急回答をどうかおねがいします

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

プログラムの説明をください.

nanatyan1147
質問者

お礼

パックマン的なゲームをつくっておりますw

関連するQ&A

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • c言語迷路問題!!!緊急

    以下のプログラム毎行一つずつ、コマンド書いてほしいです。地図大きから書いてないでず、他のコマンドよろしくお願いします、ありがとうございます。 #include <stdio.h> #define MAP_X 39 // X座標 #define MAP_Y 43 // Y座標 #define LOL 24 void map() ; // 地図 void cm() ; void trap() ; void map1() ; int ws[ LOL * MAP_X ] ; int wk[ MAP_X * MAP_Y ] = { }; int a = 1 ; char com ; int pz = 1599 ; int main( void ) { int flg = 1 ; map() ; while( flg != 0 ) { cm() ; switch( com ) { case 'w' : if( wk[ pz - 39 ] == 0 ) { wk[ pz - 39 ] = 2 ; wk[ pz ] = 0 ; pz -= 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 's' : if( wk[ pz + 39 ] == 0 ) { wk[ pz + 39 ] = 2 ; wk[ pz ] = 0 ; pz += 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'a' : if( wk[ pz - 1 ] == 0 ) { wk[ pz - 1 ] = 2 ; wk[ pz ] = 0 ; pz -= 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'd' : if( wk[ pz + 1 ] == 0 ) { wk[ pz + 1 ] = 2 ; wk[ pz ] = 0 ; pz += 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'j' : if( wk[ pz + 2 ] == 0 ) { wk[ pz + 2 ] = 4 ; wk[ pz ] = 0 ; pz += 2 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'e' : printf( "GAME OVER\n" ) ; flg = 0 ; break ; } } } void map() { int i ; map1() ; for( i = 0 ; i < MAP_X * LOL ; i++ ) { if( ( i / MAP_X ) == a ) { printf( "\n" ) ; a++ ; } switch( ws[ i ] ) { case 1 : printf( "■" ) ; break ; case 2 : printf( "※" ) ; break ; case 3 : printf( "宝" ) ; break ; case 4 : printf( "☆" ) ; break ; case 5 : printf( "" ) ; break ; default : printf( " " ) ; break ; } } a = 1 ; printf( "\n" ) ; printf( "コマンド入力 : " ) ; } void map1() { int i ; for ( i = 0 ; i < (LOL * MAP_X) ; i++ ) { ws[i] = wk[i + (MAP_X * 19 ) ] ; } } void cm() { scanf( "%s" , &com ) ; }

  • c言語のmalloc()とエラー表示

    .malloc()については以前も質問させて頂きましたが 新たな疑問についてご教示下さい。 ・下記のプログラムでmalloc()とrealloc()は正常に作動していると思いますが、入力表示を有効にすると下記の「エラー表示」が表示されます。 ・「エラー表示」されてもプログラムは最後まで実行される様です。 ・n=400までは表示されます。 ・この理由が分かりません、ご教示下さい。 ・malloc()関係は不安定な関数群でしょうか? ■「エラー表示」について *********************************************************** 問題が発生したため、***.exeを終了します。ご不便をおかけて申し訳ありません。 作業途中・・・・・ この問題を「マイクロソフト」に報告ください。 ************************************************************ ・一部ですが以上の様なエラー表示です。 //malloc_2 #include <stdio.h> #include <stdlib.h> void MylnOut(int ,int ,int *); //************************************************************** // MAIN //************************************************************** int main() { int *map; int X=10,Y=10,n; /* 疑似2次元配列確保と初期表示 */   printf("初期値.... \n");   map=(int *)malloc(sizeof(X*Y)); // MylnOut( X, Y, map); /* 変更数値入力 */ for(n=1;n<401;n++){   X=rand()%50+2;   Y=rand()%50+2;   printf("変更..%3d回目 X=%2d Y=%2d\n",n,X,Y); /* 領域変更と表示 */   map=(int *)realloc(map,sizeof(X*Y)); // MylnOut( X, Y, map); } /* 領域開放 */   free(map);   map=NULL; return 0; //************************************************************** // 入力・表示 //************************************************************** void MylnOut(int X,int Y,int *map) {   int i,j;   for(j=0;j<Y;j++)    for(i=0;i<X;i++) map[j*Y+i]=X;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[j*Y+i]);    printf("\n");   } } ・コンパイルエラーは無く実行時エラーです。 .Borland C++ Compiler 5.5.1,TuboDebugger 5.5を使用しています。

  • c言語のmalloc関数と2次元配列について

    ・mallocとreallocのAPPを作成しています、下記は単純化しました。 「質問-1」 ・while(1){...以下を無効にした場合、正常に終了します。 ・有効にして、最初に999を入力した場合、エラー表示されます。 ・この理由が分かりません。 「質問-2」 ・有効にして、初期数値(例えば11)を入力の場合、正常表示されます ・続けて数値(例えば15)を入力した場合、エラー表示されます。 ・この理由が分かりません。 ***************************************************************  #include <stdio.h>  #include <stdlib.h>  void MylnOut(void);  int **map;  int X=10,Y=10,i,j; //************************************************************** // MAIN //************************************************************** int main() {  char str[64]={""};  char *s="変更数値を入力(999で終了).... "; /* 2次元配列確保と初期表示 */  map=(int **)malloc(sizeof(int *)*X);  for(i=0;i<X;i++)   map[i]=(int *)malloc(sizeof(int)*Y);  MylnOut(); /* 変更数値入力 */ // while(1){ //  printf(s); //  gets(str); //  X=atoi(str); //  if(X==999) break; /* 領域変更と表示 */ //  map=(int **)realloc(map,sizeof(int *)*X); //  for(i=0;i<X;i++) //   map[i]=(int *)realloc(map[i],sizeof(Y)); //  MylnOut(); // } /* 領域開放 */   for(i=0;i<X;i++) free(map[i]);   free(map);   return 0; } //************************************************************** // 入力・表示 //************************************************************** void MylnOut(void) {  for(j=0;j<Y;j++)   for(i=0;i<X;i++) map[i][j]=55;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[i][j]);    printf("\n");   } }

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • C言語 ゲーム

    このプログラムに関数を一つ増やしたいのですが、うまくできません。どこを、どうすればいいでしょう? 迷路の内容は未完成です。 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■", /*01*/"■ ■                                    ■", /*02*/"■ ■■■■ ■                               ■", /*03*/"■ ■■   ■                               ■", /*04*/"■  ■ ■■■                               ■", /*05*/"■■ ■ ■                                 ■", /*06*/"■  ■ ■                                 ■", /*07*/"■ ■■ ■                                 ■", /*08*/"■    ■ ■                               ■", /*09*/"■                                      ■", /*10*/"■                                      ■", /*11*/"■                                      ■", /*12*/"■                                      ■", /*13*/"■                                      ■", /*14*/"■                                      ■", /*15*/"■                                      ■", /*16*/"■                                      ■", /*17*/"■                                      ■", /*18*/"■                                      ■", /*19*/"■                                      ■", /*20*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

専門家に質問してみよう