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