戦闘ゲームを作りたいと思います。
#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回復した」と表示されてしまいます。
つまり回復した数値が表示されるべきところで、「回復した後の生命力」が表示されて
しまいます。
この場合ちゃんと実際に回復した数値だけを表示させるには、どうすればいいんでしょ
うか?
myHP+=a
↑が悪いんじゃないの?
回復量がaならprintfの引き数はaでは?
> なぜか「40回復した」と表示されてしまいます。
回復する量は a なのに、myHP の方を表示しようとしているからです。
if(myHP<30){
myHP+=a
printf(プレイヤーは、ホイミをとなえた。HPが%d回復した。, a);
例えばこんな感じで回復と表示を別々に書いて、a を表示対称にすればいいはず。
myHP+=a を実行した後に
a=rand()%30; を実行しているのはいいのでしょうか?
今のままだと、ホイミを唱えて回復できるHPは、直前の攻撃で相手に与えたダメージと同
じ量にしかなりませんよ。
if(myHP<30)
{
a=rand()%30;
printf( (略) HPが%d回復した。, a );
myHP+=a;
}
とすべきでは?
> myHP+=a を実行した後に
> a=rand()%30; を実行しているのはいいのでしょうか?
おおっと。そこまで見てませんでした....orz
確かに たか さんの意図とは違いそうかも。
ついでに、a という変数名もあまり好ましくないと思います。
内容の分るものをつけて、流用は避けた方がいいでしょう....。
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;
いずれにしろフラグの変数があったほうがいいですね
> >a=rand()%30; を実行しているのはいいのでしょうか
> これは意味があることになりますね(たぶん間違いでしょうけど・・・)
...となると、プレイヤーの攻撃か敵の攻撃かを判断する変数aは、0~29の値を取りうる
のに、「aが4以下の時のみプレイヤーの攻撃とする」ってことですか? かなり苦戦を強い
られそうなゲームですね。
いきなりで申し訳ありませんが、このようにプログラムを作り変えてみました。
念のため言っておきますとまだ途中です。
#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」の呪文を選びもしないのにです。
「攻撃する」を選択してそのターンが終わり、次のターンに入る前に必ず最初のセレク
ト画面に戻すにはどうすればいいでしょうか?
break文を入れましょう。
別のスレッドを立てられていますが、こちらの問題は解決したのでしょうか。
# このサイトの「使用上の注意」を参照