バグが直りません
山手線すごろくのプログラムをC言語で作ろうと思い、以下のように作りました。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
char st[][80]={"東京", "神田", "秋葉原", "御徒町", "上野", "鶯谷", "日暮里", "西日暮里", "田端", "駒込", "巣鴨", "大塚", "池袋", "目白", "高田馬場", "新大久保", "新宿", "代々木", "原宿", "渋谷", "恵比寿", "目黒", "五反田", "大崎", "品川", "田町", "浜松町", "新橋", "有楽町", "東京"};
int now=0;
int dicenum=1;
int pt=30;
int stlength=30;
int dice(void){
int dc;
srand(time(NULL));
dc=rand()%6+1;
return dc;
}
int event(void){
int eve;
srand(time(NULL));
eve=rand()%9+1;
return eve;
}
void step(void){
now++;
}
int turn(void){
int i, d, ev;
for(i=1;i<=dicenum;i++){
d+=dice();
}
printf("ダイス目は%dです。\n", d);
for(i=1;i<=d;i++){
now++;
printf("%s\n", st[now]);
if(now==stlength){
return 1;
}
}
ev=event();
switch(ev){
case 1: printf("プラス10pt\n");
pt+=10;
break;
case 2: printf("プラス20pt\n");
pt+=20;
break;
case 3: printf("プラス50pt\n");
pt+=50;
break;
case 4: printf("マイナス10pt\n");
pt-=10;
break;
case 5: printf("マイナス20pt\n");
pt-=20;
break;
case 6: printf("マイナス50pt\n");
pt-=50;
break;
case 7: printf("急行\n");
dicenum=2;
break;
case 8: printf("特急\n");
dicenum=3;
break;
case 9: printf("新幹線\n");
dicenum=4;
break;
}
if(pt<=0){
return 2;
}else{
return 0;
}
}
int main(){
srand(time(NULL));
int status=0;
char a;
printf("鉄道すごろく(JR山手線)\n");
printf("エンターキーでスタート\n");
scanf("%c", &a);
while(1){
while(getch()!='\r'){
;
}
if(status==0){
printf("現在地:%s\n%dポイント\n", st[now], pt);
status=turn();
}else if(status==1){
printf("ゴール!おめでとう!\n");
break;
}else if(status==2){
printf("残念!ポイントがなくなりました。ゲームオーバー。\n");
break;
}
}
return 0;
}
コンパイルは通ったのですが実行すると"ダイス目は1873695976です。"などとダイス目がものすごく大きな値になってしまいます。原因が全く分からないのでどなたかよろしくお願いします。
お礼
>MAX=4のとき >> int buf[MAX-1]; >で用意されるbuf[?]の?は、いくつからいくつでしょう? あ、なるほど、そう言えばここでの宣言では配列の個数を宣言するんでしたね; 配列は[0]から始まるということを意識しすぎていました・・・ >今回の場合、bufの宣言の直後に変数iの宣言があります。そのためbuf[X]が範囲を越えた場合、まず変数iが被害を受ける可能性があります。というか、実際に受けてます。 こう言う時に宣言の順番等が関係してくるんですね。 分かりやすい解説ありがとうございます。