#include<stdio.h>
#include<stdlib.h>
int sakebi(int a);
main(){
int dmg;
printf("これは、お前に踏み潰されたスライムの痛みだッ!!\n");
dmg=sakebi(3);
printf("ラスボス(首)は、%dポイントのダメージ!!\n",dmg);
printf("これは、ひなたぼっこ中に不意打ちを喰らったゴブリンの怒りだッ!\n");
dmg=sakebi(6);
printf("ラスボス(腹)は、%dポイントのダメージ!!\n",dmg);
printf("ええと、余計なお世話の回復呪文で浄化してしまったスケルトンの分だぁッ!\n");
dmg=sakebi(9);
printf("ラスボス(右足すね)は、%dポイントのダメージ!!\n",dmg);
printf("そしてこれは、全てを失った俺の怒りだッ!!\n");
dmg=sakebi(0);
printf("カウンターッ!!\n貴方は、%dポイントのダメージ!!\n",dmg);
printf("ぐふッ。\n");
}
int sakebi(int a){
int i;
if(a==0)printf("いい加減にしろ。>いーざ\n");
else{
printf("うぎゃ");
for(i=0;i<a;i++)printf("ぁ");
printf("ッ!!\n");
}
return rand();
}
すぐに気が付く問題点は、まず、戻り値を追加した意味が無いということでしょう。(^_^;
まず注目したいのが、インクルードするヘッダファイルが1つ追加されたことです。2行目のstdlib.hがそれです。本プログラムでは、ランダムな整数を返すrand関数を呼んでいるのですが、その関数の宣言部分、つまり関数プロトタイプが存在するヘッダファイルが、stdlib.hという訳です。
では、実際にメモ帳またはエディタを使って、stdlib.hを開いてみることにしましょう。rand関数の関数プロトタイプは以下のようになっています。
int rand(void);パラメータ(仮引数)がvoidになっていることは、パラメータが無いということです。で、本プログラムでは、sakebi関数の最後に追加した1行で、rand関数を呼んでいます。
return rand();つまりこのreturn文で、rand()で得た整数を、呼び出し側(main)へ返している訳です。return文の書式は以下の通りです。
return 式;
これは、お前に踏み潰されたスライムの痛みだッ!! うぎゃぁぁぁッ!! ラスボス(首)は、16838ポイントのダメージ!! これは、ひなたぼっこ中に不意打ちを喰らったゴブリンの怒りだッ! うぎゃぁぁぁぁぁぁッ!! ラスボス(腹)は、5758ポイントのダメージ!! ええと、余計なお世話の回復呪文で浄化してしまったスケルトンの分だぁッ! うぎゃぁぁぁぁぁぁぁぁぁッ!! ラスボス(右足すね)は、10113ポイントのダメージ!! そしてこれは、全てを失った俺の怒りだッ!! いい加減にしろ。>いーざ カウンターッ!! 貴方は、17515ポイントのダメージ!! ぐふッ。rand関数で返ってきた値はさまざまだと思います。ただ、ここで問題となるが、何度実行しても同じ乱数が返ってくることだと思います。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int sakebi(int a);
main(){
int dmg;
srand((unsigned int)time(NULL));
printf("これは、お前に踏み潰されたスライムの痛みだッ!!\n");
dmg=sakebi(3);
printf("ラスボス(首)は、%dポイントのダメージ!!\n",dmg);
・・・ 以下省略 ・・・
と書けばいいです。time関数のパラメータのNULLは、ヌルポインタ定数と呼びます。これは、本プログラムでインクルードされるstdio.h、stdlib.h、そしてtime.hで定義されています。確認しておいて下さい。
rand()%5
とすれば、乱数の範囲が0から4になりますし、
rand()%5+1
とすれば、1から5までが、その範囲となります。
ちなみに、ここで使われている%は、第1オペランドを第2オペランドで割った時の余り(整数)です。
int sakebi(int a,int b){
int i;
if(b!=0)b=rand()%b+1;
if(a==0)printf("いい加減にしろ。>いーざ\n");
else{
printf("うぎゃ");
for(i=0;i<a;i++)printf("ぁ");
printf("ッ!!\n");
}
return b;
}
次回は、mainの方を改良したいと思います。