ページへ戻る

− Links

 印刷 

blike​/intro​/p0005 のバックアップソース(No.4) :: OSASK計画

osaskwiki:blike/intro/p0005 のバックアップソース(No.4)

« Prev[4]  Next »[5]
* (4) gotoで分岐 [#o0921b66]
-(by [[K]], 2011.02.15)
*** (1) rei0012.c~rei0014.c 変数は再利用できる [#zb7f43c4]
-今まで一度もやっていませんでしたが、実は変数は一度覚えた数字を完全に忘れてもらって、新しい数字を覚えなおさせることができます。ということで、こんな例を示します。まずは、今までどおりの書き方。
 int a, b;
 a = 1 + 3 + 5 + 7 + 9;
 printf("きすうのこたえ = %d\n", a);
 b = 2 + 4 + 6 + 8 + 10;
 printf("ぐうすうのこたえ = %d", b);
-次が今回の書き方。
 int a;
 a = 1 + 3 + 5 + 7 + 9;
 printf("きすうのこたえ = %d\n", a);
 a = 2 + 4 + 6 + 8 + 10;
 printf("ぐうすうのこたえ = %d", a);
-どちらもまったく同じ結果になります。基本的に好きなほうを使えばいいです。少ない変数をうまく繰り返し使うほうがいい場合がありますが、別々の変数を使ったほうがいい場合もあります。
-ところで、覚えなおす前の数値を思い出させる方法はありません。忘れてほしくないときは、別の変数に値を覚えておいてもらったりします。
 int a, b;
 a = 1 + 3 + 5 + 7 + 9;
 printf("きすうのこたえ = %d\n", a);
 b = a;
 a = 2 + 4 + 6 + 8 + 10;
 printf("ぐうすうのこたえ = %d\n", a);
 printf("さっきのこたえ = %d", b);
*** (2) rei0015.c 変数名 [#t01d05b4]
-今まで変数名はa、b、cなどを使ってきましたが、これは必ずそうしなければいけないということではありません。いきなりbから使ってもいいのです。zからでもいいです。
-さらにいうと、変数はアルファベット一文字でなければいけないというわけではありません。何文字でもいいのです。だから変数は26個までということはありません。安心してください。ちなみに数字を混ぜてもいいです。ただし、変数名の最初の文字はアルファベットです。
-しかしどの場合も、最初に宣言が必要です。宣言というのは、 int a; とか float b; とかそういうことです。それを忘れるとエラーになって怒られます。
-それとprintfやifやintのような、命令と同じ名前の変数は作れません。コンピュータが混乱するからです。
 int kotae0, kotae1;
 kotae0 = 1 + 3 + 5 + 7 + 9;
 printf("きすうのこたえ = %d\n", kotae0);
 kotae1 = 2 + 4 + 6 + 8 + 10;
 printf("ぐうすうのこたえ = %d", kotae1);
*** (3) rei0016.c gotoで分岐 [#ad017ec6]
-プログラムは基本的に、上の行から下の行へ順番に実行されていきます。でもときどき、全然違う場所にジャンプさせたい場合があります。それをするのがgotoとラベルです。
-たとえば...
--http://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%96%E3%83%83%E3%82%AF
-ここの「例」の「シナリオ」を見てください。こんな感じのゲームを作ることを考えます。
 int a;

 s1:
 printf("君の目の前には先祖伝来の箱がある。なんとかして開けたいが開け方が分からない。箱には2つのスイッチのようなものがついている。\n");
 printf("1.赤いスイッチを押す\n");
 printf("2.青いスイッチを押す\n");
 printf("3.何もしない\n");
 a = inptInt("どうしますか? ");
 printf("\n");
 if (a == 1) { goto s3; }
 if (a == 2) { goto s4; }
 if (a == 3) { goto s5; }
 goto s1;

 s2:
 printf("それは毒矢だった。君は薄れ行く意識の中で自らの不運を呪った。 fin.");
 goto fin;

 s3:
 printf("赤いスイッチを思いっきり押してみた。その瞬間、箱の中から何かが飛び出してきた。サイコロを1つ振れ。\n");
 a = inptInt("いくつが出ましたか? ");
 printf("\n");
 if (a == 1) { goto s6; }
 if (2 <= a && a <= 6) { goto s7; }
 goto s3;

 s4:
 printf("青いスイッチを押してみた。蓋が開き中から古びた紙が現れた。\n");
 printf("1.もう少し箱の中を調べる\n");
 printf("2.紙を調べる\n");
 a = inptInt("どうしますか? ");
 printf("\n");
 if (a == 1) { goto s8; }
 if (a == 2) { goto s9; }
 goto s4;

 s5:
 printf("君は何もしないことに決め、箱をクローゼットにしまい込んだ。この箱はその後開けられる事はなく忘れ去られていった。fin.");
 goto fin;

 s6:
 printf("それは君の上着のボタンにあたり、跳ね返った。どうやら毒矢だったらしい。九死に一生を得た君は、\n");
 printf("1.青いスイッチを押す\n");
 printf("2.何もしない\n");
 a = inptInt("どうしますか? ");
 printf("\n");
 if (a == 1) { goto s4; }
 if (a == 2) { goto s5; }
 goto s6;

 s7:
 printf("それは君の首筋をかすめていった。\n\n");
 goto s2;

 s8:
 printf("箱の中をよく調べている内に、指先に激痛が走った。慌てて手を引っ込めて中をのぞき込むと細い針のようなものが見える。\n\n");
 goto s2;

 s9:
 printf("それは、かつて徳川家が隠した財宝のありかを示す地図だった。1年後、財宝を手に入れた君は優雅な余生を送る事になった。fin.");
 goto fin;

 fin:
-まあこんな感じでしょうか。
-s1: とか s2: とか fin: というのがラベルで、プログラムの場所に印をつけることができます。これ自体は何もしません。ラベルの名前は変数名と同様に自由につけられます。コロンを忘れずに。
-そして goto s2; とかすると、プログラムの実行は次の行に行くのをやめて、指定されたラベルのところへジャンプします。gotoで使うときは、ラベル名にコロンをつけてはいけません。気をつけてください。
-細かい説明をすると、最初の選択肢で、3つのif命令の後に goto s1; がありますが、これは入力ミスなどの場合に、もう一度入力しなおさせるためのものです。またs9:のところの最後の goto fin; は必要ないです。だって次の行が fin: ですからね。まあでも書いても悪くはないので、なんとなく書きました。
*** (4) まとめ [#se24004e]
-これでアドベンチャーゲーム(選択肢を選んでいってストーリーを楽しむゲーム)が作れるようになりました。実際、市販されているゲームは、これに絵を加えただけです。絵を扱う方法はもう少ししたらやりますので楽しみにしていてください。
-現状では絵はかけないですが、でもストーリーが面白ければ十分に面白いゲームを作れます。是非一つか二つ(余裕や興味があればもっとたくさん)作ってみてほしいです。まずはがんばってストーリーを考えましょう。


« Prev[4]  Next »[5]