戦闘ゲームの作り方 – プログラミング – Home

通知
すべてクリア

戦闘ゲームの作り方


たか
 たか
(@たか)
ゲスト
結合: 25年前
投稿: 73
Topic starter  

戦闘ゲームを作りたいと思います。

#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回復した」と表示されてしまいます。
つまり回復した数値が表示されるべきところで、「回復した後の生命力」が表示されて
しまいます。
この場合ちゃんと実際に回復した数値だけを表示させるには、どうすればいいんでしょ
うか?


引用解決済
トピックタグ
暇人
 暇人
(@暇人)
ゲスト
結合: 22年前
投稿: 19
 

myHP+=a
↑が悪いんじゃないの?
回復量がaならprintfの引き数はaでは?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> なぜか「40回復した」と表示されてしまいます。

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

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

myHP+=a を実行した後に
a=rand()%30; を実行しているのはいいのでしょうか?

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

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

とすべきでは?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> myHP+=a を実行した後に
> a=rand()%30; を実行しているのはいいのでしょうか?

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

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

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


返信引用
はっぱ」
 はっぱ」
(@はっぱ」)
ゲスト
結合: 20年前
投稿: 1
 

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
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

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

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


返信引用
たか
 たか
(@たか)
ゲスト
結合: 25年前
投稿: 73
Topic starter  

いきなりで申し訳ありませんが、このようにプログラムを作り変えてみました。
念のため言っておきますとまだ途中です。

#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
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

break文を入れましょう。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

別のスレッドを立てられていますが、こちらの問題は解決したのでしょうか。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました