ページ 1 / 1
C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 16:02
by えりく
初めまして、C言語を勉強しだしてまだ日も浅いえりくと申します。
学校から出た課題というか、発表なのですが、タイトル通りC言語でファミコンのドラクエ4を作ろうとしています。
3人パーティでステータス入力から始まり、ボスは一人、その後変身して連戦になります。
個人的に○回逃げたら(回数はまだ決めていませんので今は一回の設定にしています。)会心の一撃を入れたいというのと、
回復はHPが100以下の場合のみ一人一回だけ使えるように(全快する予定)、
パーティの誰かが「逃げる」を選択すると全員が逃げるを選択したことになる。
敵はこちらのHPが一番低いメンバーを攻撃するようにしています。
作ったのがこちらなのですがhttp://kie.nu/QBi
問題点がたくさん出てきました。
CScreenヘッダ読み込みに必要なファイルはこちらですhttp://kie.nu/QBr
素早さが一番早いキャラ(敵含む)の動きが表示されない。
攻撃以外を選んでも攻撃するキャラがいる。
キャラが死んでいてもコマンド入力を求められる。
終わったら繰り返しwhileをメインに入れていますがそのメッセージが出ない。
また繰り返したら死んだ状態の敵が出てくるのでこちらが何をしても1ターンで終わってしまう。
また、意味の分からない終わり方をする時もあります。(こちらの入力したステータスによるのかも?)
逃げるを選択しても攻撃してしまったりします。
明日までに提出しないといけないのですが何日もずっとやっているものの手詰まり状態です。
お時間ある方どうか助けていただけないでしょうか。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 16:26
by softya(ソフト屋)
順番を決めているのがactiveだと思いますが、デバッガで値は確認されましたか?
【補足】それとメッセージは表示されませんがボスは攻撃をしている様です。
boss_attack()をデバッガで追いかけるとボスの攻撃メッセージを出すなり自分で消していることがわかります。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 16:55
by えりく
お返事ありがとうございます。一応デバッグもかけて値も見てはいるのですが…
こちらのパーティの方が動きが早い場合ボスの行動も表示されるのですが、
そうなるとこちらの一番早いキャラは行動を選択しても何もしていない(ように見えます)。
一番のキャラの表示が瞬時に消されるのはなぜでしょうか…
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 17:03
by softya(ソフト屋)
これもメッセージを出した瞬間に自分で消していますね。
player_action()だと385から392行。
boss_attack()だと296から304行です。
デバッガで追いかけてみて下さい。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 17:19
by えりく
わざわざ見ていただきありがとうございます。
確かに消しています…しかし同じ方法なのになぜ一番目のキャラだけこのようなことになるのでしょうか。
CLS()で表示を消すことも考えたのですがリリースでデバッグすると画面がちらちらするので上から埋める方法をとりました。
後続キャラは表示されているのに…という謎がどうしても解けません。
どうすれば打開できるでしょうか…質問ばかりで申し訳ありません。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 17:52
by softya(ソフト屋)
日頃使わないrewind(stdin);の挙動をちゃんと把握していないので、これが原因だと思いますが対処方法を考えてみます。
※ C言語の規格としてはrewind(stdin);は動作未定義です。
1つのプログラムでGetAsyncKeyState()とgetchar();の混在はやっちゃいけないとは思うんですけどね。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 18:20
by softya(ソフト屋)
すいません、getchar()の挙動をちゃんと把握していないので、こんな手しか思いつきません。
追加関数
コード:
void ReleaseWaitReturnKey() //RETURNを離すのを待つ
{
while( GetAsyncKeyState(VK_RETURN) );
}
void PushWaitReturnKey() //RETURNが押されるのを待つ
{
while( !GetAsyncKeyState(VK_RETURN) );
}
使い方。
コード:
/*rewind(stdin);*/
ReleaseWaitReturnKey(); //RETURNを離すのを待つ
/*getchar();*/
PushWaitReturnKey(); //RETURNが押されるのを待つ
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 18:27
by えりく
お返事ありがとうございます!さっそく試してみます!
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 18:42
by えりく
うわぁありがとぅございますーすべて打ち直したら一人目のキャラの表示がきちんとされました!
本当にありがとうございます!!!!
もし!もしよろしければ、お時間ございましたら、他の点にもご指摘いただけたらと思います…。
本当に助かりました!
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 18:45
by softya(ソフト屋)
えりく さんが書きました:うわぁありがとぅございますーすべて打ち直したら一人目のキャラの表示がきちんとされました!
本当にありがとうございます!!!!
もし!もしよろしければ、お時間ございましたら、他の点にもご指摘いただけたらと思います…。
本当に助かりました!
すいません。ちと手があくまで時間がかかりそうです。
デバッガで自分で追いかけていくつか潰してみて下さい。ちゃんとF10でステップで追いかければ分かります。
あと分かりづらいので番号を振っておきます。
1)攻撃以外を選んでも攻撃するキャラがいる。
2)キャラが死んでいてもコマンド入力を求められる。
3)終わったら繰り返しwhileをメインに入れていますがそのメッセージが出ない。
4)また繰り返したら死んだ状態の敵が出てくるのでこちらが何をしても1ターンで終わってしまう。
5)また、意味の分からない終わり方をする時もあります。(こちらの入力したステータスによるのかも?)
6)逃げるを選択しても攻撃してしまったりします。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 18:56
by えりく
お忙しい中お返事ありがとうございます!
できる限り頑張ってみます!感謝感激です!
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 19:55
by えりく
たびたび恐れ入ります。
1)については、一番最初に行動するキャラ(素早さが一番高いキャラ)がこちらのコマンドを無視して攻撃し続けるということはわかりました。
あと6)については今のところきちんと逃げるようになりました。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 20:44
by えりく
度々申し訳ありません。途中経過ですが…http://kie.nu/QEx
2)キャラが死んでいてもコマンド入力を求められる。←この状態で回復、防御、攻撃という順で選択してみるとキャラと選択コマンドがずれてしまいます。
(1キャラ目が行うはずのコマンドを2キャラ目が行ったりします)
3)終わったら繰り返しwhileをメインに入れていますがそのメッセージが出ない。←終了のメッセージ(GAMEOVERなど)も一切出ず、
また「おわりますか」も表示されず、いきなり最初に戻るのですが
カーソルがすごく下のほうにあって妙な数字が出てくるようになりました。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 22:10
by softya(ソフト屋)
1) 何か4人目を入力していますが、コレは? それと、今入力しているキャラ名を表示してださい(ドラクエ準拠)。
それとReleaseWaitReturnKey()を戦闘コマンド選択前にも挟んで下さい。RETURNが押されたことになっています。
2) komando()でselect_characterに入る番号は生きているかを確認して下さい。生きていなければ番号を飛ばして下さい。
3) getchar();に頼るのは止めましょう。私の提案の方式にして下さい。
4) 繰り返すなら、変数は毎回代入で初期化しないとダメです。
5) 状況不明です。
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 22:26
by えりく
softya(ソフト屋) さんが書きました:1) 何か4人目を入力していますが、コレは? それと、今入力しているキャラ名を表示してださい(ドラクエ準拠)。
それとReleaseWaitReturnKey()を戦闘コマンド選択前にも挟んで下さい。RETURNが押されたことになっています。
2) komando()でselect_characterに入る番号は生きているかを確認して下さい。生きていなければ番号を飛ばして下さい。
3) getchar();に頼るのは止めましょう。私の提案の方式にして下さい。
4) 繰り返すなら、変数は毎回代入で初期化しないとダメです。
5) 状況不明です。
1)了解しました!そしてはさんでおきます!
2)確認はできますが飛ばし方がわかりません…本当に申し訳ありませんがご享受願えませんでしょうか。
3)ご提案いただいた方式にしたところGAMEOVERなどは表示されるようになりました!
メインの繰り返しの方でもそれを入れたほうがいいでしょうか??
4)どのように初期化すればいいでしょうか…
5)おかげさまでそのような状況はなくなりました!
お忙しいのに質問ばかりで本当にすみません。[/size]
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 22:56
by softya(ソフト屋)
2) komando()を一人分のコマンドを入力処理する関数に変えて引数としてselect_characterを受け取るようにします。
それを新たな komandoMain()からselect_characterをforループで回すようにして、if文で生存確認した上でkomando(select_character)として呼ぶようにすると良いでしょう。
戻り値として、継続なら0でこれで終わり(逃げる)なら1を返すという形でどうでしょう。
3) たぶん、入れたほうが良いと思います。
4) main()とin_data()の処で構造体の項目全部に値を入れたら直りませんか?
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月03日(日) 23:44
by えりく
4)main()にはボスの構造体として数値を入れてあるので、戻るはずなのですが…in_dataは数値を入力させるタイプなので元々ないのですが…
変なところにカーソルが出てしまいますね。ボスも初期化されていません。
3)と同様ReleaseWaitReturnKey();は入れていますが「おわりますか」の文字は表示されません。
2)select_character++;のところを消してkomandmain()を呼び出しそこにfor(i=0;i<N;i++)を作りその中でif(select_character==(pt+i)->dead_flg != 1)の
ような形でやってみましたが動かなくなってしまいました…
このような夜分まで申し訳ありませんでした。でもおかげさまで大変助かりました。
助言をもとにもっといじってみてできましたらまた報告させていただきます!
本当にありがとうございました!
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月07日(木) 16:54
by えりく
ご無沙汰しておりました。
おかげさまで敵のステータスなどの初期化ができました。
入力バッファのクリアの仕方がわからなかったので、エンターがずっと残ってしまいwhileで繰り返したあとのステータス入力画面でカーソルがおかしな位置に出るということがありましたが、タイトルを作りクロック関数を使い、戦闘後タイトルを間に挟んでまた戻すということでその問題も解決できました。
(それでもカーソルを入力するとバッファに残った数値などが出てしまいましたが…)
ひとまず形になりました。
本当にお世話になりました。また何かありましたら質問させていただくかもしれませんが、頑張って勉強していこうと思います。
今後ともよろしくお願いいたします。ありがとうございました!
Re: C言語でのドラクエ4戦闘について
Posted: 2013年3月08日(金) 23:45
by asd
えりく さんが書きました:ご無沙汰しておりました。
おかげさまで敵のステータスなどの初期化ができました。
入力バッファのクリアの仕方がわからなかったので、エンターがずっと残ってしまいwhileで繰り返したあとのステータス入力画面でカーソルがおかしな位置に出るということがありましたが、タイトルを作りクロック関数を使い、戦闘後タイトルを間に挟んでまた戻すということでその問題も解決できました。
(それでもカーソルを入力するとバッファに残った数値などが出てしまいましたが…)
ひとまず形になりました。
本当にお世話になりました。また何かありましたら質問させていただくかもしれませんが、頑張って勉強していこうと思います。
今後ともよろしくお願いいたします。ありがとうございました!
最終的なコードを投稿してもバチは当たらないと思います。
フォーラムルールにも記載されていることなので守っていただけますようお願いします。