Previous: 返り値または引数を持たない関数
Up: 関数を作る II
Next: 復習
Previous Page: 返り値または引数を持たない関数
Next Page: 復習
C 言語でも、グローバル変数を使うことが出来る。但し、C 言語でのグローバル変数 には、2種類あり、同じファイル(プログラムソースの)にあるものと、違うファイル にあるグローバル変数とは違う扱いになるが、ここでは、同じファイルにある グローバル変数の宣言の仕方を学ぶ。
ファイル内で有効なグローバル変数を宣言するには、関数の外側、ファイルの最初 のところ(関数定義が始まる前に)宣言すればよい。
グローバル変数の例 #include <stdio.h>int gloval=1; /* グローバル変数 */
test(){
printf("グローバル変数 %d\n", gloval); }
main() { printf("グローバル変数 %d\n", gloval); gloval++; test(); }
この例では、最初にグローバル変数は、1に設定されて、main() の中で表示 するときは、1になっている、次にその値を2に増やして、関数 test を呼ぶと、 関数 test の中で表示しても確かに、2 になっている。
課題13
cd c を実行した後で( /c に移動した後で)、以下の課題を やってみよ。
本文の「コンパイルエラーになる例」を入力し、実際にコンパイルしてみて、 エラーが出ることを確かめよ。 次に、関数宣言をつけ加えて、エラーが出なくなることを確認せよ。
主人公は10X10の升目を動くものとする。敵は1人だけしか一度には出てこない。 敵は動けないが、強さや装甲の堅さは乱数で決める。主人公は、マップに落ちている アイテムを拾えば、強さや装甲がアップする。敵と同じ位置にくると戦うか又は逃げな ければならない。逃走が成功するかどうかも乱数で決める。敵の位置は分からない。
以上のようなゲームを作ろう。
プログラムは、
以下のプログラムを入力せよ。プログラムは、関数宣言をしてないので、適切な 関数宣言をせよ。また、それぞれの関数の役割を説明せよ。
#include <stdio.h>/* ここに関数宣言をする。*/
/* グローバル変数 */ int my_x=5, my_y=0; /* 主人公の (x,y) 座標 */ int my_offence=10, my_defence=1; /* 主人公の強さ、守り */ int my_life=100; /* 主人公の命 */ int enemy_x, enemy_y; /* 敵の (x,y) 座標 */ int enemy; /* 0ならば敵はいない、1ならばいる */ int enemy_offence, enemy_defence; /* 敵の強さ、守り */ int enemy_life; /* 敵の命 */ int ken_x, ken_y, ken; /* 剣の位置、既に装備したか 1 ならまだ */ int yoroi_x, yoroi_y, yoroi; /* 鎧の位置、既に装備したか 1 ならまだ */ int num_enemy; /* 倒した敵の数 */
main() { int seed; printf("ダンジョンゲーム\n"); printf("適当な整数を入力 => "); scanf("%d", &seed); srand(seed);
init();
for(;;){ /* 無限ループ */ if (player_die()){ break; } enemy_create(); display(); if(aruku()){ break; } if(tekigairu()){ for(;;){ if( no_fight() ){ break; } if( fight() ){ break; } } } get_item(); } }
player_die(){ if (my_life <= 0){ printf("ゲームオーバー\n"); printf("倒した敵の数 %d\n", num_enemy); return !0; } return 0; }
display(){ printf("現在位置 (x,y) = ( %d, %d)\n", my_x, my_y); printf("歩く方向を選択するか、終了して下さい。\n\n"); printf(" 8: 上に \n"); printf("4: 左 5: ゲーム終了 6: 右 \n"); printf(" 2: 下 \n"); printf("\n 選択 => "); }
get_item(){ if (ken==1){ if (my_x==ken_x && my_y==ken_y){ printf("剣を見つけました。装備します。\n"); my_offence = my_offence * 2; printf("強さが2になりました。\n"); ken--; } } if (yoroi==1){ if (my_x==yoroi_x && my_y==yoroi_y){ printf("鎧を見つけました。装備します。\n"); my_defence = my_defence * 2; printf("防御が2になりました。\n"); yoroi--; } } }
tekigairu(){ if (my_x == enemy_x && my_y == enemy_y){ return !0; }else{ return 0; } }
no_fight(){ char input;
fflush(stdin); printf("敵がいます。どうしますか? "); printf("戦う: y, 逃げる: n ==> "); scanf("%c", &input); fflush(stdin);
if (input == 'n'){ if(rand()%10 >= 5){ printf("逃げました。\n"); return !0; }else{ printf("逃げられませんでした。1度は戦います。\n"); } } return 0; }
fight(){
printf("敵と戦います。\n");
enemy_life -= my_offence/enemy_defence;
if (enemy_life <= 0){ printf("敵を倒しました。\n"); enemy--; num_enemy++; return !0; }else{ my_life -= enemy_offence/my_defence; }
if (my_life <= 0){ printf("あなたは死にました。\n"); return !0; }else{ printf("敵の生命力は %d, あなたの生命力は %d\n", enemy_life, my_life); } return 0; }
aruku(){ int input; scanf("%d",&input); if(input==5){ return !0; }else if(input==8){ if(my_y==9){ printf("動けません\n"); }else{ my_y++; } }else if(input==2){ if(my_y==0){ printf("動けません\n"); }else{ my_y--; } }else if(input==4){ if(my_x==0){ printf("動けません\n"); }else{ my_x--; } }else if(input==6){ if(my_x==9){ printf("動けません\n"); }else{ my_x++; } } return 0; }
enemy_create(){ if(enemy==0){ enemy_x = rand()%10; /* 敵の位置 x */ enemy_y = rand()%10; /* 敵の位置 y */ enemy_life = rand()%100+1; /* 敵の命 1-100 */ enemy_offence= rand()%10+1; /* 敵の強さ 1-10 */ enemy_defence= rand()%2+1; /* 敵の防御 1-2 */ enemy = 1; } }
init(){ ken_x = rand()%10; ken_y = rand()%10; ken = 1; yoroi_x = rand()%10; yoroi_y = rand()%10; yoroi = 1; }
プレイしてみて、問題がないかどうか確かめよ。
作成した関数宣言と解説をメイルで、 金山まで送ること。但し、題は kadai13 とすること。
プログラム全体は大きいので、送らないこと。