PTK「Quint 7」によるシンプルなゲーム

こんにちは。



ロシアデザインのPTC「Quint 7」を使用して、シンプルで楽しいプログラムを作成するというトピックを継続します。 以前の投稿では、 ヘビサッパーのようなおもちゃをできるだけ簡単かつ迅速に書く方法を示しました。 しかし、これらは2つの完全に異なるおもちゃであるという事実にもかかわらず、CFCでのプログラミングの観点からは(1人の友人との論争の結果、この言語はFBDよりもCFCに近いという結論に達しました)、実際には同じでしたマイナーな外観の変更を伴うプログラム。 この記事では、簡単なブラックジャックのおもちゃをゼロから書くことで、新しいプログラミング例を検討します。 このトピックに興味がある場合は、catにようこそ。





問題の声明



タスクは非常に簡単です-PTK「Quint 7」の手段を使用してゲーム「Blackjack」を書く。 しかし、ゲームのルールを研究する過程で、ブラックジャックの種類は非常に多いことが判明しました。 ゲームで使用されているデッキの数から始まり、「損失保険」、「スプリットカード」、「2倍のレート」など、あらゆる種類のオプションで終わります。 など 最も単純なオプションについて説明します。



もちろん、途中で説明される多くの仮定があります。 他のオプションは、元のプログラムにいくつかの追加チェックを追加することで、5分以内に非常に簡単に実装されると言わなければなりません。

タスクが設定され、実装を開始できます。 そして、ここでは、前の例とは異なり、グラフィック部分から始めます。



GUIを作成する



インターネットで最初に探すのは、背景の写真です。 たとえば、これ:

壁紙






この背景画像は私たちにぴったりです。なぜなら 賭け金と景品ボタンが付いたチップが既に描かれています。

次に、マップが必要です。 ここで最大の問題が発生しました、なぜなら すぐに、サイズとスタイルに適したカードのデッキの図面を見つけることができませんでした。 その結果、ペイントで自分を武装し、すべてのカードを自分で描く必要がありました。

数字のあるフィールド、ゲームを開始および終了するボタン、「別のカードを取る」および「停止する」ボタン、およびゲームの結果を知らせるポップアップ画像をいくつか挿入します。

これをすべて背景に配置して、次の図を取得します。

完全な描画






ハッシュのように見えますが、要素は重複しており、何も明確ではありません。 しかし、まだアニメーションを作成していません。 プログラムの準備が整うと、ほとんどの要素は非表示になり、特定の条件でのみ表示されます。

さらに、注意深い読者は、明確なエラーに気付く場合があります。これにより、約0.00001%のケースで誤った配信が行われます。 しかし、例えば、私はそのままにしておくことにしました。



プログラムを書く



だから、スケジュールは私たちのために準備ができており、それを復活させる時間です。 プログラムで何が起こるべきかを理解することから始めましょう。



1.ランダムカードジェネレーターが必要です。 ここでは、古い実績のある方法を使用します。



プレイヤーがボタンをクリックした瞬間に「ランダム」に変化する2つの数値があります。 それらを互いに分割し、整数部分と小数点以下4桁を切り捨てます。残りのテール全体が1〜52のスケールに変換されます。 次に、このカードが生成されたプレーヤーを示すチェックを入れます。 したがって、いくつかの単純なアルゴブロックを使用して、数分で優れた乱数ジェネレーターを取得しました。



2.では、プレーヤーごとに一連のカードのマクロを作成しましょう。 ここでは、タスクはやや複雑です。 そして、以前の投稿で示したように、それを解決する最も簡単な方法は、このマクロにまだ何が欲しいかを把握することです。



インプット



-最初に、セットにカードを追加するチームが必要です。 それを「地図を追加」と呼びましょう。

-次に、追加するカード自体が必要です。 対応する入力を作成し、「マップ」と呼びます。

-さらに、乱数を生成するためのマクロを見ると、1〜52の範囲のランダムな整数を与えるだけであることがわかります。しかし、シングルデッキのブラックジャックを作成することに同意したため、カードを繰り返してはなりません。 したがって、分析のために、「オープンプレイヤーカード」と「オープンディーラーカード」の2つの入力を追加する必要があります。これにより、どのカードが既にデッキから出てきたかを確認し、カードが既に開かれたときにもう一度乱数を生成できます。 など、以前に配られなかったカードの1つが描かれるまで。

-新しい取引の前に、プレイヤーからすべてのカードを取り、デッキに入れる必要があります。 したがって、プレイヤーとディーラーのすべてのカードをリセットする入力「リセット」が必要です。

-最後のエントリは「Hide Map」です。 前述のように、ブラックジャックのプレイには多くのルールがあります。 最初の取引では、ディーラーはカードを1枚だけ取り、プレーヤーに見せることができます。一度に2枚、そのうち1枚は開いており、2枚目は隠れており、動きが彼に渡ったときにのみディーラーが開きます。 プレーヤーの確率という点では、これら2つのオプションはまったく同じです。 しかし、すべてが完全に「正直」であるためには、ここで2番目のオプションが使用されます(ディーラーはすぐに2枚のカードを受け取ります)。このため、取引開始時に2番目のディーラーカードを隠すことができるサインが必要です。



