• 締切済み

c言語マップ探査ゲーム プログラミング

学校の課題で、5×5のマス目を移動するマップ探査ゲームというものをプログラミングします。 プログラミングは超初心者なので簡単な命令で、できれば軽く解説してもらえると嬉しいです。 プレイヤーは移動方向を選択し、それぞれのマス目で通過か探査を選びます。 探査を選ぶとランダムで2~9のgoldを手に入れ獲得goldはメッセージで知らされます。 マップの表し方は 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 未探査のマスを0、プレイヤーを1、探査済のマスを獲得gold2~9で表します。 左上をスタートとし右下をゴールとします。 その他の条件として 1、スタート地点は探査は行えず、ゴール地点は必ず探査を行うようにします。 2、マス目から外れたところには、行けないようにします。(現在地を変化させない) 3、適当な位置に所持goldが半分もしくは、全額失うマス目を二ヶ所作ります。半額は少数切り上げ   で、goldを失ったこととその数をメッセージで知らせ、マップには-1と表示します。 4、マップ上ではプレイヤーを優先して表示します。 5、マスは自由に移動可能だが、探査済のマスは再探査できない。 6、ゴール地点を探査した時点でゲーム終了となり、43~47gold入手してる場合は"You wins!"それ以外は、"You lost!"と表示しゲームを終了する。 例として #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int movex = 0, movey = 0, gold = 0, getm; int direction, scanp; srand(time(NULL)); while (1) { printf("Input, where you going ? (Up:1, Down:2, Left:3, Right:4): "); scanf("%d", &direction); switch (direction) { case 1: movey--; break; case 2: movey++; break; case 3: movex--; break; case 4: movex++; break; } printf("Input, Check or Through ? (Check:1, Through:0) : "); scanf("%d", &scanp); if(scanp == 1 ) { getm = rand() % 8 + 2; printf("You get %d gold.\n", getm); gold = gold + getm; } } exit(0); } が与えられています。 これを参考に作ってもらえるとありがたいです。

みんなの回答

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

そもそも「その配列に値を入れることができるのか」ってところから疑問になるわけだが, そこは書いてないのでできるものとする. とすると, 以下のうちどこかに「できること」と「できないこと」の境界があるはず. どこまでできて, どこでできなくなりましたか? 1. int型の変数 x の値を表示する (最後に改行する) 2. int型の 2個の変数 x と y の値を 1行に並べて表示する (最後に改行する) 3. int型の 5個の変数 v, w, x, y, z の値を 1行に並べて表示する (最後に改行する) 4. int b[5]; にあるすべての値を 1行に並べて表示する (最後に改行する) 5. int b[5][5]; の値を 5×5 の形に表示する (最後に改行する)

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

「作ってほしい」というのは「質問」ではないと思う. 自分で考えるだけ考えて, わからないところをはっきりさせて「質問」してほしい.

nicorainini
質問者

補足

そうですね じゃあひとつ 例のプログラムにint型でb[5][5]を作りprintfで 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 のマップのマスを作りたいのですがどのように組み込めばいいのでしょうか? 質問が伝わりにくくてごめんなさい。

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

で「質問」は何?

nicorainini
質問者

補足

すいません 例のプログラムを5×5のマッププログラムに改良してほしいです!

