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 に移動した後で)、以下の課題を やってみよ。

課題 13.1
関数の宣言時におけるコンパイルエラー

本文の「コンパイルエラーになる例」を入力し、実際にコンパイルしてみて、 エラーが出ることを確かめよ。 次に、関数宣言をつけ加えて、エラーが出なくなることを確認せよ。

課題 13.2
ロールプレイングゲーム作る。

主人公は10X10の升目を動くものとする。敵は1人だけしか一度には出てこない。 敵は動けないが、強さや装甲の堅さは乱数で決める。主人公は、マップに落ちている アイテムを拾えば、強さや装甲がアップする。敵と同じ位置にくると戦うか又は逃げな ければならない。逃走が成功するかどうかも乱数で決める。敵の位置は分からない。

以上のようなゲームを作ろう。

プログラムは、

  1. 乱数の 種の数をプレイヤーに入力して貰う。
  2. 剣と鎧の位置を乱数で決める。
  3. 無限ループに入る
  4. 敵がいなければ、敵の強さ、装甲の強さ、位置を乱数で決める。
  5. 主人公が生きているかどうか検査。死んでいれば、ゲームは終わる。
  6. プレイヤーに歩く方向を決めて貰う。
  7. 主人公を動かす。
  8. アイテム、敵に遭遇していないか判断する。アイテムが落ちていたら、拾う。 敵に遭遇したら、戦うかどうかプレイヤーに判断を求めて、戦うならば戦闘。逃げる ならば、乱数で逃げれるかどうか決める。
  9. ゲームが終わる。

以下のプログラムを入力せよ。プログラムは、関数宣言をしてないので、適切な 関数宣言をせよ。また、それぞれの関数の役割を説明せよ。

#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 とすること。

プログラム全体は大きいので、送らないこと。

maruyama@wakhok.ac.jp
1995年02月08日 (水) 18時57分57秒 JST