C言語でポーカーを作っているんですが その2
Re:C言語でポーカーを作っているんですが その2
ookamiさん、わかりました
一応、判断する時の形らしきものは出来たのですが
同じ23456でも並びが異なる23456(35462とか)は
ストレートと判断されない凡庸性なしの書き方になってしまいました…
数字の記憶とは、int n = 2;みたいな(数字を宣言する)認識よりも
言葉通りに数字を(新たな変数とかに)記憶させるという認識が正しいのでしょうか?
一応、判断する時の形らしきものは出来たのですが
同じ23456でも並びが異なる23456(35462とか)は
ストレートと判断されない凡庸性なしの書き方になってしまいました…
数字の記憶とは、int n = 2;みたいな(数字を宣言する)認識よりも
言葉通りに数字を(新たな変数とかに)記憶させるという認識が正しいのでしょうか?
Re:C言語でポーカーを作っているんですが その2
> 一応、判断する時の形らしきものは出来たのですが
> 同じ23456でも並びが異なる23456(35462とか)は
> ストレートと判断されない凡庸性なしの書き方になってしまいました…
まず凡庸と汎用の意味を辞書で調べましょう。これでは話が通じません。
35462への対応はもちろん考えていますが、これは次のステップです。
次のステップに進む前に、今のステップをもう少しきれいにしましょう。
判定にforループを使えませんか?
> 同じ23456でも並びが異なる23456(35462とか)は
> ストレートと判断されない凡庸性なしの書き方になってしまいました…
まず凡庸と汎用の意味を辞書で調べましょう。これでは話が通じません。
35462への対応はもちろん考えていますが、これは次のステップです。
次のステップに進む前に、今のステップをもう少しきれいにしましょう。
判定にforループを使えませんか?
Re:C言語でポーカーを作っているんですが その2
> 国語力を鍛えねば(笑)…
笑いごとではなく、国語力はもちろん英語力も必要ですよ。
でも、その根底にあるのは論理的に思考する能力です。
で、添付されたプログラムは、ストレートを判定できるのですか?
笑いごとではなく、国語力はもちろん英語力も必要ですよ。
でも、その根底にあるのは論理的に思考する能力です。
で、添付されたプログラムは、ストレートを判定できるのですか?
Re:C言語でポーカーを作っているんですが その2
お待たせしました
順番がバラバラ(35246とか)かエースをまたぐ(10JQKA)以外の
ストレートなら判断出来るようになりました
順番がバラバラ(35246とか)かエースをまたぐ(10JQKA)以外の
ストレートなら判断出来るようになりました
Re:C言語でポーカーを作っているんですが その2
ソートにも多くのやり方があり驚きましたが
今の自分でも理解できそうで、処理にも影響がでないであろう
バブルソートにしました。
順番がバラバラのパターンで、あとすることは
最小値をn_handの添字にどうすれば組み込めるか、
と考えていますが、解決するにはバブルソートを完全に
理解する必要があるのかな?
またゲーム作りでソートを利用する際、(ジャンルや規模によって違うでしょうが)
バブルソートはどこまで通用するものですか?
今の自分でも理解できそうで、処理にも影響がでないであろう
バブルソートにしました。
順番がバラバラのパターンで、あとすることは
最小値をn_handの添字にどうすれば組み込めるか、
と考えていますが、解決するにはバブルソートを完全に
理解する必要があるのかな?
またゲーム作りでソートを利用する際、(ジャンルや規模によって違うでしょうが)
バブルソートはどこまで通用するものですか?
Re:C言語でポーカーを作っているんですが その2
シューティングで毎フレームソートするっていうんじゃないなら、O(n^2) のソートでさえもOKです。
あるいは、推定の起動する環境がめちゃくちゃ古いPCでない限り。
今回のような、たまにソートする必要があるだけなら、どんなソートでもあまり気にする必要はないとおもいます。
でもこだわるなら早く処理できるコードのほうが好ましいでしょうが。
あるいは、推定の起動する環境がめちゃくちゃ古いPCでない限り。
今回のような、たまにソートする必要があるだけなら、どんなソートでもあまり気にする必要はないとおもいます。
でもこだわるなら早く処理できるコードのほうが好ましいでしょうが。