関連するQ&A

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • C言語-エラーの位置

    いろんなものを見ながらじゃんけんのプログラムを作ったのですが、 どうしても最後でエラーが出てしまいます。 その原因がどうしてもわかりません。 エラーの出る部分は、最後の「}」、「return」ですが・・・。 以下がプログラムです。(printf内の\nは省略してます) この場合、}とreturnの位置はどうすればいいでしょうか? #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int player_hand,cpu_hand_result; srand((unsigned) time(NULL)); do{ printf("1:グー 2:ちょき・・・・"); scanf("%d",&player_hand); if(player_hand<1 || player_hand>3)result-1; player_hand--; cpu_hand = rand()%3; switch(cpu_hand){ case 0:printf("グー"); break; case 1:printf("チョキ"); break; case 2:printf("パー"); break; } result-(cpu_hand-player_hand+3)%3; if(result==2)result=-1; switch(result){ case 1:printf("あなたの勝ち"); break; case -1:printf("あなたの負け"); break; case 0:printf("あいこ"); break; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 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*/"■■■■■■■■■■"}; //マップ範囲算出 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; }

  • C言語、成績は4194432?

    いつも大変お世話になり誠にありがとうございます。 標記の件。 おかしな実行結果になりました。 どうしてでしょうか? ご回答の程宜しくお願い申し上げます。       記 コード #include <stdio.h> int main(void) { int res; printf("成績を入力してください。\n"); scanf("%d", &res); printf("成績は%dです。\n", res); switch(res){ case 1: printf("もっとがんばりましょう。\n"); break; case 2: printf("もう少しがんばりましょう。\n"); break; case 3: printf("さらに上をめざしましょう。\n"); break; case 4: printf("たいへんよくできました。\n"); break; case 5: printf("たいへん優秀です。\n"); break; } return 0; } 実行結果 C:\MinGW>test20.exe 成績を入力してください。 A 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 b 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 v 成績は4194432です。 度々申し訳ございません。 ご回答の程宜しくお願い申し上げます。

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

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • このプログラムを見てください(C言語) m( _ _ )m

    現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

  • C言語 じゃんけんゲーム 非常に困っています

    じゃんけんゲームを作成したのですが コンピュータの出す手を5つのパターンを作成して その5つのパターンを関数化して呼び出すようにする。 というのを作成したいのですが検索などしましたが コンピュータの調子が悪く、それらしい物が見つからず、 何方か無礼ですが自分ならこうするという模範解答お願いします… 一応下記のプログラムまでは進められましたが switch()case を関数化してゲーム前に入力して5つのパターンを それぞれ呼び出せるようにしたいです… (例:ゲーム前に「パターンを選択:5でランダム、6でコンピュータ絶対勝つ…(省略)」 を表示させて入力数字でパターンを呼び出し、開始する) 5つのパターン(コンピュータの手) 完全ランダム コンピュータが絶対勝つ コンピュータが絶対負け 絶対引き分け 絶対引き分け無い 作成したプログラム #include <stdio.h> #include <stdlib.h> #include <time.h> char *table[]={"グー","パー","チョキ"}; int main(void) { int i,j; int continue_f; int player,computer; int p_win,p_lose,p_draw; int t_win,t_lose,t_draw; t_win=t_lose=t_draw=0; srand(time(NULL)); do{ p_win=p_lose=p_draw=0; for(i=0;i<5;i++){ while(1){ printf("あなたが出した手は・・・\n"); printf("グー:0 パー:1 チョキ:2\n"); scanf("%d",&player); if(0<=player&&player<=2){ break; }else{ printf("もう一度入力してください。\n"); } } switch(i){ case 0: computer=rand()%3; break; case 1: computer=(player+1)%3; break; case 2: computer=(player+2)%3; break; case 3: computer=player; break; case 4: do{ computer=rand()%2; }while(computer==player); break; } if((player+1)%3==computer){ printf("あなたは%sでわたしは%sです・・・わたしの勝利です。\n", table[player],table[computer]); p_lose++; }else if(player==computer){ printf("あなたもわたしも%sです・・・引き分けです。\n",table[player]); p_draw++; }else{ printf("あなたは%sでわたしは%sです・・・あなたの勝利です。\n", table[player],table[computer]); p_win++; } } printf("%d勝 %d敗 %d引き分けでした。\n",p_win,p_lose,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、" "続けない場合は-1を入力してください。\n"); scanf("%d",&continue_f); t_win+=p_win; t_lose+=p_lose; t_draw+=p_draw; }while(continue_f!=-1); printf("トータルで %d勝 %d敗 %d引き分けでした。\n",t_win,t_lose,t_draw); return 0; }

  • c言語初心者です。ついに。。

    西暦月日にちを入れると何曜日かを表示できるプラグラムをつくれましたー。まだif switch do while文しかしらないけど、switch文だけでできました。でも欠点があってうるう年の1月と2月はうまくできなんです。原因わわかっていてさいごの式bに-1をしなければいけないのですがそのうるう年だけ-1という計算をどうすればできるのかが思いつきません。もし詳しい人がいたら教えてくださいーー。 #include <stdio.h> int main(void) { int y, m, l, z,v,h,q,f,x,o,j,e,a,r,b; printf("西暦何年何月か入力してください\n"); printf("西暦。:"); scanf("%d",&y); printf("何月。:"); scanf("%d",&m); printf("何日。:"); scanf("%d",&l); z=y%400; v=y%100; h=z-v; f=h/100; switch(f) { case 3 : q=0; break; case 1 : q=4; break; case 2 : q=2; break; case 0 : q=6; break; } o=y%100; j=o/4; e=o+j; a=m; switch(a) { case 1 : r=0; break; case 2 : r=3; break; case 3 : r=3; break; case 4 : r=6; break; case 5 : r=1; break; case 6 : r=4; break; case 7 : r=6; break; case 8 : r=2; break; case 9 : r=5; break; case 10 : r=0; break; case 11 : r=3; break; case 12 : r=5; break; } b=q+e+r+l; switch (b % 7){ case 0 : puts("日曜日です。"); break; case 1 : puts("月曜日です。"); break; case 2 : puts("火曜日です。"); break; case 3 : puts("水曜日です。"); break; case 4 : puts("木曜日です。"); break; case 5 : puts("金曜日です。"); break; case 6 : puts("土曜日です。"); break; } return (0); }

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。