投稿
おちゃめ ochame_nako
プログラミング初心者向けのゲームとして定番といえば「じゃんけんゲーム」があるのですが、初心者向けとはいえコンピュータとの対戦ゲームです。 コンピュータとの対戦型のゲームにおいては思考ルーチンが必要不可欠です。 そして、その思考ルーチンがゲームの面白さに多大な影響を与えます。 じゃけんゲームの思考ルーチンといえば下記のようなものが大半でしょう。 A=RND(3) といってもこれは「思考ルーチン」と呼べるレベルのものではなく勝つか負けるかは完全に運任せです。 例えばプレイヤーがずっとグーだけを出し続けても勝率は50%前後になります。 もちろん、いくら考えた手を出そうとも勝率が上がるわけではありません。 では、皆さんでじゃんけんの思考ルーチンについて考えていきましょう。
10そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
そもそも、じゃんけんの思考ルーチンなんてものは存在するのでしょうか? コンピュータが思考ルーチンの情報源として使用可能なのはプレイヤーが過去にどんな手を出したのかということです。 つまり、それを使うことで思考ルーチンを作ることが可能です。 しかし、どのように使うかで大きく変わってきます。 例1:プレイヤーがグーを出す割合が非常に高い→コンピュータはパーを出す確率を高くする これだと、グー、グー、グー、チョキ、チョキ、チョキ、パー、パー、パーのような手を出した場合にはどれも同じ確率で出していると認識されてしまいます。 例2:プレイヤーが前回グーを出した→それに勝てるパーを出す確率を高くする これだとグーを出したあとには高確率でパーを出すと分かってしまうのでプレイヤーはチョキを出せば高確率で勝てます。
1そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
というわけで、皆さんぜひじゃんけんの思考ルーチンについて考えてみてください。 プログラムが作れる人は思考ルーチンだけではなく完成品のプログラムを用意、作れない人(作る時間のない人)はこういう思考ルーチンはどうかなという日本語による詳細説明だけでも良いです。(「ネタバレ」投稿を推奨しますが、今回は気軽に参加してもらうためそれを必須にはしません) 私が作ったじゃんけんゲームは3月22日の23時に公開します。 プチコンmkIIで作った1画面プログラムをプチコン3号に移植予定です。(今回の主要目的が思考ルーチンなので見た目には拘らない予定)
1そうだね
プレイ済み
返信[3]
親投稿
りょうま R-S1437
じゃんけんゲーム…本当は奥が深いゲームだったんですね。
0そうだね
プレイ済み
返信[4]
親投稿
きのっこ citronsoda
ジャンケンゲームはrnd(3)が鉄板ですが勝ち負けの表示よりも、相手が出した手を(あとでだす)アルゴリズムを考えるのが楽しいですよね。
0そうだね
プレイ済み
返信[5]
親投稿
りょうま R-S1437
僕なじゃんけんゲームはRNDと決めつけていましたね、じゃんけんゲームは奥に何かを潜めている恐ろしい子ですね。 どうでも良いですが、RND(3)だと0→グー,1→,チョキ2→パー,3で3が余りますね。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
りょうまさんへ じゃんけんゲームが奥深いというよりはどんなゲームであっても真面目に考えれば奥深く「じゃんけんゲームでさえこれくらいの考えるべき余地がある」ということです。 きのっこさんへ プログラミングの醍醐味はアルゴリズムを考えることにありますよね! それさえできればコーディングは単純作業なので退屈です。(処理速度や短さに拘ればまた楽しめますが)
2そうだね
プレイ済み
返信[7]
親投稿
ゆうたん yu-tan-sama
メダルゲームとかですとトータルでプレイヤーが負けるようにできてたりしますよねー 単に勝つだけなら後出しするだけでいいので簡単ですけど いかに熱い対戦を演出するかを考えていくのもおもしろいかもしれません
1そうだね
プレイ済み
返信[8]
親投稿
きのっこ citronsoda
りょうまさん。 言語仕様上そうなってしまいますが、n個の乱数の場合 0~n-1という感じで作ってしまうのでどうしても3と打ってしまいます。。とくに、困ることも、、ないとは思いますし 普段は MAX=5:A = RND(MAX)というふうにコーディングします。 あと、 rnd3ネタですが ネットで探せば出てきますが 0->まけ 1->あいこ 2->勝ち こんな判定もできます。初めて聞いた時は、目からウロコでした。
1そうだね
プレイ済み
返信[9]
親投稿
こうやま kouyama1967
 じゃんけんゲームの仕様と言えばもちろん、プレイヤーが勝った後、描かれている女の子の姿から一枚ずつ、服が(以下Miiverse規約により削除)
