目次:
- ステップ2:スロットマシンのメニューと機能
- ステップ3:数学を理解する
- ステップ4:工具と部品の入手
- ステップ5:回路の構築
- ステップ6:ソフトウェアのインストール
- ステップ7:スロットマシンをコーディングする
ゲームには、各リールに25個の同じ25個のシンボルが表示された3つのリールがあります(4 8 x 8マトリックスを持つコンポーネントの8 x 8マトリックスの1つは使用されません)。あなたが3つの宇宙船を得れば、あなたは大当たりに勝ちます。あなたが1つか2つの宇宙船を得るならば、あなたはいくつかのクレジットも獲得します。あなたがマッチする2つか3つのシンボルを得ればあなたも勝ちます。以下に示すように、宇宙船と2つのシンボルが一致した場合、ゲームは最も低い確率/最も高いペイアウトで勝利したイベントに基づいて支払います。言い換えれば、勝利イベントは相互に排他的です、あなたはリールの単一スピンで2つの異なる方法で勝つことはできません。これにより、プログラミングが少し簡単になりました。私には他にもたくさんの課題がありました。
ステップ2:スロットマシンのメニューと機能
このスロットマシンには、2つのナビゲーションボタンと1つの選択ボタンを使用した20 x 4のI 2 C対応LCDディスプレイを介してアクセスできる興味深い機能がいくつかあります。これらのボタンは、マイクロコントローラの外部割り込み機能を利用した、かなり洗練されたデバウンスアルゴリズムを使用しています。これがメインメニューです。
メニューには6行ありますので、メニュー全体を表示するには、「下に移動」ボタンを使用してスクロールダウンする必要があります。リールの「回転」専用のレバー/ナイフスイッチがあります。それに加えて、メインメニューから 'Play'を選択することもできます。あなたはいつでもあなたの賭けを変えることができます。
最もエキサイティングな機能は、ゲームが「自動」モードでプレイできるということです。つまり、LCD画面の設定メニューから自動モードオプションを選択すると、そのオプションをもう一度選択するか、100万回プレイされるまで、ゲームは何度も繰り返し再生されます。これはゲームをテストするための重要な機能です。ここで音を無効にすることもできます。
LCDのメニューから、シミュレーションから生成されたすべての測定基準を見ることも可能です。 USBケーブルを使用してRXおよびTXピンを介してマイクロコントローラをモニタに接続すると、これらのメトリックも出力され、シリアルモニタに表示されることがあります。表示される指標のリストには、あなたのクレジット残高、あなたが大当たりした回数、そして他の方法でクレジットを獲得した回数が含まれています。これにより、さまざまな支払いに基づいてシミュレーションを実行することができ、支払いテーブルを設定して証明するのに役立ちました。ペイアウトテーブル自体は設定できません。一度設定されると、それは同じままであるはずです。ボラティリティインデックスを使用してペイアウトテーブルを操作することで、ボラティリティインデックスを設定可能にすることは可能だと思いますが、それにはさらに多くの作業が必要になります。
リセットオプションを使用すると、(EEpromの書き込みを除く)すべてのメトリックをゼロにリセットできます。このチップはEEpromへの約10万回の書き込みで動作します。 512kのEEpromがチップ上で利用可能であり、そのほんの一部しか使用していないので、10万回の書き込みに近づくにつれて、EEprom内のメトリックの位置を実際に移動することが可能になります。私はこの機能を実装していませんが、それはチップの寿命を延ばす手段になるでしょう。
最後に、保留、または(一定期間にわたって)家が保持している各賭けの割合が設定可能です。リセット操作を実行した後、ホールドを再度設定する必要があることを忘れないでください。
プレーヤーのクレジット残高は常に8桁の7セグメントディスプレイに表示されます。
ステップ3:数学を理解する
ゲームが現実的であることを確認するために多くの作業が行われました。ゲームが許容可能なボラティリティ指数(VI)を持つように、確率が計算され、ペイアウトテーブルが設計されました。この指標は、マシンの動作がどの程度予測可能かを測定します。より高いVIを持つマシンは、プレーヤー(または家)にもっとお金を稼ぐ可能性が高いです。それは低いVIを持つ機械ほど予測できません。まったく同じゲームが、異なるVIを持つ異なるカジノ(あるいは同じカジノ)に存在することは事実です。 VIは、支払いスケジュールを操作することによって変更されます。私たちのゲームのためにここにそれぞれの種類の勝利のための確率と支払いがあります。
オッズ(右端)とペイアウト(左端)は劇的に異なります。このゲームが、配当表がオッズと一致するか、または厳密に従うようにプログラムされている場合、そのVIは許容できないほど高くなります。ホールドはペイアウトのパーセンテージとして計算され、家/カジノが保持している賭け金の一部です。述べたように、あなたはLCDメニューを通してホールドを設定することができます。管轄区域によって、その管轄区域内のスロットマシンの最大保有数を左右する規則が異なることに注意してください。一般的な最大ホールドは15%です。法的に許容される最大値に保留を設定しても、必ずしもそのマシンで得られる利益が最大化されるわけではないことを理解してください。保留を高くすると、プレイヤーがマシンを使用できなくなる可能性があります。しかし、私は多くのプレイヤーがホールドを無視していると考えています。これは通常細かい活字で埋められています。また、マシンの需要曲線は比較的垂直です(マシンの使用コスト、ホールドはほとんど無視されます)。機械によって生み出される利益は、ゲームのデザインだけでなく、機械の位置や配置によっても大きく左右されます。しかしそれは単なる憶測です。私は、ホールドに敏感な、精通したギャンブラーがいると確信しています。
3つのテーブルを含むコードで利用可能なスプレッドシートは、ゲームが正しく機能していることを証明するために作成されました(最初のテーブルは上に表示されています)。スプレッドシートを作成する最初のステップは、それぞれの種類の勝利の確率を正確に計算することでした(計算された確率列)。
3つの宇宙船
3つの宇宙船が出現する確率は、可能な組み合わせの総数の逆数です。それぞれのリールには25個のユニークなシンボルがあるので、確率は1 /(25 x 25 x 25)、つまり0.000064です。これにより、1/156 - 1の確率が1になります。ここで確率から確率を計算する方法を学びました。
3つのシンボルが一致 (宇宙船を除く)
スペースシップ以外の3つのシンボルが一致する確率は、24(各リールのユニークシンボルの数からスペースシップを引いたもの)を、可能な組み合わせの数で割ったものです。一致する3つのシンボルの組み合わせが24あるため、24は分子です。 24/15625 = 0.001536。それは1から650.04までの確率になります。
二つの宇宙船
2つの宇宙船のマッチングの合計24 x 3の組み合わせがあります。それは宇宙船の2つの試合をするあなたの方法があるからです。 X =宇宙船、Y =その他の記号、XXY、XYX、およびYXXを指定します。 Yには24の可能な値があります。したがって、24 X 3/15625 = 0.004608です。オッズは1〜216.01です。
一つの宇宙船が現れる
各リールについて、現れる単一の宇宙船のために可能な24 x 24の組み合わせがあります。宇宙船はどのリールにも現れることができるので、1つのリールで利用可能な組み合わせの数に3つのリールを掛ける必要があります。したがって、確率は24 x 24 x 3/15625 = 0.110592です。オッズは1〜8.04です。
2つのシンボルが一致
宇宙船以外の任意の2つのシンボルには、23(25 - 1の宇宙船 - 3のシンボルと一致させる1のシンボル)x 3リールx 24のスペースシップ以外のシンボルがあります。確率は(23 X 3 X 24)/ 15625 = 0.105984です。オッズは1〜8.44です。
それぞれの種類の勝利の確率がわかったので、スプレッドシートを使用して、ボラティリティ指数が許容範囲内になるようにペイアウトテーブルを設計できます(<〜20)。これを行う方法を理解するために私はこの記事に大きく頼りました。最初の表の「家の所得」列に、試行錯誤のプロセスを使用して、VIが20未満になり、セルJ10の合計が可能な限りゼロになるまで値を入力しました。これらの値を使用して、SlotMachine.inoのTHREE_SPACESHIP_PAYOUT、THREE_SYMBOL_PAYOUT、TWO_SPACESHIP_PAYOUT、ONE_SPACESHIP_PAYOUT、およびTWO_SYMBOL_PAYOUTをそれぞれ設定します。次に、最初にゼロパーセントの保持を使用して、1,000,001再生のシミュレーションを5回実行し、メトリックメニューの値を実績結果テーブルの適切な行と列に入力しました。
Probabilities Actualは計算された確率とよく一致しており、Pct Diff Prob列は妥当であることがわかりました。また、House Paysの行の値とUnderstanding Potential Incomeテーブル(2番目のテーブル)の1,000,000行のIncome HighおよびIncome Lowの列の値の範囲を一致させ、実際の結果のテーブルの値と一致することを確認しました。 「高収入」および「低収入」列で指定された範囲内にありませんでした。 「潜在的所得の理解」テーブルでは、90%の信頼区間で、所定の保有価値に対する所得の予想範囲を定義します。以下の例では、ホールドは0に設定されているので、勝つ可能性は負ける可能性と一致します。あなたがゲームを100万回プレイすると、収入が16,432と-16,432の間にある可能性が90%あります。
スプレッドシートとプログラムを使用して何百万ものシミュレーションを実行した後、プログラムの欠陥を解決し、スプレッドシートの欠陥に対処し、VIが20未満になるようにペイアウトテーブルの値を定義することができました。実際の状況でゲームを展開した場合、ゲームの収益が予想と一致していることを確認するために、シミュレーションを5回実行し、さらに5つのシミュレーションを実行しました。
そして、これが実際の結果です。
支払い額の設定の背後にあるすべての数学を本当に理解したい場合は、スプレッドシートの数式を検討することをお勧めします。エラーを見つけた場合は、親切に指摘してください。私は貿易では数学者(またはCプログラマー)ではないので、標準の免責事項が適用されます。
ステップ4:工具と部品の入手
私は両方のATmega328P-PUマイクロコントローラをその場でプログラムするためにシリアルボードにFTDI USBを使いました。これらの接続はFritzing回路図には示されていません。あなたのはんだのないブレッドボードにFTDIブレイクアウトボードを設定する方法については、このリンクに従ってください。あなたはセットアップを釘付けにするために少しグーグル周りする必要があるかもしれません。私はこの記事が私がFTDIブレイクアウトボードを介してプログラミングの開始時にマイクロコントローラを自動的にリセットさせようとしていた問題のトラブルシューティングにも役立ったと思います。必要に応じてリセットボタンを押し続ける必要がないように、ATmega328リセットピン(位置1 / PC6 /リセットピン)とFTDIブレークアウトボードのRTSの間の接続と直列に100 nFのコンデンサを配置することを忘れないでください。チップをプログラムする。あなたがチップをプログラムするためにあなたのArduino Unoを使うことを選ぶならば、指示はここにあります。付属のコードを使ってチップを1回だけプログラムするのであれば、おそらくArduino Unoからチップをプログラムするのが最も早く簡単です。
両方のマイクロコントローラーはブレッドボード上の 'Arduino'チップ(ATmega328P-PU)でセットアップされています。コンポーネントを一緒にはんだ付けしてこのプロジェクトを最終的に構築することを計画している場合、またはプロジェクトをブレッドボードしたときにここで行ったことをそのままコピーしたい場合は、ブレッドボードにArduinoをセットアップする方法を理解してください。 。そのためには、こちらの優れた指示に従ってください。これらの手順には、Arduinoブートローダを2つのチップにロードする必要がある場合に従う必要がある手順が含まれます。ここで推奨されているように、中国のサプライヤーからおよび/またはe-bay経由でチップを購入する場合に最も必要です。部品リストにあります。それを行うには、AVRISP mk IIやUSBTiny ISPのようなAVRプログラマーが必要です。ブートローダを焼くためにArduinoを持っているなら、それを使うこともできます。上記のリンクをたどると、すべてのオプションが説明されています。
部品
# | コスト | 部品/説明 |
---|---|---|
2 | $3.00 | ATMega328P-PU、スロットマシン用とI2CクレジットLEDディスプレイスレーブ用 |
1 | $1.20 | 8桁の7セグメント表示 |
1 | $3.78 | 8×8マトリックス4セグメントMAX7219
回転リールをシミュレートしてシンボルを表示します。 forセグメントのうち3つだけが使用されます。 |
1 | $5.37 | I2C 2004シリアルブルーバックライトLCDモジュール20 X 4 2004 |
2 | $4.00 | 圧着ブレッドボード |
6 | $1.00 | 一時的な連絡先ボタン。 1つはリールを回転させるコントロール、3つはメニューをナビゲートするため、2つは接地ピン用です。
ATMegasの1 |
1 | $0.10 | RGB拡散コモンカソード
さまざまなことを知らせるために使用 |
1 | $0.10 | 緑色のLED
ボードに電力が供給されているかどうかを示します。 |
6 | $0.30 | 10kオーム抵抗
各ボタンを引き上げるには4、ATmegasのピン1には2。 |
4 | $0.20 | 1kオーム抵抗
各ボタンとATmega入力ピンの間 |
4 | $0.20 | 330オーム抵抗
RGB LEDの赤、緑、青のリード線用。 |
2 | $0.50 | 16MHzクリスタル
Slt MachineのATmega328p-pu用とLEDディスプレイスレーブのATmega328p-pu用 両方とも16MHzで動作 |
1 | $0.10 | スライドスイッチ
電源については、ゲームのオンとオフを切り替える |
2 | $1.00 | ピエゾブザー。 1つはSlot Machineチップ用、もう1つはディスプレイスレーブチップ用です。 |
4 | $0.40 | 22pFコンデンサ |
6 | $0.60 | 0.10μFのコンデンサ |
2 | $0.20 | 100 nFコンデンサ
あなたがArduinoのミニUSBシリアルアダプタを使用している場合、これらはオプションであり、孤独に必要とされます Slot Macineチップのプログラミング |
2 | $0.20 | 10uFコンデンサ
供給電圧を滑らかにするために |
1 | $1.00 | 7805リニアレギュレータ
電圧供給を調整するには、5V |
? | $?.?? | 一般的なジャンパー配線と接続線。あなたはこれのかなりの量が必要です。ほとんどの
私は自分のものを作りますが、私もジャンパー線を使います。 |
1 | $?.?? | 5V電源
電池式の壁マートを使うことができます。私が提案する最終製品のために 直列に2 18650電池。 |
0、1、または2 | $13.20 | ArduinoミニUSBシリアルアダプター
ATmega328P-PUチップを所定の位置にプログラムするためのものです。 Arduino Unoも使えます プログラミングをするか、またはFTDI USBをTTLシリアルアダプタに置き換えます。には描かれていません 回路図 |
0、1、または2 | $1.66 | FTDI USB - TTLシリアルアダプタ
ATmega328P-PUをその場でプログラミングするために。回路図には示されていません。 |
0または1 | $10.00 | Arduino Uno
2つのマイクロコントローラをプログラムするため。 |
1 | $2.00 | ハーフサイズはんだ付け可能ブレッドボード |
1 | $2.00 | フルサイズはんだ付け可能ブレッドボード |
これが私が注文したエンクロージャです。そこにコンポーネントを挿入します。
こちらの商品は、13.80米ドルでご利用いただけます。それは私の考えでは少し高価な面です。私はリールとクレジットバランスの表示を見るためにその中に穴を開ける必要がないように私はすべてがフィットし、トップが非常に透明であることを願っています。ここに着いたらどうなるか見てみましょう!提案を歓迎します。
ステップ5:回路の構築
Fritzing回路図はこちらから入手できます。
Fritzing図は混雑しているので、以下にマイクロコントローラの配線に関する指示を含めました。これは必要な接続のすべてを表すわけではありませんが、混乱を解消するためのものです。未使用のピンをすべて接地したわけではありませんが、最終製品ではおそらくそうするつもりです。電源の回路を設定することに関してFritzingダイアグラムに従うのに問題がある場合は、電源の回路の追加で、ここを見てください。ブレッドボードのグランドレールと電源回路の間にスイッチを追加して、電源の抜き差しをしなくても回路の電源をオン/オフできるようにしてください。私たちがすべてをエンクロージャに入れるとき、それは重要になるでしょう。
スロットマシン
ピン1 - FTDI USBからシリアルへのRTS、リセットボタン
ピン2 - FTDI USB - シリアルブレークアウトボードのTXD
ピン3 - FTDI USB - シリアルブレークアウトボードのRXD
ピン4 - 1Kオーム抵抗 - 瞬間的な「スピン」ボタン
ピン5 - 330オーム抵抗 - RGB LED青いピン
ピン6 - 未使用、接地することを検討
ピン7 VCC - ブレッドボード電源レール、0.1uFコンデンサ
ピン8 GND - ブレッドボードグランドレール、0.1uFコンデンサ
ピン9 XTAL1 - 16MHzの水晶、ブレッドボードグランドレールへの22pFコンデンサ
10番ピンXTAL2 - 16MHz水晶、ブレッドボードグランドレールへの22pFコンデンサ
ピン11 - 未使用、接地することを検討
ピン12 - 未使用、接地することを検討
ピン13 - 未使用、接地することを検討
ピン14 - 8×8マトリックスのDIN
ピン15 - 330オームの抵抗 - RGB LEDの赤いピン
ピン16 - 330オーム抵抗 - RGB LEDグリーンピン
ピン17 - ピエゾブザープラス - マイナスピエゾブザー - ブレッドボードグランドレール
ピン18 - 8 x 8マトリックスのCS
ピン19 - 8 x 8マトリックスのCLK
ピン20 AVCC - ブレッドボード電源レール、0.1uFコンデンサ
ピン21 AREF - ブレッドボード電源レール
ピン22 GND - ブレッドボードグランドレール
ピン23 - このピンはフローティングのままにしておきます。これは乱数ジェネレータをシードするために使用されます
24番ピン - 1KΩ抵抗 - 瞬間的な「上へ移動」ボタン(Fritzing図の間違い!)
ピン25 - 1Kオーム抵抗 - 一時的な「下に移動」ボタン
ピン26 - 1Kオーム抵抗 - 一時的な「選択」ボタン
ピン27 SDA - ディスプレイのピン27 SDA I2C ATmega328P-PUスレーブ
ピン28 SCL - ディスプレイI2C ATmega328P-PUスレーブのピン28 SCL
ディスプレイスレーブ
ピン1 - FTDI USBからシリアルへのRTS、リセットボタン
ピン2 - FTDI USB - シリアルブレークアウトボードのTXD
ピン3 - FTDI USB - シリアルブレークアウトボードのRXD
ピン4 - 未使用、接地することを検討
ピン5 - 未使用、接地することを検討
ピン6 - 未使用、接地することを検討
ピン7 VCC - ブレッドボード電源レール、0.1uFコンデンサ
ピン8 GND - ブレッドボードグランドレール、0.1uFコンデンサ
ピン9 XTAL1 - 16MHzの水晶、ブレッドボードグランドレールへの22pFコンデンサ
10番ピンXTAL2 - 16MHz水晶、ブレッドボードグランドレールへの22pFコンデンサ
ピン11 - 未使用、接地することを検討
ピン12 - 未使用、接地することを検討
ピン13 - 未使用、接地することを検討
ピン14 - 未使用、接地することを検討
ピン15 - ピエゾブザープラス - マイナスピエゾブザー - ブレッドボードグランドレール
ピン16 - 7セグメントディスプレイのCS
ピン17 - 7セグメントディスプレイのCLK
ピン18 - 7セグメントディスプレイのDIN
ピン19 - 未使用、接地することを検討してください
ピン20 AVCC - ブレッドボード電源レール、0.1uFコンデンサ
ピン21 AREF - ブレッドボード電源レール
ピン22 GND - ブレッドボードグランドレール
ピン23 - 未使用、接地することを検討
ピン24 - 未使用、接地することを検討
ピン25 - 未使用、接地することを検討
ピン26 - 未使用、接地することを検討
ピン27 SDA - スロットマシンのピン27 SDA I2C ATmega328P-PU
ピン28 SCL - スロットマシンのピン28 SCL I2C ATmega328P-PU
ステップ6:ソフトウェアのインストール
ATmegaチップにアップロードできるようにコードをコンパイルしたい場合は、これらすべてのライブラリをArduino開発環境にインストールする必要があります。このページではArduinoライブラリのインストール方法について説明します。
- Arduino IDE
- タイマーフリートーンライブラリ
- LED制御ライブラリ
- 液晶/ LCDライブラリー
- 液晶I2Cライブラリ
ステップ7:スロットマシンをコーディングする
コードを1行ずつ見ていくつもりはありません。それは広範囲にコメントされていて、どこでも難しいことは何もありません。だから力を使って、ソースを読んでください。 ATmega386でのレジスタ操作に慣れておらず、Arduinoライブラリに頼らずにAVRマイクロコントローラ用のコードを書く方法についてもっと知りたいのであれば、Elliott Williamのコピーを入手することをお勧めします。優れた本、 "Make:AVR Programming"。 safaribooksonline.comを定期的に購読している場合は、そこにあります。それ以外の場合は、Amazonから入手できます。これらのプログラムでは、ある場所でArduinoの関数を使い、他の場所では直接レジスタを操作します。それについてすみません。
あなたが最初に気づくかもしれないことはプログラムがグローバル変数を広範囲に利用するということです。 Stack Overflowでこのトピックに関する良い議論があります。ここではグローバル変数の多用を促進したり防御したりするつもりはありませんが、トピックに関するすべての観点を理解し、単一のプログラマと限られたリソースで組み込みアプリケーションプロジェクトでそれらを使用することに対する強い議論があることを認識してください。 。
私はいくつかのライブラリを利用しますが、それなしではこのプロジェクトは私にとって不可能でした。 Timer Free Tone Libraryは、パッシブピエゾスピーカーを介してさまざまな周波数を駆動するために使用されます。 SlotMachine.hには、音符の定義がたくさんあることがわかります。あなたが望むメロディをまとめるのにそれを使うことができます。 SlotMachineのマイクロコントローラが起動してセットアップ機能が実行されるとき、私はそれらのほんの一握りを「第三種の遭遇を閉じる」からテーマの一部を演じるのに使います。私は私が何かのためにタイマーが必要になるだろうと思っていたのでタイマーフリーライブラリを選択しましたが、私はまったくタイマーを使わないことになった。必要に応じて利用できます。 LEDコントロールライブラリはSlotMachine.inoとslotCreditDisplaySlave.inoの両方で使用されています。前者では、スロットマシンのリールとして機能する3つの8 x 8 LEDマトリックスを制御するために使用されていました。 slotCreditDisplaySlave.inoでは、ライブラリはプレーヤーのクレジット残高を表示する8桁の7セグメントディスプレイへのアクセスを容易にします。クレジット残高を補うためだけに別のAVRチップ(ATmega328)を使用するのを避けようとしたのですが、8 x 8マトリックスと8桁7セグメントディスプレイを制御する方法を見つけることができませんでした。単一のマイクロコントローラ。そのため、最終的にその目的を果たすためにI2Cスレーブを作成する必要がありました。それは間違いなくあなたがクレジット残高を表示する仕事をするためにより安価なAVRを使うことができたが、私が別のATmega328P-PUチップを使うことを選んだこの記事のために物事を単純にするために。明るい面では、あなたが大きなジャックポットを獲得したとき、あなたは先に進んで再びスピンすることができる間、クレジットはクレジットディスプレイスレーブでカウントアップし続けます。 20行x 4行のLCDディスプレイへのアクセスを容易にするには、LiquidCrystal / LCDおよびLiquidCrystal I2Cライブラリが必要です。すでに説明したように、LCD_SCREEN_HEIGHTの定義を4から2に変更するだけで、20 x 2のLCDに置き換えることができます。このプロジェクト用に入手したLCDディスプレイは、I 2 C対応であることを確認してください。そうでない場合は、LCD1602アダプタプレート用のI2C SPIシリアルインタフェースボードポートモジュール(部品番号PCF8574)を入手し、それをLCD1602ディスプレイに半田付けする必要があります。
ゲームは同時に多数の異なる状態になることができ、machineState変数は状態を追跡します。たとえば、「回転」と「自動モード」を同時に行うことができます。私はプログラムの中でこの概念を多用しません。とにかく、私が他のプログラムで持っているほど多くはありません。しかし、状態に基づくいくつかの条件付き分岐があります。イベントの概念もあり、イベントはProcessEvents関数で送出および処理されます。イベントキューがあった方がおそらくいいでしょうが、私はそこまで行きませんでした。
SlotMachine.inoのコメント欄に既知の欠陥と 'to dos'のリストがあります。リールを回転させるとき(スピンボタンを押すかLCDメニューから再生オプションを選択すると)、1つまたは2つのリールでも動かないことがあります。それは、舞台裏の乱数発生器がそのリールにすでに表示されているシンボルを選んだからです。これはゲームをよりリアルに見せるために修正することができますが、それは実際には欠陥ではありません。ほとんどのスロットマシンで行われているように、リールの回転は左から右には終わっていません。これは、物事を単純にするために、設計によって行われています。リールが実際にスピンする前に、各スピンに対して生成される3つの乱数を昇順に並べ替えることで、リールが左から右に回転し終えるようにすることができますが、気にする必要はありませんでした。
'todos'に関しては、エクササイズを終えてそれを行う方法を学ぶためだけに、ブラウンアウト保護を追加し、犬の保護を監視したいと思います。グローバル変数に割り当てられたスペースの80%がすでに消費されていることに注意してください。これがATmega386とArduinoプログラムで事態が不安定になり始める点です。この時点で私たちはこのプログラムを使っています。私は物事を動かし続けるためにいくらかの予算を組む必要がありました、そして私はプログラムにこれ以上のグローバルを追加することをお勧めしません。たとえば、メニューはグローバル変数スペースを大量に消費するため、これによりメニューの設定部分に機能を追加することが難しくなります。メニューをプログラムメモリに移動することでグローバル変数の問題を解決しようとしましたが、グローバルで使用されるスペースを減らすためにそれを実現することはできませんでした。 。ゲームを少し盛り上げるために、さらに多くの作業を行うことができます。私はRGB LEDとピエゾブザーをもっと使うことができ、もう少し勝利を祝うことができ、多分お金がなくなったときより良い音を作ることができますが、私はそれをプレイしたい人に任せます。
私はゲームのためにすべてのシンボルをデザインしなければなりませんでした。そのうちのいくつかはあなたに古典的なアーケードゲーム「スペースインベーダー」を思い出させるでしょう、そして私はどこかからそれらを借りたかもしれません。それらの残りは私が手でデザインした、そしてそれらのいくつかはプロ並みではない。このサイトを使用して、8 x 8 LEDマトリックスのシンボルをデザインしました。あなたがSlotMachine.hでそれをすることができて、あなたの心の内容にそれらと遊ぶことができるあなたがシンボルを調整したいなら。プログラムロジックには影響しません。あなたがあなたのテキストエディタでそれらを設計することができるようにシンボルのために私は2進数/ 2進法で数を表す。
コードはGitHubから入手できます。
デモ
これはのエントリです
Arduinoコンテスト2019