出力:



-「カード」。 この出力は、プレーヤーとディーラーのカードを示しています。

「別の試み。」 乱数発生器がすでに開かれているカードを捨てると、この症状が形成され、もう一度乱数を生成できるようになります。

-「カード処理」。 前述のように、ディーラーはすぐに2枚のカードを受け取ります。そのうちの1枚は隠されています(この場合、これはコード54です)。 ただし、実際には、デッキのカードは既に使用されており、プレイヤーは自分で同じカードを使用することはできません。 したがって、「カード」の最初の出力をグラフィカルインターフェイスでの表示に使用します。ディーラーの2番目のカードはコード54に置き換えられます。「カード処理」の出力は、すでに描かれたカードの分析とスコアリングです。



結果はこのマクロです:



マクロの内容とその操作の説明


マクロは非常に単純です。 私たちは入り口「地図」を取り、すでにプレイヤーの手にあるすべてのカードと比較します。 それが新しい場合(すべての比較でチェック<>が実行されます)、「24。 Slug1」にシリアル番号を追加し、適切なメモリセルに書き込みます。 一意性チェックが完了していない場合、「21.RS1」トリガーを投入して、チェックが完了するまでカードの生成を再開します。 resetコマンドは、すべてのメモリセルと、引き渡されるカードのシリアル番号をリセットします。 「カードを隠す」コマンドを使用して、ディーラーの2枚目のカードをコード54に置き換えます(グラフィカルインターフェイスでカードシャツとして表示されます)。




3.カードが配られたので、ポイントを数えます。 これを行うには、次の入力と出力で「スコアリング」マクロを作成します。



インプット



-「カード」。 実際にカードのセット。これに基づいてポイント数を計算する必要があります。

-「マップを非表示にします。」 ディーラーのクローズドカードはゼロポイントに置き換えられます。



出力:



-「ポイント」。 プレーヤーとディーラーが獲得したポイントの数。 グラフィカルインターフェイスに表示されます。

-「ポイント処理」。 得点したポイントとディーラーの隠しカード。

-「バスト」。 プレーヤーが21ポイント以上獲得した論理的サイン。



結果はこのマクロです:



マクロの内容とその操作の説明


複雑なことは何もありません。 カードが入力されています。 次に、ネストされたマクロがカードをメガネに変換します。 ポイントが合計され、しきい値の21を超えているかどうかがチェックされます。超過している場合は、50ミリ秒の遅延で「バスト」という記号が発行されます。 同時に、「非表示カード」に基づいて、閉じられているディーラーの2番目のカードはゼロポイントに等しくなります。 問題は50ミリ秒の遅延だけです。 状況を明確にするために、マップに対応するポイントの数を与えるネストされたマクロ「マップ処理」を検討してください。



および詳細:



デュースから4つの異なるスーツのエースまでの52枚のカードがあります。 これらは次のようにエンコードされます。1-ダイヤモンド2つ、2-ダイヤモンド3つ、... 13-ダイヤモンドのエース、14-ダイヤモンドなど したがって、スコアリングの原則。 カードのコードを残りの部分で13で除算します。商はスーツに等しく、残りはカードに等しくなります。 同時に、aceコードが残りの部分に常にゼロを与えることに気付くのは簡単です。 カードをポイントに変換します。 除算の残りの部分が1〜9の範囲にある場合、カードが与えるポイントは、残りの部分に1を加えたものに対応します。これは、「7。 複合体1 "。 ジャック、クイーン、キングのカードは10ポイントを与えます。 しかし、エースでは、すべてがトリッキーです。 ゲームのルールによれば、エースは11ポイントを獲得でき、11ポイントで獲得しすぎた場合には1ポイントを獲得できます。 アルゴブロック3-5および9-12を見ると、最初にエース(カードコードを分割する商がゼロに等しくなく、残りがゼロに等しい)が11ポイントに等しいことがわかります。ただし、信号が「バスト」の場合、トリガー10.RS1」およびエースはすでに1ポイントに等しい。 なぜなら 「バスト」信号は10ミリ秒の遅延でフィードバックされます。その後、プレーヤーの早すぎる敗北を防ぐため(そして、バストが11エースポイントだけで突然になった)、ポイントを再カウントする時間を確保するために50ミリ秒の遅延をかけます



最終プログラム



プログラム(上記のマクロ)の基礎は準備ができています。 それらをフィールドに置き、結果を管理および表示するためのハーネスを作成することが残っています。

最終プログラム。 Habrastorage。 図面は非常に大きいです。






最終プログラム。 ラディカル。 図面は非常に大きいです。






最終プログラムの簡単な説明。

主制御要素として、アルゴブロック「1. Selector 1」が使用されます。 オペレータステーションからのコマンドで、適切な出力で10ミリ秒単位を形成します。 コメントでは、ビットが意味するものに署名されています。



