戦闘ゲームの作り方

[戻る]
たか 2005/05/31(火) 17:42:11
戦闘ゲームを作りたいと思います。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
    
main(){    

   int myHP=100;(自分の生命力)
  int enemyHP=100;(敵の生命力)
   int a;(攻撃したとき(されたとき)相手に与える(自分が受けるダメージ数)
     
   srand( (unsigned)time( NULL ) );
    while(1){
        if(a<=4){
            a=rand()%10;

            printf("プレイヤーの攻撃\n");
            
            enemyHP-=a;
        if(myHP<30){
            printf("プレイヤーは、ホイミをとなえた。HPが%d回復し
た。",myHP+=a);
            a=rand()%30;}
           
        }else{
            printf("敵の攻撃\n");
            a=rand()%11;
            myHP-=a;
        if(enemyHP<30){
            printf("敵は、鼓膜も破れる超音波を鳴らした
\a\a\a\a\a\n。プレイヤーは%dのダメージを受けた。",myHP-=a);
            a=rand()%30;}
        }
        
        printf("自分:%d 敵:%d\n",myHP,enemyHP);
        
        getchar();
        if(myHP<=0)  {printf("プレイヤーは死にました\n");break;}
        if(enemyHP<=0) {printf("敵をやっつけた!!\n"); break;}
     }
}
この中の
printf("プレイヤーは、ホイミをとなえた。HPが%d回復した。",myHP+=a);
という部分で、たとえば生命力が30から40まで回復した場合は10だけ回復したわ
けですが、なぜか「40回復した」と表示されてしまいます。
つまり回復した数値が表示されるべきところで、「回復した後の生命力」が表示されて
しまいます。
この場合ちゃんと実際に回復した数値だけを表示させるには、どうすればいいんでしょ
うか?

暇人 2005/05/31(火) 17:58:22
myHP+=a
↑が悪いんじゃないの?
回復量がaならprintfの引き数はaでは?

Ban 2005/05/31(火) 18:00:48
> なぜか「40回復した」と表示されてしまいます。

回復する量は a なのに、myHP の方を表示しようとしているからです。

if(myHP<30){
  myHP+=a
  printf("プレイヤーは、ホイミをとなえた。HPが%d回復した。", a);

例えばこんな感じで回復と表示を別々に書いて、a を表示対称にすればいいはず。

tib 2005/06/01(水) 11:32:12
myHP+=a を実行した後に
a=rand()%30; を実行しているのはいいのでしょうか?

今のままだと、ホイミを唱えて回復できるHPは、直前の攻撃で相手に与えたダメージと同
じ量にしかなりませんよ。

if(myHP<30)
{
    a=rand()%30;
    printf( "(略) HPが%d回復した。", a );
  myHP+=a;
}

とすべきでは?

Ban 2005/06/01(水) 13:36:21
> myHP+=a を実行した後に
> a=rand()%30; を実行しているのはいいのでしょうか?

おおっと。そこまで見てませんでした....orz

確かに たか さんの意図とは違いそうかも。

ついでに、a という変数名もあまり好ましくないと思います。
内容の分るものをつけて、流用は避けた方がいいでしょう....。

はっぱ」 2005/06/01(水) 17:07:11
while文に入る前にaの初期化をしたほうがいいのでは?
a=rand()%10;
while(1){
        if(a<=4){
            a=rand()%10;

ちなみのこのばあいaは敵(a<=4)と自分(else)の攻撃フラグの役割もしているようですね
そうなると
>myHP+=a を実行した後に
>a=rand()%30; を実行しているのはいいのでしょうか
これは意味があることになりますね(たぶん間違いでしょうけど・・・)
そうなるとこのほうがいいのかな

while(1){
     a=rand()%10;
        if(a<=4){
            a=rand()%10;
その他攻撃、回復処理のprintfの前にa=rand()%n;

いずれにしろフラグの変数があったほうがいいですね

tib 2005/06/01(水) 18:51:59
> >a=rand()%30; を実行しているのはいいのでしょうか
> これは意味があることになりますね(たぶん間違いでしょうけど・・・)

...となると、プレイヤーの攻撃か敵の攻撃かを判断する変数aは、0〜29の値を取りうる
のに、「aが4以下の時のみプレイヤーの攻撃とする」ってことですか? かなり苦戦を強い
られそうなゲームですね。

たか 2005/06/01(水) 18:58:52
いきなりで申し訳ありませんが、このようにプログラムを作り変えてみました。
念のため言っておきますとまだ途中です。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
    
main(){    
   int myHP=100;
   int myMP=50;
   int myspeed=100;
    int enemyHP=100;
    int enemyspeed=100;
   int a;
   int magic;
   int select;
     
   srand( (unsigned)time( NULL ) );
    while(1){
        printf("何をしますか?【0:攻撃/1:呪文/2:逃げる】:");
        scanf("%d",&select);

        switch(select){
            case 0:a=rand()%20;
                enemyHP-=a;
                printf("プレイヤーの攻撃。敵に%dのダメージ
を与えた\n",a);  
                a=rand()%20;
                myHP-=a;
                printf("敵の攻撃。プレイヤーは%dのダメージ
を受けた\n",a);
            case 1:
                printf("何の呪文を使いますか?【0:コマンド
画面に戻る/1:ホイミ/2:メラ 】:");
                scanf("%d",&magic);
                switch(magic){
                    case 1:myHP+=30;
                         printf("プレイヤーはホイミを唱え
た。プレイヤーのHPが30回復した。");
                    case 2:a=rand()%30;
                         myMP-=5;
                         enemyHP-=a;
                         printf("プレイヤーはメラを唱えた。
敵に%dのダメージを与えた。",a);
    
}

printf("自分:%d 敵:%d\n",myHP,enemyHP);
        
        getchar();
        if(myHP<=0)  {printf("プレイヤーは死にました\n");break;}
        if(enemyHP<=0) {printf("敵をやっつけた!!\n"); break;}

    }
}

ここでもまた問題が発生しています。
最初の「何をしますか?」というセレクト画面で「0」の攻撃するを選択したとして
も、なぜかその次のターンでは必ず「何の呪文を使いますか?」という言葉が表示され
てしまいます。「1」の呪文を選びもしないのにです。
「攻撃する」を選択してそのターンが終わり、次のターンに入る前に必ず最初のセレク
ト画面に戻すにはどうすればいいでしょうか?

tib 2005/06/01(水) 19:07:49
break文を入れましょう。

Ban 2005/06/02(木) 18:51:54
別のスレッドを立てられていますが、こちらの問題は解決したのでしょうか。

# このサイトの「使用上の注意」を参照

古いスレッドには追加発言できません。