ページ 11

randで取得した回数分繰り返したい

Posted: 2011年2月10日(木) 01:12
by zero
初めまして。
c言語初心者です。
今回、戦闘だけを繰り返すプログラムを作ってみようと思い、書き始めたのですが
途中で実行して確認してみると繰り返し部分がきちんと動作しませんでした…
stage(乱数)の回数分for文で敵の出現を繰り返したいのですが、printfで確認した所繰り返し回数が全くstageと違います…
どの辺りがおかしいのか、よろしければご指導お願い致します。
値だけ入れておいて使ってない変数は今後使う予定です。
以下コードと実行結果を置いておきます

コード:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
int main(void){
        int stage,a,enemy,lv,estr,edef,ehp;
        char ename[10];
        srand(time(NULL));
        stage=rand()%20+1; //ステージ全20

        printf("stage=%d回\n",stage);

        for(a=1;a<=stage;a++){
                enemy=rand()%8+1; //敵全5種+ハズレ
                if(enemy<=2){
                        strcpy(ename,"(^o^)");//ザコ
                        estr=2+lv;
                        edef=1+lv;
                        ehp=4+(lv*2);
                }
                else if(enemy==3||enemy==4){
                        strcpy(ename,"(^q^)");//ザコ2
                        estr=1+lv;
                        edef=2+lv;
                        ehp=3+(lv*2);
                }
                else if(enemy==5){
                        strcpy(ename,"(´・ω・`)");//中
                        estr=4+lv;
                        edef=3+lv;
                        ehp=5+(lv*2);

                }
                else if(enemy==6){
                        strcpy(ename,"(・∀・)");//中
                        estr=3+lv;
                        edef=4+lv;
                        ehp=4+(lv*2);

                }
                else if(enemy==7){
                        strcpy(ename,"(`・ω・´) ");//強
                        estr=5+lv;
                        edef=4+lv;
                        ehp=4+(lv*2);
                }
                else if(enemy==8){
                        printf("何もいない…\n");//ハズレ
                }
                 if(enemy<=7){
                         printf("%sがあらわれた!\n",ename);

                 }
        } 
        printf("ループ後i=%d",i);
        return 0;
}

実行結果

stage=20
何もいない…
(・∀・)があらわれた!
ループ後3

実行結果2

stage=15
(´・ω・`)があらわれた!
ループ後1

Re: randで取得した回数分繰り返したい

Posted: 2011年2月10日(木) 01:39
by bitter_fox
zero さんが書きました:

コード:

int main(void){
        int stage,a,enemy,lv,estr,edef,ehp;
        char ename[10];

        printf("ループ後i=%d",i);
}

誤植かと思いますが、変数iは存在していません。(aの間違いですかね・・・?)
zero さんが書きました:

コード:

        char ename[10];

                else if(enemy==5){
                        strcpy(ename,"(´・ω・`)");//中
                        estr=4+lv;
                        edef=3+lv;
                        ehp=5+(lv*2);
 
                }
本題ですがコピー元の文字列が10を超えているものがいくつかあります。
これが、確保した領域を超えて代入されたために正常な動作になりませんでした。

ename[10]をename[256]などにすると僕のところでは正常に動作しました。

Re: randで取得した回数分繰り返したい

Posted: 2011年2月10日(木) 01:47
by zero
>bitter_foxさん
返信ありがとうございます!
iは誤植でした;
紛らわしいものを書いてしまってすみません。
おお…!そうだったんですね!
256にしてみると、きちんと動作しました。
モヤモヤしていたのですごく助かりました・・・!
ありがとうございました。

Re: randで取得した回数分繰り返したい

Posted: 2011年2月10日(木) 01:53
by bitter_fox
蛇足になりますが、
if (enemy == 2)などを大量に書くよりかは

コード:

switch (enemy)
{
case 1:
case 2:
	...;
	break;
...:
	...;
	break;
}
とした方がスマートになりますよ。
[hr][追記]

コード:

char *enemy[8] = // 間違っていたので修正しました
{
	"(^o^)",
	"(^q^)",
	...
};
として、

コード:

int enemy_id;

enemy_id = 0;

printf("%sがあらわれた", enemy[i]);
と言った風にアクセスするのもスマートかと思います。

Re: randで取得した回数分繰り返したい

Posted: 2011年2月10日(木) 02:02
by zero
> bitter_foxさん
switch文うろ覚えだったのでついついif文で書いてしまいました;
でもやっぱり短い方がいいですし、頑張って書き直してみようと思います!
ご指摘ありがとうございました!