-ゲームを開始するには、最初の出力のユニットを最初のセレクターに設定します。 このコマンドに対してトリガー「3.RS8」が設定されており、ゲームが進行中であることを示すサインが含まれています。

-セレクターの2番目の出力にあるユニットは、すべてのトリガーをリセットし、すべてのカウンターと保存された状態をリセットし、プログラムを元の状態にリセットします。

-セレクターの3番目の出力にあるユニットがラウンドを開始します。 この場合、トリガー「ゲームが実行中」がコックされ、同時にベットが行われた場合にのみ、トリガー「14.RS5」がコックされます。 このトリガーが投入された後、4つのパルスの形成が開始され、2つのカードがプレーヤーとディーラーに配られます。

-4番目の出力のユニットは、プレイヤーに別のカードを与えるインパルスを生成します。

-5番目の出口のユニットは、トリガー「31.RS10」を作動させ、プレイヤーがカードを受け取れないようにします。 同時に、ディーラーへのカードの配布が開始されます。 ここで1つの修正が行われます。 カジノの規則によると、ディーラーは、プレーヤーが持っているポイントの数に関係なく、17以上のポイントを獲得した時点で停止する必要があります(ところで、これは背景画像にも書き込まれます)。 しかし、ゲームが1対1になる場合、このルールは意味をなしません。 したがって、ディーラーのポイントがプレイヤーのポイントよりも少なくなるまでディーラーがカードを引くというアルゴリズムが実装されています。 もちろん、プレーヤーが多すぎる場合、ディーラーはカードをまったく受け取りません。 ラウンドはそこで終わります。

-6番目の出力のユニットは、ラウンドトリガーと保存されているカードをリセットします。 したがって、プログラムは新しい配布の準備ができています。



次に、ラウンド終了の条件がチェックされ、プレイヤーが勝った場合、ベットに等しいチップ数がクレジットされ、ディーラーはそれに応じて同じチップ数を取り除きます。 プレーヤーが負けた場合、彼の賭けはディーラーに行きます。 平等で、誰もが彼自身のままです。

チップの累積量(および最初はプレーヤーとディーラーはそれぞれ1000チップ)がゼロ(「98. Compare 8」ブロックと「99. Compare 9」ブロック)と比較され、ゲームの勝敗に対応するトリガーがコックされます。



それだけです。 プログラムの準備ができました。 これらすべてをコンパイルしてコントローラーにロードします。

プログラム統計






冒頭に描かれたグラフィックインターフェイスをプログラムの信号に添付し、再生できます。

初期状態






ゲームを開始しました






配布






手を失う






そして勝ちます!






仕事と組み合わせる:)








簡単な結論



前の例とは異なり、タスクに数千のアルゴブロックが含まれていた場合、今回はわずか600個しかかかりませんでした。 さらに、ご覧のとおり、ほとんどのアルゴブロックはマクロ内にあります。

このタスクを実装するために、参考図書の長時間の退屈な研究やインターネット上の質問への回答の検索は必要ありませんでした。 すべては、「and」、「or」、「addition」、「division」、「trigger」などの最も単純なアルゴリズムを使用して書かれており、その原理は学生には明らかです。

同時に、タスクは1日未満で完了しました(プロジェクト全体は3日かかりました。もちろん完全ではありません。合計で1日2〜3時間かかります。また、最初の2日間は絵の具でカードを描き、碑文やその他の写真を作成しました)かさばらず、必要に応じて簡単に変更できます。 最初に、ブラックジャックはシングルデッカーになると書きました。 だから-5分であなたはデッキの任意の数のプログラムをやり直すことができます。 ヒットカウンターを置くために、カードの一意性をチェックするときは、マクロ内で十分です。 デッキが3つある場合、同じカードを3回ドロップできます。そのため、4回目にカードが表示されるときに「still tr​​y」のサインをコックする必要があります。

他の編集も簡単に行えます。

この記事の終わりに、「CFCで楽しく簡単にプログラムを作成できる」というフレーズを紹介します。



最後まで読んでくれたみんなに感謝します。 面白かったと思います。

PS。 エラー質問への答え。
最初に、誤った配布につながるエラー(意図的に残した)について書きました。 したがって、間違いは、カード用のスロットが8つしかないことです。 理論的には、プレーヤーは4デュース、4トリプル、エースを追加で持つことができます。 その結果、8枚のカードを使用しても、21ポイントを超えることはできません。 しかし、以来 カードスロットが残っていない場合、プレーヤーは[十分]ボタンをクリックして、ディーラーに移動を転送する必要があります。 ただし、このような配布の可能性は非常に小さいため、この間違いを最も慎重な質問に任せることにしました。




UPD。 habrastorageでは大きな画像が圧縮されており、提供されたリンクを使用して通常の解像度で見ることができないことに気付きました(少なくとも私にとって)。 ラディカルに画像をリロードしました。



All Articles