前回のスレでレス下さった方々ありがとうございました。
長くなったので新たにスレ立てます。新たにこのようにプログラム組み替えました。文
章的におかしい箇所をすべて指摘して下さい。
#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(何をしますか?\n\n【0:攻撃/1:呪文/2:逃げる】:\n\n);
scanf(%d,&select);
switch(select){
case 0:
a=rand()%20;
enemyHP-=a;
printf(プレイヤーの攻撃!敵に%dのダメージ
を与えた。\n\n,a);
a=rand()%20;
myHP-=a;
printf(敵の攻撃!プレイヤーは%dのダメージ
を受けた。\n\n,a);break;
case 1:
printf(何の呪文を使いますか?\n\n【0:コマ
ンド画面に戻る/1:ホイミ/2:メラ 】:\n\n);
scanf(%d,&magic);
switch(magic){
case 1:myHP+=30;
myMP-=3;
printf(プレイヤーはホイミを唱え
た。\n\n プレイヤーのHPが30回復した\n\n);
if(myMP<3)
printf(プレイヤーはホ
イミを唱えようとした。\n\n しかしMPが足りない!\n\n);
case 2:a=rand()%30;
myMP-=5;
enemyHP-=a;
printf(プレイヤーはメラを唱え
た。\n\n 敵に%dのダメージを与えた\n\n,a);
if(myMP<5)
printf(プレイヤーはメラを
唱えようとした。\n\n しかしMPが足りない!\n\n);
}
break;
case 2:
myspeed=100-a;
a=rand()%20;
enemyspeed=100-a;
a=rand()%20;
if(enemyspeed>myspeed)
a=rand()%20;
myHP-=a;
printf(プレイヤーは逃げ出した。し
かし回り込まれてしまった!\n\n 敵の攻撃!プレイヤーは%dのダメージを受けた。
\n\n,a);
if(myspeed>enemyspeed)
printf(プレイヤーは逃げ
た。);break;
}
printf(プレイヤーのHP:%d プレイヤーのMP:%d / 敵のHP:%
d\n\n,myHP,myMP,enemyHP);
getchar();
if(myHP<=0) {printf(プレイヤーは死にました\n);break;}
if(enemyHP<=0) {printf(敵をやっつけた!!\n);break;}
}
}
> 文章的におかしい箇所をすべて指摘して下さい。
というお願いの仕方?
反射的に「嫌です」と答えたくなりますし、
文章ということはプログラムは評価対象外ですか。
そもそも、仕様も提示しないコードだけ提示して
レビューを頼むところではないと思うのですが.....。
誤字脱字に相当するような文法レベルの問題は別として、
仕様が分らないと、どうなれば たか さんにとって
「おかしくない」のかが他人には分りません。
何が書きたいのか、どう書きたいのか分らない文章を
他人が添削できるはずがないと思いませんか。
突込みどころ満載のプログラムですね。
3分眺めただけでぼろぼろと指摘したい箇所が・・・
ホイミで回復した後にMPが足りてるか計算してる。
ホイミ後にbreakがないからそのままcase 2に処理が突入してる。
メラで攻撃した後にMPが足りてるか計算してる。
逃げる選択時にaの値が初期化されていないことがある。
enemyspeed=myspeedの時はどうするの?
enemyspeed<myspeedの時に
myHP-=a;
printf(プレイヤーは逃げ出した。し
かし回り込まれてしまった!\n\n 敵の攻撃!プレイヤーは%dのダメージを受けた。
\n\n,a);
が実行されると思うけど。
これ本当にデバッグしてます?
文章的におかしいと思うのは
・printfの文字列に「。」があるのとないのがある。
ぐらいかな?
プログラム的にはざっとみあの処理がないって気がするけど
まぁ文章的って事なので・・・プログラムの方はデバッグすれば気づくことだし。
文章的に気づいたのはこんなもん。
元々どこの掲示板でも人に添削だけをさせるようなことは嫌われる傾向にあるので
気ぃ付けましょ。
まぁ後はBanさんの言うとおり。
プレーヤーは逃げられないの?
どこがおかしいかは'期待する値'と'実際の結果'がないと判断できないので言及は避ける。
それよりも、延々と続くswitch文を見ただけで「書き直せ」と言いたい。
> これ本当にデバッグしてます?
テスト・ランすらやってないでしょうね。
実際に遊んでみれば穴だらけなのに気づかぬはずがない。
どうも前のスレッドで、私が訊かれたこと以外に言及してしまったために、質問者に「こ
こでソースを見せさえすれば自分が気づかなかった問題点まで指摘してくれて解決方法ま
で教えてくれる」という誤解を与えてしまったようですね。もう少し「誤解されないツッ
コミのしかた」について勉強しなくては。
質問者も、質問する上で最低限やっておくべきことはやってくださいね。
「使用上の注意」と、そこからたどれる「技術系メーリングリストで質問するときのパ
ターン・ランゲージ」は一読してください。
「文章的に」と書きましたが、「プログラム的に」という意味です。いろいろと説明不
足で申し訳ありませんでした。
実はデバッグを試して、実行できませんでした。
しかし何度見ても、どこがおかしいかわかりませんでした。
正確には、
1、
if(myMP<3)
printf(プレイヤーはホイミを唱えようとした。\n\n しかしMPが足りない!\n\n);
という部分と、
if(myMP<5)
printf(プレイヤーはメラを唱えようとした。\n\n しかしMPが足りない!\n\n);
という部分が、
「プログラムとして認識できない。」と表示されたのですが、これはなぜなんでしょう
か?
二つとも大きなswitch文であるswitch(select)の中の、case 1のさらに中の、switch
(magic)の中のプログラムなのですが。
2、あともう一つ不満な点は、デバック時には何ら問題なかったのですが、
switch(select)の中のcase2の、
if(myspeed>enemyspeed)
printf(プレイヤーは逃げた。);break;
という部分。
ここで逃げた時点でゲーム終了にしたいのですが、普通に
最初の「何をしますか?」というセレクト画面に戻されてしまいます。
breakは確実に必要だと思うのですが、この場合はどう使ったらいいのでしょうか?
> 質問者も、質問する上で最低限やっておくべきことはやってくださいね。
> 「使用上の注意」と、そこからたどれる「技術系メーリングリストで質問するときのパ
> ターン・ランゲージ」は一読してください。
「技術系メーリングリストで質問するときのパターン・ランゲージ」は読まれましたか。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 「文章的に」と書きましたが、「プログラム的に」という意味です。
分った上であえて指摘しましたが、これは些事です。
本質的な問題はそこではないと思いますが.....。
> 実はデバッグを試して、実行できませんでした。
ではどうなったのでしょうか。まずはそれを具体的に書いてください。
> しかし何度見ても、どこがおかしいかわかりませんでした。
ソースを見返しただけで、いきなりどこがおかしいか分る人はそれなりの経験者だと思います。
プログラムの挙動から、どこがおかしいか適切に推測できる人も同様です。
まず、ブレイクポイントを張ってステップ実行し、実際の値をトレースしてみてください。
デバッグの基本です。
> 「プログラムとして認識できない。」と表示されたのですが、これはなぜなんでしょうか?
意味がわかりかねます。表示されるメッセージは表示されたままを書いてください。
> 二つとも大きなswitch文であるswitch(select)の中の、case 1のさらに中の、switch
> (magic)の中のプログラムなのですが。
端的に言って設計が悪いです。επιστημη さんの「書き直せ」に賛同します。
適度な規模の関数/クラスに分割してください。
> 2、あともう一つ不満な点は、デバック時には何ら問題なかったのですが、
では、いつ問題となったのでしょう。
たか さんのいう「デバッグ時」とはどういうことを指していますか。
この挙動が何ら問題にならない「デバッグ時」が想定できません。認識にずれがあるようです。
確認した手順は簡単に箇条書きにしてください。
また、たか さんは不満だと思ったかもしれませんが、どう動くのが期待通りなのか、
他の人にはわかりません。既に指摘しているように動作仕様が提示されていないからです。
まず、期待する動作・結果をまとめて、それを提示してください。
> ここで逃げた時点でゲーム終了にしたいのですが、
main 関数の途中でプログラムを終了するには、main 関数から return します。
任意の関数の途中でプログラムを終了するには exit 関数を使用します。
・大前提・
このサイトの「使用上の注意」にもあるように、
使用している開発環境(OSやコンパイラ)を明示してください。
Banさん
>> 実はデバッグを試して、実行できませんでした。
>ではどうなったのでしょうか。まずはそれを具体的に書いてください。
要はデバッグボタンを押すと、プログラム上にエラーが表示されたっつーことですよ。
つまり実行して数値を読み込む以前の問題だっつーことです。
エラーが出ていたらデバックできないってことはわかりますよね?
そのエラーが出てたのが↓の部分だっつーことです。
その位置にこれらのプログラムがあるのはおかしいという意味の表示でした。
しかし自分としてはこれらをどこに入れるべきかわかりません。
要は、「呪文を使おうとしたが、それにはマジックパワーが足りない。」という意味の
ことを言いたいわけです。
if(myMP<3)
printf(プレイヤーはホイミを唱えようとした。\n\n しかしMPが足りない!\n\n);
という部分と、
if(myMP<5)
printf(プレイヤーはメラを唱えようとした。\n\n しかしMPが足りない!\n\n);
>的に言って設計が悪いです。επιστημη さんの「書き直せ」に賛同します。
>度な規模の関数/クラスに分割してください。
それはswitch分の中のcase1の中にさらにswitch分があることを言っているのでしょう
か?
しかしあの部分ではエラーは出なかったですし、あの場合はああ書くしかなかったよう
に思うのですが。
まず「呪文」を選択して、その中でさらに「何の呪文を使うか?」という選択をするの
が目的なので。
>> 2、あともう一つ不満な点は、デバック時には何ら問題なかったのですが、
>では、いつ問題となったのでしょう。
上で言ったあの2つのエラーが出たプログラムは後の方で全体のプログラムに付け加え
たわけですけど、まだあの2つのプログラムがなかった頃は、普通にデバッグはできて
ましたので。
ただ、「逃げる」を選択して、
printf(プレイヤーは逃げた。);
が表示されたとしたら、そのままゲーム終了できるようにしたいわけです。
>使用している開発環境(OSやコンパイラ)を明示してください。
Visual Studo.NET 2003です。
// プログラムにツッコミを入れる前に
// 中の人にツッコミを入れたくてウズウズ
変数 a の値を常に 0~19 までの乱数にしてますから
真っ先に逃げない限り、見た目はソレらしく
動作するんですね。
ですが、お人様にみせるレベルにしたいのでしたら
丸々書き直したほうが良いと思われます。
「こうぞうたい」「れっきょたい」「かんすう」あたりを
調べられて、使えるようになられるともう少し幸せに
なれるかもしれません。
// 昔、このソースをパワーアップさせたような
// プログラムを組んでる人を見てしまいましたが
// 「この人とだけは仕事を組むのだけは勘弁」と
// 思わずには居られませんでした。
>その位置にこれらのプログラムがあるのはおかしいという意味の表示でした。
自分の解釈じゃなく、エラーをそのまま提示してください。
一行が長いから、変な所で改行してるだけだったりして(^^;
>ただ、「逃げる」を選択して、
>printf(プレイヤーは逃げた。);
>が表示されたとしたら、そのままゲーム終了できるようにしたいわけです。
exit() でも使えば?
敵とプレイヤーを、構造体にすると少しは見やすいかも(^^;
初心者なら初心者なりの進め方をするべきかと。
ちゃんと実行できるところまで戻して、そこから足していくべきです。
少し足してきちんと動くかどうか試し、動いたらまた少し足していく。
一気にプログラムを書いていろんなところがダメであたふたしているレベルでは
少しずつ動くかどうか確認しながら進めるべきです。
エラーが出たら出るところでよく調べましょう。
switchの辺りでダメならswitchを良く調べましょう。
ヘルプでも検索でもいいので。
中級者、上級者だって結局こういうことの積み重ねですよ。
>しかしあの部分ではエラーは出なかったですし、あの場合はああ書くしかなかったよう
>に思うのですが。
エラーが出る出ないと設計は違うレベルのお話です。
ただ初心者だと思うし、単に勉強もかねてやってるだけだと思うので
少しずつ勉強するという意味では今はこれでやってって徐々に関数化したり
構造体にしてみたりとかしてもいいと思うけど。個人的には。
if(myMP<3)
printf(プレイヤーはホイミを唱えようとした。\n\n しかしMPが足りない!\n\n);
という部分と、
if(myMP<5)
printf(プレイヤーはメラを唱えようとした。\n\n しかしMPが足りない!\n\n);
という部分が、
「プログラムとして認識できない。」と表示されたのですが、これはなぜなんでしょう
か?
2005/06/02(木) 11:30:53に提示されたソースを見ると、「MPが足りない」を含む1文は他
の行に比べて改行位置が違っているところが気になるんですが、もしかして、文字列の途
中で勝手に改行入れたりしてます?