1そうだね
プレイ済み
返信[10]
親投稿
1Pグー 2回 だす CP次パー 1Oパー先読みでチョキ出す 1Pまたグー2回 CP次グー こんなのしたらいいと思う!
0そうだね
プレイ済み
返信[11]
親投稿
三行目の1Pが1Oになってるうううう
0そうだね
プレイ済み
返信[12]
親投稿
けい kei0baisoku
さらっと作るつもりが思ったよりちゃんとしたゲームになりました。 公開キー【84DQQ3C4】 ズルはなく先にCPUの方が手を決めてますが、そこそこ強いと思います。 30回連続勝負で、勝率51%以上を達成したら専用の勝利演出が流れます。 是非とも挑戦してみて下さい(^O^) ネタバレコメントで簡単にアルゴリズムを解説します。 まとまったゲームになったので、新規投稿でも上げようと思います。
0そうだね
プレイ済み
返信[13]
親投稿
けい kei0baisoku
あ、書き忘れましたが、51%に挑戦する人はこのコメントはまだ見ちゃダメです(^^; 人間が「直前の結果を元に、今出した手に対してどう変えるか考える」という傾向を利用したアルゴリズムです。 具体的には、直前の勝ち、負け、あいこの結果と同じ、一番最近の結果を思い出して、その次にユーザが手をどう変えたかを参考に、今回も同じ変え方をしてくると想定して手を考えます。 難しい命令とかは使ってないので、初心者の人も参考にできるかもしれません。 ほか、「こうしたらもっと強くなるかな」と考えてやらなかったのが、 ・一番最近の一回でなく、記録は全部参考にして決める。新しいものは重視する。 ・最も出す確率の高い手だけでなく、1位、2位まで決め、「どちらを出されても負けない手」を選ぶようにする。 あたりです。
0そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
私が作ったじゃんけんゲームを公開します。公開キー【K53ENVQE】
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
これは以前mkIIで作った1画面プログラムをほぼそのまま移植したものなのでけいさんが作ったものと比べると画面はしょぼいです。 ちなみにBボタンがグー、Yボタンがチョキ、Xボタンががバーです。 これは、B、Y、Xの文字の形で簡単に類推できる、かつ、下から順番にグー、チョキ、パーの配置になっているのでじゃんけんゲームではおすすめのボタン配置です。
0そうだね
プレイ済み
返信[16]
親投稿
おちゃめ ochame_nako
このゲームの思考ルーチンを簡単に説明するとプレイヤーの出した手のパターンを分析して次にプレイヤーが出す手を予想してそれに勝てる手を出しています。(イカサマは全く無し) パターン分析はグーの後、チョキの後、パーの後にグー、チョキ、パーのいずれの手を出しているかという9通りのパターンnの累積を見ています。 ただし、9パターンの各回数を単純にカウントするだけではパターンの変化に追従できないため一手古くなるごとに重みを半減しています。 こうすることでコンピュータの手を予想してパターンを変えてきたらその変えてきたパターンに対応できるようになります。 100回プレイで普通にやったら勝率は30~40%くらいになると思います。(50%を越えたらすごい)
0そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
この思考ルーチンはあくまで一例ですが、じゃんけんもただの運ゲーではなく戦略性のあるゲームにすることが可能であることが分かると思います。 じゃんけんは定番的な思考ルーチン、正解となる思考ルーチンというものがないため自由な発想で作ることができます。 そういう意味では初心者から中級者まで幅広くプログラミングの練習素材として有効であると言えるでしょう。 今回はただのシンプルなじゃんけんでしたがパーで勝ったら3ポイント、チョキなら2ポイント、グーなら1ポイントというポイント制にしたり、別のゲーム性を加えるとまた思考ルーチンが異なるものになってきます。 思考ルーチンというのは自分だったらこの場合はどうするのかをプログラムとして記述するだけでいいのでぜひ皆さんさまざまなゲームの思考ルーチンにチャレンジしてみてください。
1そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
ゆうたんさんへ ゲームとして考えるならば後出しでやってもいいですね。 プチコンのようにプログラムリストが目に見えてしまうとイカサマしていると分かった途端に萎えてしまう可能性もありますが。 きのっこさんへ 相手と自分との差分をとって剰余を計算するというのは私のプログラムでも使用していますが、その原型は30年前にポケコンで野球拳ゲームを作っていて自力で思いつきました。 雑誌掲載のプログラムでさえ大抵はIFを9個とか7個とか使っているためこの短縮化には感動しました(笑) ちなみに今回作った思考ルーチンの原型も30年前に自力で思いついたものです。 こうやまさんへ やっぱりじゃんけんと言えば野球拳ですか(笑)
1そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
めのういしさんへ 参加ありがとうございます。 要するにプレイヤーが2回連続同じ手を出したらそれに勝てる手か、それと同じ手を出すということですか? 2回連続同じ手を出さない場合はどうするのかで強さが変わりそうですが、RND(3)よりはゲーム的に良いものになりそうですね。 けいさんへ 参加ありがとうございます。 1日足らずという短い期間でしたがちゃんとしたゲームになっていますね。 とりあえずノーヒントでプレイしてみましたが、3回プレイしての平均勝率は45%でした。(3回目のみ50%越え) 私とはまた異なるやり方でプレイヤーの手を分析しているので参考になりました。 プログラムリストの方はまだ見てないのですが、後からじっくり見させてもらいます。 それでは、みなさんありがとうございました!
0そうだね
プレイ済み
返信[20]
親投稿
けい kei0baisoku
>おちゃめさん プログラムと解説ありがとうございます(^O^) 私が時間の関係で妥協した、履歴の総合判断も入ってるのですね。 ネタバレコメントの解説読むかソース見ると分かると思いますが、私のはおちゃめさんのアルゴリズムの履歴の一回だけver&直前の勝敗も加味しただけです。 私の方が規則性が強いので、圧勝も完敗もしやすいようです。
0そうだね
プレイ済み
返信[21]
親投稿
けい kei0baisoku
せっかくなので100本勝負しました(^O^) 30回目までは解説見ずに、それ以降は解説は見たけどあまり熟考せずに半分勘で。 50%にもう一歩及びませんでした……(´ω`) が、それより引き分け率の高さ(^^; 30回戦が終わった時点では実はほとんど引き分けでした……(・ω・)
0そうだね
プレイ済み
返信[22]
親投稿
きのっこ citronsoda
僕が小学生の頃の脳では配列9個作って判定が一番最初に思いつきましたねぃーO(1)ですみますし、といいつつほとんどがO(1)ですみますけど(^^;
0そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
けいさんへ 引き分けが多いというのはある程度コンピュータの出す手を予想できているためです。このプログラムではコンピュータに勝てる手を予想するのはかなり難しいと思います。 ただしある程度データが蓄積されるまでは単純な乱数に近いので最初の10手くらいは運が良ければ勝率8割とかも可能です。 きのっこさんへ 配列を使ったテーブル処理も定番的なものですね。 じゃんけんのような決まったパターンの場合は剰余を使った方が短くできるというだけです。 ちなみにBボタンを押せば0、Yボタンを押せば1、Xボタンを押せば2、それ以外は-1となるようにするには私のプログラムリストを見ての通り 630MOD(BUTTON(2)+5)MOD 6-1 でできますが可読性が非常に落ちてしまいます(笑)
2そうだね
プレイ済み