戦闘ゲームの作り方2

[戻る]
たか 2005/06/02(木) 11:30:53
前回のスレでレス下さった方々ありがとうございました。
長くなったので新たにスレ立てます。新たにこのようにプログラム組み替えました。文
章的におかしい箇所をすべて指摘して下さい。


#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;}

    
    }
}

Ban 2005/06/02(木) 11:47:44
> 文章的におかしい箇所をすべて指摘して下さい。

というお願いの仕方?

反射的に「嫌です」と答えたくなりますし、
文章ということはプログラムは評価対象外ですか。

そもそも、仕様も提示しないコードだけ提示して
レビューを頼むところではないと思うのですが.....。

誤字脱字に相当するような文法レベルの問題は別として、
仕様が分らないと、どうなれば たか さんにとって
「おかしくない」のかが他人には分りません。
何が書きたいのか、どう書きたいのか分らない文章を
他人が添削できるはずがないと思いませんか。

暇人 2005/06/02(木) 13:24:39
突込みどころ満載のプログラムですね。
3分眺めただけでぼろぼろと指摘したい箇所が・・・

ホイミで回復した後にMPが足りてるか計算してる。
ホイミ後にbreakがないからそのままcase 2に処理が突入してる。
メラで攻撃した後にMPが足りてるか計算してる。
逃げる選択時にaの値が初期化されていないことがある。
enemyspeed=myspeedの時はどうするの?
enemyspeed<myspeedの時に
                      myHP-=a;
                    printf("プレイヤーは逃げ出した。し
かし回り込まれてしまった!\n\n 敵の攻撃!プレイヤーは%dのダメージを受けた。
\n\n",a);
が実行されると思うけど。
これ本当にデバッグしてます?

とおりすがり 2005/06/02(木) 13:24:59
文章的におかしいと思うのは
・printfの文字列に「。」があるのとないのがある。
ぐらいかな?

プログラム的にはざっとみあの処理がないって気がするけど
まぁ文章的って事なので・・・プログラムの方はデバッグすれば気づくことだし。
文章的に気づいたのはこんなもん。

元々どこの掲示板でも人に添削だけをさせるようなことは嫌われる傾向にあるので
気ぃ付けましょ。
まぁ後はBanさんの言うとおり。

各無し 2005/06/02(木) 13:37:37
プレーヤーは逃げられないの?

επιστημη 2005/06/02(木) 13:44:30
どこがおかしいかは'期待する値'と'実際の結果'がないと判断できないので言及は避ける。

それよりも、延々と続くswitch文を見ただけで「書き直せ」と言いたい。

επιστημη 2005/06/02(木) 14:00:21
> これ本当にデバッグしてます?

テスト・ランすらやってないでしょうね。
実際に遊んでみれば穴だらけなのに気づかぬはずがない。

tib 2005/06/02(木) 14:25:27
どうも前のスレッドで、私が訊かれたこと以外に言及してしまったために、質問者に「こ
こでソースを見せさえすれば自分が気づかなかった問題点まで指摘してくれて解決方法ま
で教えてくれる」という誤解を与えてしまったようですね。もう少し「誤解されないツッ
コミのしかた」について勉強しなくては。

質問者も、質問する上で最低限やっておくべきことはやってくださいね。
「使用上の注意」と、そこからたどれる「技術系メーリングリストで質問するときのパ
ターン・ランゲージ」は一読してください。

たか 2005/06/02(木) 18:12:53
「文章的に」と書きましたが、「プログラム的に」という意味です。いろいろと説明不
足で申し訳ありませんでした。

実はデバッグを試して、実行できませんでした。
しかし何度見ても、どこがおかしいかわかりませんでした。

正確には、
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は確実に必要だと思うのですが、この場合はどう使ったらいいのでしょうか?

Ban 2005/06/02(木) 19:35:48
> 質問者も、質問する上で最低限やっておくべきことはやってくださいね。
> 「使用上の注意」と、そこからたどれる「技術系メーリングリストで質問するときのパ
> ターン・ランゲージ」は一読してください。

「技術系メーリングリストで質問するときのパターン・ランゲージ」は読まれましたか。
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

> 「文章的に」と書きましたが、「プログラム的に」という意味です。

分った上であえて指摘しましたが、これは些事です。
本質的な問題はそこではないと思いますが.....。

> 実はデバッグを試して、実行できませんでした。

ではどうなったのでしょうか。まずはそれを具体的に書いてください。

> しかし何度見ても、どこがおかしいかわかりませんでした。

ソースを見返しただけで、いきなりどこがおかしいか分る人はそれなりの経験者だと思います。
プログラムの挙動から、どこがおかしいか適切に推測できる人も同様です。
まず、ブレイクポイントを張ってステップ実行し、実際の値をトレースしてみてください。
デバッグの基本です。

> 「プログラムとして認識できない。」と表示されたのですが、これはなぜなんでしょうか?

意味がわかりかねます。表示されるメッセージは表示されたままを書いてください。

> 二つとも大きなswitch文であるswitch(select)の中の、case 1のさらに中の、switch
> (magic)の中のプログラムなのですが。

端的に言って設計が悪いです。επιστημη さんの「書き直せ」に賛同します。
適度な規模の関数/クラスに分割してください。

> 2、あともう一つ不満な点は、デバック時には何ら問題なかったのですが、

では、いつ問題となったのでしょう。

たか さんのいう「デバッグ時」とはどういうことを指していますか。
この挙動が何ら問題にならない「デバッグ時」が想定できません。認識にずれがあるようです。
確認した手順は簡単に箇条書きにしてください。

また、たか さんは不満だと思ったかもしれませんが、どう動くのが期待通りなのか、
他の人にはわかりません。既に指摘しているように動作仕様が提示されていないからです。
まず、期待する動作・結果をまとめて、それを提示してください。

> ここで逃げた時点でゲーム終了にしたいのですが、

main 関数の途中でプログラムを終了するには、main 関数から return します。
任意の関数の途中でプログラムを終了するには exit 関数を使用します。


・大前提・

このサイトの「使用上の注意」にもあるように、
使用している開発環境(OSやコンパイラ)を明示してください。

たか 2005/06/02(木) 21:42:24
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です。

kuma 2005/06/02(木) 22:02:15
// プログラムにツッコミを入れる前に
// 中の人にツッコミを入れたくてウズウズ

変数 a の値を常に 0〜19 までの乱数にしてますから
真っ先に逃げない限り、見た目はソレらしく
動作するんですね。

ですが、お人様にみせるレベルにしたいのでしたら
丸々書き直したほうが良いと思われます。

「こうぞうたい」「れっきょたい」「かんすう」あたりを
調べられて、使えるようになられるともう少し幸せに
なれるかもしれません。

// 昔、このソースをパワーアップさせたような
// プログラムを組んでる人を見てしまいましたが
// 「この人とだけは仕事を組むのだけは勘弁」と
// 思わずには居られませんでした。

まきじ 2005/06/02(木) 22:03:18
>その位置にこれらのプログラムがあるのはおかしいという意味の表示でした。

自分の解釈じゃなく、エラーをそのまま提示してください。
一行が長いから、変な所で改行してるだけだったりして(^^;

>ただ、「逃げる」を選択して、
>printf("プレイヤーは逃げた。");
>が表示されたとしたら、そのままゲーム終了できるようにしたいわけです。

exit() でも使えば?


敵とプレイヤーを、構造体にすると少しは見やすいかも(^^;

とおりすがり 2005/06/02(木) 22:44:30
初心者なら初心者なりの進め方をするべきかと。

ちゃんと実行できるところまで戻して、そこから足していくべきです。
少し足してきちんと動くかどうか試し、動いたらまた少し足していく。

一気にプログラムを書いていろんなところがダメであたふたしているレベルでは
少しずつ動くかどうか確認しながら進めるべきです。

エラーが出たら出るところでよく調べましょう。
switchの辺りでダメならswitchを良く調べましょう。
ヘルプでも検索でもいいので。

中級者、上級者だって結局こういうことの積み重ねですよ。

>しかしあの部分ではエラーは出なかったですし、あの場合はああ書くしかなかったよう
>に思うのですが。
エラーが出る出ないと設計は違うレベルのお話です。

ただ初心者だと思うし、単に勉強もかねてやってるだけだと思うので
少しずつ勉強するという意味では今はこれでやってって徐々に関数化したり
構造体にしてみたりとかしてもいいと思うけど。個人的には。

tib 2005/06/02(木) 23:04:10
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文は他
の行に比べて改行位置が違っているところが気になるんですが、もしかして、文字列の途
中で勝手に改行入れたりしてます?

暇人 2005/06/02(木) 23:04:44
> ただ初心者だと思うし、単に勉強もかねてやってるだけだと思うので
> 少しずつ勉強するという意味では今はこれでやってって徐々に関数化したり
> 構造体にしてみたりとかしてもいいと思うけど。個人的には。
>
今のままのレベルではコーディングは無理だからとりあえずフローチャートでも描いて
アルゴリズムを確立した方がいいと思うよ。
仮にそこそこ動くものができても見通しの悪いプログラムになってしまい、作った本人
もプログラム全体の動作は把握できそうになさそう。

たか 2005/06/02(木) 23:17:33
申し訳ありません。構造体はまだ習ってないのです。
今はとりあえずfor文までしか習ってないので、そこまでの知識でやらなければ
なりません。
>tibさん
>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文は
>他の行に比べて改行位置が違っているところが気になるんですが、もしかして、文字列
>の途中で勝手に改行入れたりしてます?

改行については問題あるでしょうか?文章を見やすくするために長い文は途中で改行し
ているわけなんですが。
文章の長さによって改行位置を変えてるわけですが。

たか 2005/06/02(木) 23:27:17
とりあえず今の所のこのプログラムのフローチャートは、こういう感じです。

1、戦闘シーンに入って、まず(0、攻撃 1、呪文 2、逃げる)のいずれかを選択
する。

2、「0」の「攻撃」を選んだ場合、まず先に自分が攻撃して、そのすぐ後に敵が攻撃
してくる。そして、自分も敵もある数値ずつ生命力が減る。

3、「1」の「呪文」を選んだ場合、さらに呪文の種類(1、ホイミ 2、メラ)のい
ずれかを選択する。
「ホイミ」を選んだ場合、自分の生命力が30ポイント回復して、マジックパワーが3
だけ減少。
「メラ」を選んだ場合、敵に10〜30の範囲内(本当はそうしたいのだけど、その範
囲を自由に決めることができる方法がわからない。)のダメージを与える。
そして自分のマジックパワーも5だけ減少。

4、「2」の「逃げる」を選んだ場合、自分のスピードが敵のスピードより速ければ逃
げることができる。(その時点でゲーム終了にしたいのだけど現時点ではできていな
い。)

敵のスピードの方が早かった場合、敵に回りこまれて攻撃される。

(自分も敵もスピードは常に最大値から20の範囲内で減少する。)

暇人 2005/06/03(金) 00:50:00
フローチャートってこんなの。
http://www.johoka.net/flowchart.htm

メモ用紙にでも実際に書いてみることをお勧めします。

>3
>
だから、MPが足りないときはどうするの?
それはいつ確認するの?
例.
たかさんはコンビニに居て所持金として100円もってます。
ジュース(120円)を飲むとHPが回復します。

Q:コンビニでジュース飲んだ後に残金を確認してお金払いますか?

>4
>
while文の使い方を調べてください。
なぜ(1)にしてるの?

暇人 2005/06/03(金) 00:54:37
書き忘れたから追加。

> 敵に10〜30の範囲内
>
0〜20の範囲を乱数で取ることはできるんですか?
それに+10足せば?

>4
>
だから敵と同じスピードの時はどうるの?

Ban 2005/06/03(金) 02:03:34
> 改行については問題あるでしょうか?
> 文章を見やすくするために長い文は途中で改行しているわけなんですが。
> 文章の長さによって改行位置を変えてるわけです

表示結果を改行する \n のことであれば、見やすいように追加して問題ありません。
まきじ さんや tib さんのご指摘内容は、以下のことかと思います。

ソースコード上の文字列は、そのままでは複数行にできません。
こういうのは NG。
  char* foo = "あい
  うえお";

char* foo = "あいうえお" を複数行に書きたい場合、例えばこう書きます。
  char* foo = "あい"
  "うえお";
(間に特に何もいれず、二つの文字列を連続して記述)


とはいえ、この場合.NET2003なら大抵「error C2001: 定数が 2 行目に続いています。」
というエラーメッセージが出るはずなので、
> プログラムとして認識できない。
と解釈されないように思いますが。

# エラー番号(C????など)やメッセージがわかると、 MSDN で検索するだけでも、
# 結構ヒントが見つかるものです。

επιστημη 2005/06/03(金) 11:01:20
>「プログラムとして認識できない。」と表示されたのですが、これはなぜなんでしょうか?

ひょっとして、コードの中に全角空白が混じっていませんか?
出力されたメッセージをそのまま貼り付けてくださいってば。

とおりすがり 2005/06/03(金) 11:05:01
課題は先生に聞きましょう。
そっちの方が早いし、課題は自分でやるから力になります。

習うとかという言葉があるので本もあると思うんだけど
本を読めばwhileの使い方とか載ってると思うんだけど
本、読んでないのかな?
読んで分からなければ友達とか先生に聞けばいい。

「プログラムの初心者は構わないが質問の初心者は勘弁して欲しい」
と言う書き込みをたまに見ますが自分もそう思う。

課題っぽいしこの辺で終了にしたほうがいいのでは?
質問の初心者にはレスが付かないというのを示していけば質問の初心者は減ると思う
し。

たか 2005/06/03(金) 22:47:48
>課題は先生に聞きましょう。
>そっちの方が早いし、課題は自分でやるから力になります。

>習うとかという言葉があるので本もあると思うんだけど
>本を読めばwhileの使い方とか載ってると思うんだけど
>本、読んでないのかな?
>読んで分からなければ友達とか先生に聞けばいい。

残念ながら先生にも友達にも聞いてはいけないことになってます。
しかも来週の最初の授業には提出しなければならないので急いでます。

あれからまたいろいろとプログラム変更してみました。
結構改善できたので、また疑問点が見つかり次第、質問する予定です。

それって・・・ 2005/06/04(土) 11:42:02
プログラムとは別の次元の話だけど・・・

>残念ながら先生にも友達にも聞いてはいけないことになってます
だからって、ネットで聞いて良いって事にはならんでしょ?
それって要は「自分で考えろ」って事でしょ?

大抵の新人が入社して最初に言われる事だが「学校は金払ってんだから
教えて貰えるけど、会社はお前らに給料払って教える場所ではない。」
あなたが将来何になりたいかはワカランけど、「自分で調べて考える」
ってとっても大事な事だと思うよ。

ただ勘違いされると困るんだが、決して「質問するんじゃねー」と
言ってる訳じゃないから。質問する際にもルールやマナーがある訳でさ。
回答する側も気持ち良く教えたいし、聞く方も気持ちよく教えて貰いたい
じゃんか?どういう風にすればそうなるかは「自分で考えて調べる」事。

うはーすげー説教じみてる。orz

Ban 2005/06/04(土) 14:50:31
> 残念ながら先生にも友達にも聞いてはいけないことになってます。
> しかも来週の最初の授業には提出しなければならないので急いでます。

「(他人に聞かずに)自分で考えろ/調べろ/やってみろ」ということですね。
では、独力でがんばってください。

たか さんが急いでいようがいまいが、たか さん以外にはまったく関係ないですし、
そういう趣旨であれば、(他の方の対応は分かりませんが)少なくとも私は来週
後半まで一切回答しないつもりです。


> 結構改善できたので、また疑問点が見つかり次第、質問する予定です。

たか さん専用の駆け込み寺でもありませんし、少なくとも
「疑問点が見つかり次第」ではなく、自分で調べるなり試行錯誤した後に
質問するべきだと思います。


あと、他の方への配慮として、今度は質問の前に「質問の仕方」を学んでください。
今後、掲示板で質問するのであれば、重要なマナーです。
「技術系メーリングリストで質問するときのパターン・ランゲージ」などが
参考になるでしょう。

たか 2005/06/04(土) 15:51:39
あれからプログラムをこのように組み替えてみました。
詳しいことはまた後ほど説明するつもりです。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
    
main(){    
   int myHP=100;
   int myMP=5;
   int myspeed=100;
    int enemyHP=100;
    int enemyspeed=100;
   int a;
   int magic;
   int select;

     
   srand( (unsigned)time( NULL ) );

   printf("ババアが現われた!!\n\n");
    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 0:printf("何をしますか?\n\n【0:攻撃/1:
呪文/2:逃げる】:\n\n");
                           scanf("%d",&select);break;
                    
                    case 1:if(myMP>=3){
                             myHP+=30;
                             myMP-=3;
                              printf("プレイヤーはホイミを
唱えた。\n\n プレイヤーのHPが30回復した\n\n");
                           }
                           else{
                            printf("プレイ
ヤーはホイミを唱えようとした。\n\n しかしMPが足りない!\n\n");
                         a=rand()%20;
                         myHP-=a;
                         printf("敵の攻撃!プレ
イヤーは%dのダメージを受けた。\n\n",a);}break;
                    
                    case 2:if(myMP>=5){
                             a=rand()%30;
                             myMP-=5;
                             enemyHP-=a;
                              printf("プレイヤーはメラを唱
えた。\n\n 敵に%dのダメージを与えた\n\n",a);
                           }
                           else{
                              printf("プレ
イヤーはメラを唱えようとした。\n\n しかしMPが足りない!\n\n");
                               a=rand()%30;
                               myHP-=a;
                               printf("敵の
攻撃!プレイヤーは%dのダメージを受けた。\n\n",a);}
                }
                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);
                  }
                  else{ 
                    printf("プレイヤーは逃げ
た。");return;
                
                    
                
        }
        
           
            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;}

    
    }
}

たか 2005/06/04(土) 21:04:42
みなさんのおっしゃることは尤もだと思う反面、
↓には正直腹が立った。

>たか さん専用の駆け込み寺でもありませんし、少なくとも
>「疑問点が見つかり次第」ではなく、自分で調べるなり試行錯誤した後に
>質問するべきだと思います。

会ったこともない人間に対して「自分で考えてない!」などと勝手に決め付けるのは
やめろ!!

シャノン 2005/06/04(土) 21:12:39
「使用上の注意」より抜粋

・個人への批判、失礼になるような発言、不快にさせるような発言は行わないで下さ
い。
 また、このような発言に対しては黙殺するようにお願いします。あるいは管理人まで
メールを下さい。

wood 2005/06/04(土) 21:51:56
回答ではありません、参加するのはこの発言のみです

>たか 2005/06/03(金) 22:47:48
>残念ながら先生にも友達にも聞いてはいけないことになってます。
>しかも来週の最初の授業には提出しなければならないので急いでます。
この文章で、「急いでます」って言われても、回答者が「たか さん」の書き込みを
常に待っている訳ではないので・・・
急いでいるなりの質問方法に切り替えるべきです

>たか 2005/06/04(土) 15:51:39
ソースをせっかく提示してるんですけど、見て欲しい特に重点的に指導(回答)して
欲しいところ明確にしてはいかがですか

この質問方法だと、回答者に提示したソースをコピペして回答者の持つ開発環境で
デバックまで依頼しているのではないかと思われてしまいます

このスレッドにおいても動作仕様の提示はしているみたいですが、最終的にどのように
なれば良いか、ご自身、理解してますでしょうか?
どこの変数が、PG終了時どのような値が入っていれば良いかとか?

rand()を使うのも良いのですが、定数値で実行して、PG終了まで完成させてから
でも、使うのは遅くないと思いますよ

>たか 2005/06/04(土) 21:04:42
憤慨なさるのも結構だが
最初の質問文章が大雑把過ぎたため、
「何も考えていない」になったんじゃないですかね

>たか 2005/06/03(金) 22:47:48
>結構改善できたので、また疑問点が見つかり次第、質問する予定です。
ってことは、何らかの解決をしたわけでしょ
スレッドをクローズして、新たに質問したらどうですか
ソース全体提示じゃなくて、もう少し的を絞って
尚、開発環境、実行環境は毎スレッド立てるごとに書き込んでくださいね!

reshia 2005/06/04(土) 22:02:54
本当にプログラムソースは見直していますか?

> case 2:
>  myspeed=100-a;
>  a=rand()%20;
>  enemyspeed=100-a;
>  a=rand()%20;
おかしいとは思いません?

たか 2005/06/04(土) 22:13:02
reshiaさん

もちろんよく見直しました。
しかしそこは別におかしいと思いませんでした。

自分ではわからないので、どうおかしいか教えて下さい。お願いします。

RiSK [E-Mail] 2005/06/04(土) 23:06:07
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main(void) {
    int my_hp = 100, my_mp = 5, my_speed = 100;
    int enemy_hp = 100, enemy_speed = 100;
    srand((unsigned)time(NULL));
    printf("ラウンジが現れた\n");
    for (;;) {
        int command;
        int damage;
        printf("\nたか     HP:%d MP:%d\n", my_hp, my_mp);
        printf("ラウンジ HP:%d\n", enemy_hp);
        printf("0:攻撃 1:呪文 2:逃げる\n>");
        scanf("%d", &command);
        switch(command){
        case 0:
            {
                int damage = rand() % 20;
                enemy_hp -= damage;
                printf("ラウンジに%dのダメージ\n", damage);
                break;
            }
        case 1:
            {
                int magic;
                printf("0:悩む 1:ホイミ 2:メラ\n>");
                scanf("%d", &magic);
                if (!magic) break;
                switch (magic) {
                case 1:
                    if (my_mp < 3) printf("MPが足りない\n");
                    else {
                        my_mp -= 3;
                        my_hp += 30;
                        printf("HPが30回復\n");
                    }
                    break;
                case 2:
                    if (my_mp < 5) printf("MPが足りない\n");
                    else {
                        int damage = rand() % 20 + 10;
                        my_mp -= 5;
                        enemy_hp -= damage;
                        printf("ラウンジに%dのダメージ\n", damage);
                    }
                    break;
                }
                break;
            }
        case 2:
            if (my_speed-rand()%20 < enemy_speed-rand()%20) 
                printf("たかは回り込まれた\n");
            else {
                printf("たかは逃げた\n");
                return 0;
            }
            break;
        }
        if (enemy_hp <= 0) { printf("ラウンジを倒した\n"); break; }
        damage = rand() % 20;
        my_hp -= damage;
        printf("たかは%dのダメージ\n", damage);
        if (my_hp <= 0) { printf("たかは死んだ\n"); break; }
        getchar();
    }
    return 0;
}

tib 2005/06/04(土) 23:09:51
> > > case 2:
> > >  myspeed=100-a;
> > >  a=rand()%20;
> > >  enemyspeed=100-a;
> > >  a=rand()%20;
> > おかしいとは思いません?
> もちろんよく見直しました。
> しかしそこは別におかしいと思いませんでした。

先のスレッドで、私がした指摘を見直してもらえますか。
tib 2005/06/01(水) 11:32:12
同様のミスをここでもしているんです。

一度指摘されたミスを、指摘されたところだけ直して、それが一体どういうミスだったの
か、同様のミスを他の所でもしていないか、というチェックをしていないようですね。言
われたままの修正だけなら「考えていない」と思われてもしかないのではないでしょうか。

wood 2005/06/04(土) 23:12:40
1回でやめようと思ったけど
確かに変かな
>1:  case 2:
>2:      myspeed=100-a;
>3:       a=rand()%20;
>4:       enemyspeed=100-a;
>5:       a=rand()%20;
               
>6:       if(enemyspeed>myspeed){
>7:          a=rand()%20;
>8:          myHP-=a;
 
#5:のaはいつ、使用されるんでしょうか、部分しか見てないから、俺の勘違いか
な?
デバックでステップ実行すると分かると思うけど
考えるより、実行してみれば?・・・値が示してくれるんじゃない

たか 2005/06/05(日) 00:16:36
>2:      myspeed=100-a;
>3:       a=rand()%20;
>4:       enemyspeed=100-a;
>5:       a=rand()%20;
               
>6:       if(enemyspeed>myspeed){
>7:          a=rand()%20;
>8:          myHP-=a;
 #5:のaはいつ、使用されるんでしょうか、部分しか見てないから、俺の勘違いか
な?
デバックでステップ実行すると分かると思うけど
考えるより、実行してみれば?・・・値が示してくれるんじゃない


いや、実行したとき、この部分には何も問題なかったので、それだけに困惑してます。

5のaですが、自分の素早さとともに、敵の素早さも戦闘中に減少するってことです。

kuma 2005/06/05(日) 01:33:58
// |д`)ナニコレ 祭リカナニカデスカ?
// 祭リナラ 参加セズニハ イラレナイ


>いや、実行したとき、この部分には何も問題なかったので、それだけに困惑してます。

表面上は正常に動作しているように見えますが
その処理は多分に潜在的な問題を発生させる原因になります。
しかも、1関数内で全て実装している為に、よりその問題点が
表面上にでなくなっているんでしょう。

「めったに問題は出ないんだからいいじゃん」と
思われるかもしれませんが、この手の問題点は発覚した際
原因の特定にものすごく手間取ります。
(なにせ一見普通のソースのように見えるのですから)

学校の課題ということですので、どの程度のソースが
求められているのかは判断しがたいですが
私なら20点中4,5点減点するところです。

ちゃんと調べられて、努力されているということですので
がんばって問題点を突き止めてください。

// 私も極稀にやってしまうのですが、MSのC#ならちゃんと
// warningなり errorなり吐いてくれるので助かってます。

Ban 2005/06/05(日) 03:21:02
> 会ったこともない人間に対して「自分で考えてない!」などと勝手に
> 決め付けるのはやめろ!!

たか さん自身の「疑問点が見つかり次第」という発言を受けたもので、
いろいろとソースを弄られたり苦労されていること自体は分かりますし、
私としては たか さんがまったく自分で努力していないと決め付けたりつもりは
ありません。

ただ、不適切な例えが たか さんに不快感をあたえてしまったことは確かなようで、
その点については申し訳ありませんでした。


補足説明と若干の釈明をさせていただけば、

> そういう趣旨

「出題者があえて質問を禁じた」という意向を私なりに推測すると
・「見つけた疑問点を自分でじっくり考え、整理する」練習の一環
・「独力で一プログラムを完成させる」という経験を積んで欲しい
・「あえて難題を与え対応がみたい」(普通はその後に説明/討論等を用意しているはず)
あたりではないかと思いました。

そうすると、せっかくの疑問点を見つけ次第に他人に質問してしまうと
課題の意味も薄れますし、出題者の思惑も台無しにしてしまいかねませんので、
その時点での質問は避けるほうがよく、またそれに対する余計な口出しも
差し控るべきと思いました。

先の発言の主旨はあくまでここにあるものとご理解いただければ幸いです。

wood 2005/06/05(日) 06:22:48
>#5:のaはいつ、使用されるんでしょうか、部分しか見てないから、俺の勘違いか
な?

この質問で難しかったみたいですね?!

>5のaですが、自分の素早さとともに、敵の素早さも戦闘中に減少するってことです。

変!・変!・とっても変!
ねえ〜!ねえ〜!・・本当に「たか さん」の仕様とおりなの?
見ている・考えている・・・方向が間違ってませんか?

こんな回答をもらうと言うことは、間違いなく実行検証していないと受け取っても
しょうがない、でしょ!

連続65、000回くらい「逃げて」みれば〜
たいがい、一発目で実行時エラーになりそうなものだがな〜

デバックコンパイル時は変数初期化、してくれるコンパイラもいるから
エラーにならないかもね?

質問変更します
#2:のaはいつの値(どのような状況下で取得されたもの)でしょうか?

これで理解できないのなら、回答者が回答書くだけ無駄な努力ですね

ところで、指摘事項(たか さん としては問題なしと思っていること)以外の
疑問って何?
このスレッドを続ける意味はあるの?

暇人 2005/06/05(日) 20:07:54
> 会ったこともない人間に対して「自分で考えてない!」などと勝手に
> 決め付けるのはやめろ!!
>
確かにあったことないけど私も色々な面で「考えてない(足りないのか?)」と思います
よ。
まず、先生にも友達にも聞くのはNGと言っていながら掲示板になぜ投稿してるの?
掲示板で回答してる人が先生か友達という可能性はないんですか?それともたかさんは投
稿者全員のプロフィールがわかるとか(あったことも無いような人の・・・)

その他の判断材料として投稿されているプログラムですね。
まず、人に見せるならある程度整理して見やすいようにしないと(RiSK氏のサンプルのよ
うにインデントを上手く使用するだけで見栄えが大分違うと思いますよ。)

> 私なら20点中4,5点減点するところです。
>
私なら15点ぐらい減点しますよ。(笑
正しく動作しないプログラムに点数は上げられません。残りの5点は努力賞です。
あとはプログラムの見易さによって+αですね。(合計20点以上)

>#5
>
私もこの板の始めの方で指摘してるんですけど理解できてないのね。

たか 2005/06/07(火) 00:54:06
ご指摘された点は改めて修正し直しました。たびたびのご指摘ありがとうございまし
た。

ところでこの場合、自分の攻撃と敵の攻撃は別々に書いた方がいいのでしょうか?

敵の分は敵の分で、また別にswitch分で書いた方がいいでしょうかね?

実は今のプログラムだと敵がどんな時にどんな種類の攻撃を仕掛けてくるのか
わかりきっていて面白みに欠けます。

しかし敵の攻撃方法をランダムにするにはどうすればいいのかがわかりません。

出てくる数値などをランダム設定する方法はわかるのですが、攻撃方法自体はどのよう
にすればランダム設定できるのでしょうか?

またswitch(〜)とした時、(〜)の中の数値は必ずしもscanfで読み込まなくていいので
しょうか?

自分の攻撃の場合は、読み込みますけど、敵の攻撃まで読み込むわけにはいかないので
そのあたり困惑してます。

wood 2005/06/07(火) 07:46:35
>ご指摘された点は改めて修正し直しました
だれのどんな指摘に対しての回答か?

>ところでこの場合、自分の攻撃と敵の攻撃は別々に書いた方がいいのでしょうか?
の前に変数の使い方(使い分け)を勉強してください

REE 2005/06/07(火) 10:06:01
またswitch(〜)とした時、(〜)の中の数値は必ずしもscanfで読み込まなくていいので
しょうか?

はい、そうです。

ところで、なぜ、そのような制約があると思われたのでしょうか?

PATIO 2005/06/07(火) 10:48:34
いまさらの感はありますけれど、しゃしゃり出てみました。

たかさんはfor文までしか習っていないと書かれていますけれど、
いったい何処までの制御文なら使っていいのですか?

使ってもかまわないといわれている制御文とか関数とか列挙できるなら
列挙した方がよいような気がします。
何かをアドバイスしてもそれは使えないと言われてしまうと
せっかくのアドバイスが無駄になってしまいます。

制約があるのであれば、質問を出す時に制約もきちんと提示しておかないと
片手落ちだと思いますよ。

あと、scanfがどんな関数でどんな処理をするのかきちんと理解されていますか?
敵の攻撃パターンはユーザーが入力するものではないとすれば、
どうすればランダムに選択したような効果が出せるでしょう?
既にたかさんが書かれているプログラムの中にヒントはあると思いますけれど。

自分が書いたプログラムの動作がきちんと把握できているのであれば、
多分、思いつけると思います。

あと、先生や友達に尋ねるのは駄目なのにこういう掲示板で質問するのはOKなんですか?
尋ねる対象が変わったというだけで同じ事だと思います。
尋ねるのが駄目という事になるとWeb上を検索して自力で情報をそろえるくらいまでしか
許されないのではないかと思うのですが。

各無し 2005/06/07(火) 12:50:23
ドラクエのパクリじゃ、どうがんばっても面白くならないぞ。

とおりすがり 2005/06/07(火) 15:36:36
みんな親切なのは結構なのですが、「駆け込み寺」容認なのかが気になるところ。

tib 2005/06/07(火) 16:11:03
とおりすがり さん:
> みんな親切なのは結構なのですが、「駆け込み寺」容認なのかが気になるところ。

こういう、本題と関係ない話は雑談ラウンジで行いましょう。

wood 2005/06/07(火) 20:13:09
たか 2005/06/07(火) 00:54:06
抜粋
>1:しかし敵の攻撃方法をランダムにするにはどうすればいいのかがわかりません。
>2:出てくる数値などをランダム設定する方法はわかるのですが、攻撃方法自体は
>3:どのようにすればランダム設定できるのでしょうか?
>4:またswitch(〜)とした時、(〜)の中の数値は必ずしもscanfで読み込まなくて
>5:いいのでしょうか?
>6:自分の攻撃の場合は、読み込みますけど、敵の攻撃まで読み込むわけには
>7:いかないのでそのあたり困惑してます。

#1:「敵の攻撃方法をランダムにする」
 すでに、貴殿のソースの中でコーディングされているものを応用するだけです
 ここは、貴殿の仕様を発想してもらう場ではありません
 すでに「たか さん」は、#2 で知っていると言い放っているではありませんか
 何を聞きたいのか、返送のしようがありません

#4:ここも同様
 仕様を固めてもらう場ではありません、ご自分でしっかりした仕様設計を
 していない証拠です

$7:困惑するのは、指摘を受けた性ではないはずです
 作成(プログラミング等)を行う前の、仕様の吟味が不十分なためのことです
 このままでは、いつまでたっても終焉を迎えることは出来ませんよ

 作成しながらの、思いつき発想をただぶつけるだけでは、その内
 筋の通らないものになりますよ

尚、パクリは大いに結構、法に触れない限りは・・・
ここの掲示板に回答くださる方々は、「課題」と言うものに非常に敏感です
大体の人は、回答ズバリを書きません、質問者が知りたいと望むことを
調べ・考え・理解 出来るようにヒントを回答してくださるだけです
過大な期待をもたれないようお願いします



ーー 追伸 ーー
PATIO さんへ
同様のご指摘を、さんざん他の方々が行っており、すべて黙殺されているようです

kuma 2005/06/07(火) 23:13:16
あの酷いネストにさらにswitchが続くかと思うと
頭痛がしてくるわけですが、そのあたりは
解消されたのでしょうか。

また、指摘された点はどう修正されたのかも
記入するようにしましょう。

スレッドを見守っている方の中には、ちゃんと
修正されたのか /* 多分まだ修正されてない
部分もあるんだろうなぁ等と思いつつ */
心配されている方もいるでしょう。
また、あなたの解決策は今後同じような質問が
される場合、過去ログを確認することで無意味に
繰り返されること無く、有効に活用されます。

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