🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

3148閲覧

C言語を用いたRPGについて

r0_.-

総合スコア3

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/12/27 16:54

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(){
int myHP,myMP,enemyHP,a;
printf("モンスターが現れた!\n");
printf("モンスターの体力:%d\n",enemyHP);
printf("勇者の体力:%d\n",myHP);
srand( (unsigned)time( NULL ) );
while(1){
a=rand()%101;
myHP=99;
enemyHP=108;
if(a<=5){
myHP=myHP-20;
printf("勇者の攻撃!\n");
printf("攻撃を躱された!\n");
printf("モンスターの攻撃!\n");
printf("勇者に20のダメージ!");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
else if(a>5&&a<=20){
enemyHP=enemyHP-5;
myHP=myHP-15;
printf("勇者の攻撃!\n");
printf("モンスターに5のダメージ!\n");
printf("モンスターの攻撃!\n");
printf("勇者に15のダメージ!\n");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
else if(a>20&&a<=50){
enemyHP=enemyHP-10;
myHP=myHP-10;
printf("勇者の攻撃!\n");
printf("モンスターに10のダメージ!\n");
printf("モンスターの攻撃!\n");
printf("勇者に10のダメージ!\n");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
else if(a>50&&a<=90){
enemyHP=enemyHP-15;
myHP=myHP-5;
printf("勇者の攻撃!\n");
printf("モンスターに15のダメージ!\n");
printf("モンスターの攻撃!\n");
printf("勇者に5のダメージ!\n");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
else if(a>50&&a<=90){
enemyHP=enemyHP-15;
myHP=myHP-5;
printf("勇者の攻撃!\n");
printf("モンスターに15のダメージ!\n");
printf("モンスターの攻撃!\n");
printf("勇者に5のダメージ!\n");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
else{
enemyHP=enemyHP-20;
printf("勇者の攻撃!\n");
printf("会心の一撃!\n");
printf("モンスターに20のダメージ!\n");
printf("モンスターの攻撃!\n");
printf("攻撃を躱された!\n");
printf("モンスターの体力:%d 勇者の体力:%d\n",enemyHP,myHP);
}
if(enemyHP=0){
printf("モンスターを倒し、世界に平和が戻った!\n");
return 0;
}
if(myHP=0){
printf("勇者は死に、世界は闇に包まれた!\n");
return 0;
}
}
}

これでRPGを作ろうとしたのですが、モンスター・勇者の体力がどちらもリセットされてからまた減るというのを無限に繰り返していました。どうすればどちらかの体力が0になってRPGを終了させることができますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/12/27 22:04

[RPG]タグは「RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。」 意図したものですか?
guest

回答1

0

ベストアンサー

ぱっと見たところで「おかしい」と思える箇所が2つあります。

1つは、

while(1){ a=rand()%101; myHP=99; enemyHP=108; ```です。 これだと、while による永久ループが始まったら、すぐに myHP と enemyHP が初期化されてしまうので、毎回「体力がどちらもリセットされ」る事になるでしょう。 もう1つは、

if(enemyHP=0){
printf("モンスターを倒し、世界に平和が戻った!\n");
return 0;
}
if(myHP=0){
printf("勇者は死に、世界は闇に包まれた!\n");
return 0;
}

C では、enemyHP=0 と書くと「enemyHP に 0 を代入する」という意味になります。 「enemyHP が 0 と等しいかどうか」という意味にするには、enemy==0 としなければなりません。 ちなみに、昔の C プログラマは、こうした間違いを防ぐために、if(0==enemyHP) という風に判定値を左側に書く、という事をしていました。 0=enemyHP はコンパイルエラーになるので、間違いが見つけやすかったからです。 しかしこれは今ではバッド・ノウハウと言われています(なぜ良くないのかの理由・説明は、忘れてしまいました……済みません)。

投稿2020/12/27 19:21

kurai

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

r0_.-

2020/12/27 19:36

そこを直してみたんですが、今度はマイナスの値になって無限に計算してしまっています。
kurai

2020/12/27 20:42

では、等式 enemyHP==0 ではなく、不等式 enemyHP<=0 で書いてみてはいかがでしょう。 等式は「その場合だけ」しか発動しないので、マイナスになってしまうと、もう発動する事がありません。 「確実に終わらせたい」場合は、不等式を使う方が良いのです。
episteme

2020/12/27 23:33

> そこを直してみたんですが、今度はマイナスの値になって無限に計算してしまっています。 「体力(hp)はマイナスにはならない」と定義したのであれば hp が(増)減した直後に if ( hp < 0 ) hp = 0; しとけばいい。
r0_.-

2020/12/28 05:02

すみません自力で解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問