Re:C言語でポーカーを作っているんですが その2
ソート前後でカードを表示してください。
正しくソートできていますか?
> と考えていますが、解決するにはバブルソートを完全に
> 理解する必要があるのかな?
ライブラリを利用することにすれば、ライブラリの利用方法のみ
知っておけば、中身を理解する必要は必ずしもありません。
当然ですが、自分のプログラムでライブラリをどのように使うかは
完全に理解しておく必要があります。
ポーカーの役判定のプログラムと比較すれば、
バブルソートの方がよほど簡単なので、
手を抜かないことをお勧めします。
難しいようならば、ソートするだけのプログラムを作ってはどうですか?
正しくソートできていますか?
> と考えていますが、解決するにはバブルソートを完全に
> 理解する必要があるのかな?
ライブラリを利用することにすれば、ライブラリの利用方法のみ
知っておけば、中身を理解する必要は必ずしもありません。
当然ですが、自分のプログラムでライブラリをどのように使うかは
完全に理解しておく必要があります。
ポーカーの役判定のプログラムと比較すれば、
バブルソートの方がよほど簡単なので、
手を抜かないことをお勧めします。
難しいようならば、ソートするだけのプログラムを作ってはどうですか?
Re:C言語でポーカーを作っているんですが その2
ソートの前後を表示させたんですが、正しく出来てると思います
表示上は…
49行目のストレートの判断方法のn_hand == 1+i+k;
のn_handは、ソートされた後ではなくソート前の値を
参照してストレートを判断してるんだと判ったんですが
だったらn_handの添字に最小値を組み込むんじゃなくて
最小値自体を記憶させて、それを元に判定した方がいいのか?
書いてて分け判らなくなってきたな…
表示上は…
49行目のストレートの判断方法のn_hand == 1+i+k;
のn_handは、ソートされた後ではなくソート前の値を
参照してストレートを判断してるんだと判ったんですが
だったらn_handの添字に最小値を組み込むんじゃなくて
最小値自体を記憶させて、それを元に判定した方がいいのか?
書いてて分け判らなくなってきたな…
Re:C言語でポーカーを作っているんですが その2
ソートの前後に↓を入れて確認してください。
for(i = 0; i < 5; i++) { printf("%s - %s ", mark[m_hand], number[n_hand]);/* 五枚のカードを表示 */ }
Re:C言語でポーカーを作っているんですが その2
> 確認した結果、ソートはうまくいってました
ソートの前後に表示された結果をここに貼ってください。
何でしつこく確認を求めていると思いますか?
ソートの前後に表示された結果をここに貼ってください。
何でしつこく確認を求めていると思いますか?
Re:C言語でポーカーを作っているんですが その2
あなたの手札は 42531 ♥ - 5 ♦ - 3 ♠ - 6 ♣ - 4 ♣ - 2 12345 ♥ - 2 ♦ - 3 ♠ - 4 ♣ - 5 ♣ - 6 ♥ - 2 ♦ - 3 ♠ - 4 ♣ - 5 ♣ - 6 error error error error error 他の役実はうまくいってなかったのか?
Re:C言語でポーカーを作っているんですが その2
>ソートの自力での解決が困難なため
ソートのロジックが間違っているのではなくn_hand配列のみソートしてしまったので、
n_hand配列とm_hand配列の同じ添字の要素には同一カードの数字とマークの情報が
分割して格納されているという大前提が崩れているのですよ。
そのため手札の表示でバグっているのですが、気付かないのですか?
>for(i = 0; i < 5; i++) {
> if(n_hand[0] == n_hand){
> flag_p++;
> }
>}
flag_p は n_hand[0]と同じ数字のカードを何枚持っているかでしょう?
この情報だけで役判定できますか?
>for(i = 0; i < 5; i++) {
> if((n_hand[2] == n_hand[3]) || (n_hand[3] == n_hand[4])) {
> flag_two++;
> }
>}
for文内でiを使っていないのに5回繰り返す意味が分からない・・・
役判定は同じ数字のカードを何枚ずつ持っているかという情報を作ってから
やった方が簡単になると思いますがどうでしょうか?
後、処理を機能ごとに関数に切り分けていくという事を覚えた方がよさそうです。
ソートのロジックが間違っているのではなくn_hand配列のみソートしてしまったので、
n_hand配列とm_hand配列の同じ添字の要素には同一カードの数字とマークの情報が
分割して格納されているという大前提が崩れているのですよ。
そのため手札の表示でバグっているのですが、気付かないのですか?
>for(i = 0; i < 5; i++) {
> if(n_hand[0] == n_hand){
> flag_p++;
> }
>}
flag_p は n_hand[0]と同じ数字のカードを何枚持っているかでしょう?
この情報だけで役判定できますか?
>for(i = 0; i < 5; i++) {
> if((n_hand[2] == n_hand[3]) || (n_hand[3] == n_hand[4])) {
> flag_two++;
> }
>}
for文内でiを使っていないのに5回繰り返す意味が分からない・・・
役判定は同じ数字のカードを何枚ずつ持っているかという情報を作ってから
やった方が簡単になると思いますがどうでしょうか?
後、処理を機能ごとに関数に切り分けていくという事を覚えた方がよさそうです。
Re:C言語でポーカーを作っているんですが その2
言われて気づけば、マークがまったく変わってなかったorz
書き直したので、表示はまともになりました
ツーペアの所は意味が無い事に気づいて書き直したんですが、投稿したやつは
直す前の方でした
>役判定は同じ数字のカードを何枚ずつ持っているかという情報を作ってから
とは例えばフォーカードなら for文を書かないで
ヘッダーファイルを使いこなせれば、すっきりして判りやすくなりますよね
役の判断が出来てからヘッダーファイルを使って分割しようと思います
書き直したので、表示はまともになりました
ツーペアの所は意味が無い事に気づいて書き直したんですが、投稿したやつは
直す前の方でした
>役判定は同じ数字のカードを何枚ずつ持っているかという情報を作ってから
とは例えばフォーカードなら for文を書かないで
if(((n_hand[0]==n_hand[1])&&(n_hand[0]==n_hand[2])&&(n_hand[0]==n_hand[3]))|| ((n_hand[1]==n_hand[2])&&(n_hand[1]==n_hand[3])&&(n_hand[1]==n_hand[4])))という風に書けばいいんでしょうか?
ヘッダーファイルを使いこなせれば、すっきりして判りやすくなりますよね
役の判断が出来てからヘッダーファイルを使って分割しようと思います
Re:C言語でポーカーを作っているんですが その2
> とは例えばフォーカードなら for 文を書かないで
例えば int buf[13]; という配列を用意して、
2, 3, 4, 4, 5 のワンペアの場合、
buf[1] = 1;
buf[2] = 1;
buf[3] = 2;
buf[4] = 1;
(後は全部0)
となるように数えておく、ということでしょう。
その後に判定です。
(フルハウスの判定は先にした後で、)2が1つみつかったらワンペア。
> ヘッダーファイルを使いこなせれば、すっきりして判りやすくなりますよね
まず使うべきなのは関数です。
ヘッダーファイルを使わなくても関数は使えます。
例えば int buf[13]; という配列を用意して、
2, 3, 4, 4, 5 のワンペアの場合、
buf[1] = 1;
buf[2] = 1;
buf[3] = 2;
buf[4] = 1;
(後は全部0)
となるように数えておく、ということでしょう。
その後に判定です。
(フルハウスの判定は先にした後で、)2が1つみつかったらワンペア。
> ヘッダーファイルを使いこなせれば、すっきりして判りやすくなりますよね
まず使うべきなのは関数です。
ヘッダーファイルを使わなくても関数は使えます。