Game
ゲームイベントは、ランダムに生成された浮動をゲーム固有の関連する結果に翻訳するものです。これには、サイコロを振った結果からデッキ内のカードの順序、さらにはマインゲームのすべての爆弾の位置まで含まれます。
以下は、私たちのプラットフォームの各特定のゲームのために、どのようにフロートをイベントに翻訳するかについての詳細な説明です。
ハイロ
標準のトランプデッキには、52のユニークな可能な結果があります。私たちのプラットフォームでブラックジャック、ハイロー、バカラをプレイする場合、ゲームイベントを生成する際に無限のデッキを利用し、したがってカードの各ターンは常に同じ確率を持っています。これを計算するために、各ランダムに生成された浮動を52倍し、次のインデックスに基づいてその結果を特定のカードに変換します。
// Index of 0 to 51 : ♦2 to ♣A
const CARDS = [
♦2, ♥2, ♠2, ♣2, ♦3, ♥3, ♠3, ♣3, ♦4, ♥4,
♠4, ♣4, ♦5, ♥5, ♠5, ♣5, ♦6, ♥6, ♠6, ♣6,
♦7, ♥7, ♠7, ♣7, ♦8, ♥8, ♠8, ♣8, ♦9, ♥9,
♠9, ♣9, ♦10, ♥10, ♠10, ♣10, ♦J, ♥J, ♠J,
♣J, ♦Q, ♥Q, ♠Q, ♣Q, ♦K, ♥K, ♠K, ♣K, ♦A,
♥A, ♠A, ♣A
];
// Game event translation
const card = CARDS[Math.floor(float * 52)];
これらのゲームに関与する唯一の差別化要因は、ハイロとブラックジャックでは、プレイヤーに大量のカードを配布する必要がある場合に52の可能なゲームイベントを生成するために13のカーソルがあるのに対し、バカラではプレイ可能なカードの最大数をカバーするために6のゲームイベントを生成する必要があることです。
ダイヤモンド
ダイヤモンドをプレイする際、宝石の形で7つの可能な結果があります。これを実現するために、生成された各フロートを7倍してから、次のインデックスを使用して対応する宝石に変換します。
// Index of 0 to 51 : ♦2 to ♣A
const CARDS = [
♦2, ♥2, ♠2, ♣2, ♦3, ♥3, ♠3, ♣3, ♦4, ♥4,
♠4, ♣4, ♦5, ♥5, ♠5, ♣5, ♦6, ♥6, ♠6, ♣6,
♦7, ♥7, ♠7, ♣7, ♦8, ♥8, ♠8, ♣8, ♦9, ♥9,
♠9, ♣9, ♦10, ♥10, ♠10, ♣10, ♦J, ♥J, ♠J,
♣J, ♦Q, ♥Q, ♠Q, ♣Q, ♦K, ♥K, ♠K, ♣K, ♦A,
♥A, ♠A, ♣A
];
// Game event translation
const card = CARDS[Math.floor(float * 52)];
サイコロ
私たちのサイコロのバージョンでは、00.00から100.00までの可能なロール範囲をカバーしており、10,001の可能な結果の範囲があります。ゲームイベントの翻訳は、浮動小数点数を可能な結果の数で乗算し、その後100で割ることによって行われ、得られた数が当社の定めたサイコロの範囲の制約に適合します。
// Game event translation
const roll = (float * 10001) / 100;
コインフリップ
コインフリップをプレイする際、コインの形で2つの可能な結果があります。これを実現するために、生成された各フロートを2倍してから、次のインデックスを使用して対応する宝石に変換します。
// Index of 0 & 1 : batman & joker
const COINS = [ 0, 1 ];
// Game event translation
const coin = COINS[Math.floor(float * 2)];
リンボ
リンボに関しては、2段階のプロセスを使用します。まず、浮動小数点数を最大可能乗数とハウスエッジの両方で掛け算します。その後、ゲームイベントを生成するために 確率分布 最大可能な乗数を最初のステップの結果で割り、クラッシュポイントの形でゲームイベントを作成します。
// Game event translation with houseEdge of 0.99 (1%)
const floatPoint = 1e8 / (float * 1e8) * houseEdge;
// Crash point rounded down to required denominator
const crashPoint = Math.floor(floatPoint * 100) / 100;
// Consolidate all crash points below 1
const result = Math.max(crashPoint, 1);
プリンコ
プリンコのゲームでは、生成された結果は落下するボールの経路に基づいています。ゲームイベントは、落下プロセスの各レベルで落下するボールの方向を決定します。プレイヤーは、プレイ用の8〜16のピンの中から選択でき、これは上から下までの完全な経路を生成するために必要なゲームイベントの数を決定します。可能な方向は2つ(左または右)しかないため、翻訳は各フロートを2倍することによって行われ、次のインデックスにマッピングされます:
// Index of 0 to 1 : left to right
const DIRECTIONS = [ left, right ];
// Game event translation
const direction = CARDS[Math.floor(float * 2)];
ケノ
伝統的なケノゲームでは、ボード上のヒットの形で10の可能なゲームイベントを選択する必要があります。
// Index of 0 to 39 : 1 to 40
const SQUARES = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40
];
const hit = SQUARES[Math.floor(float * 40)];
フィッシャー・イェーツシャッフルの実装は、重複する可能性のあるヒットが生成されるのを防ぐために使用されます。
マイン
マインゲームは、ボード上のマインの形で24の個別のゲームイベントで生成されます。各フロートは、ボード上にまだ残っている可能性のある一意のタイルの数で乗算されます。これは、対応するフロートを使用して生成された各ゲームイベントの結果のイテレーションの数から残りのタイルの数を1減算することによって行われます。マインの位置は、左から右、上から下のグリッド位置を使用してプロットされます。
フィッシャー・イェーツシャッフルの実装は、重複する可能性のあるヒットが生成されるのを防ぐために使用されます。選択された設定に基づいて、1から24のゲームイベント結果が使用されます。
ホイール
ゲームイベント番号は、フロートをセグメント内の可能な結果で掛け算することによって計算されます。それは次のインデックスを使用して、乗数としてゲームイベント結果を決定するために使用されます:
// Index per payout configuration
const PAYOUTS = {
'10': {
low: [ 1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0 ],
medium: [ 0, 1.9, 0, 1.5, 0, 2, 0, 1.5, 0, 3 ],
high: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.9 ]
},
'20': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
1.5, 0, 2, 0, 2, 0, 2, 0, 1.5, 0,
3, 0, 1.8, 0, 2, 0, 2, 0, 2, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 19.8
]
},
'30': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 2, 0,
2, 0, 1.5, 0, 3, 0, 1.5, 0, 2, 0,
2, 0, 1.7, 0, 4, 0, 1.5, 0, 2, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 29.7
]
},
'40': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
2, 0, 3, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 2, 0, 2, 0, 1.6, 0, 2, 0,
1.5, 0, 3, 0, 1.5, 0, 2, 0, 1.5, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 39.6
]
},
'50': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
2, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 2, 0, 1.5, 0, 2, 0, 2, 0,
1.5, 0, 3, 0, 1.5, 0, 2, 0, 1.5, 0,
1.5, 0, 5, 0, 1.5, 0, 2, 0, 1.5, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 49.5
]
}
};
// Game event translation
const spin = PAYOUTS[segments][risk][float * segments];
クラッシュ
公正を証明するために、前のハッシュの16進表現のハッシュである10,000,000のSHA256ハッシュのチェーンを生成しました。チェーンの最後のハッシュは次のとおりです: 78a9757d3be42b74a3f70239078ad9317125fe9ee630d5bdada46de963e56752
ゲーム結果を生成する公式:
const gameHash = hashChain.pop()
const hmac = createHmac('sha256', gameHash);
// blockHash is the hash of bitcoin block 584,500
hmac.update(blockHash);
const hex = hmac.digest('hex').substr(0, 8);
const int = parseInt(hex, 16);
// 0.01 will result in 1% house edge with a lowest crashpoint of 1
const crashpoint = Math.max(1, (2 ** 32 / (int + 1)) * (1 - 0.01))
ダブル
私たちのダブルは、ホイールが0から14までの15の異なるポケットで構成されるヨーロッパ版のゲームから派生しています。ゲームイベントは、floatを15倍して計算され、次のインデックスを使用して対応するポケットに変換されます。
// Index of 0 to 14
const POCKETS = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14
];
// Game event translation
const pocket = POCKETS[Math.floor(float * 15)];
タワー
タワーゲームは、タワーのレベルの形で9つの別々のゲームイベントで生成されます。各レベルの難易度に応じて卵の数を生成し、卵が置かれることができるタイルの範囲も整数で表されます。
生成された各フロートは、各行の卵の位置を決定するために整数に変換されます。たとえば、簡単なレベルは次のように表されます: [0, 1, 3] - 卵はタイル1、2、および4に存在します。
// count represents the number of eggs
// size represents the number of possible squares
const LEVEL_MAP = {
easy: { count: 3, size: 4 },
medium: { count: 2, size: 3 },
hard: { count: 1, size: 2 },
expert: { count1, size: 3 },
master: { count: 1, size: 4 },}
フィッシャー–イェーツ シャッフルの実装は、行に重複する卵が表示されるのを防ぐために使用されます。