在這一頁
二十一點(加密版)
在這一頁
簡介
本頁介紹的是加密版二十一點,通常在使用加密貨幣的賭場進行。我假設讀者已經熟悉傳統二十一點的基本規則。
公平公正的賭場
Bonus Code
分析
就 Crypto.Games 的遊戲而言,其奇怪的規則如下:
- 4層甲板
- 每手牌後洗牌
- 莊家不偷看二十一點
- 二十一點賠率 6:5
- 莊家在軟 17 點加牌
- 任兩張牌加倍
- 擊中分牌 A
- 提前投降
- 分牌後,10 和 A 算黑傑克
- 允許分牌後加倍
- 玩家只能分牌一次(我假設)
不考慮提前投降和分牌後10-A算是黑傑克,我的二十一點莊家優勢計算器顯示,使用基本策略的莊家優勢為1.91%。然而,我的二十一點規則變體清單顯示,計算器不支援的兩個規則的值為0.74%。這使得整體莊家優勢達到1.17%,對於線上二十一點遊戲來說,這個數字相當高。
公平遊戲
以下是 Crypto.Games 用於從四副牌中隨機選擇二十一點遊戲牌的過程。
- 在下注之前向玩家透露伺服器種子的 SHA-256 雜湊。
- 下注後,按順序組合伺服器種子和客戶端種子。
- 取得步驟 1 中組合種子的 SHA-512 雜湊值。
- 從步驟 2 找到的 Hash 中取出兩個字符,從左邊開始。
- 將步驟 3 中的兩個字元從十六進位轉換為十進位。如果你不明白我在說什麼,我在我的 Dice(加密版本)頁面中講解了十六進制數學。
- 如果步驟 4 的結果為 207 或更小,則將該卡號對應到 208 張牌的牌盒中的特定卡片。
- 如果在手中尚未找到該牌號,則將其對應到特定的撲克牌上。操作方法如下:
- 要計算點數,將牌號除以 13,然後取餘數。將餘數對應到點數,如下所示:0 對應 A,1 對應 2,2 對應 3,3 對應 4,4 對應 5,5 對應 6,6 對應 7,7 對應 8,8 對應 9,9 對應 10,10 對應 J,11 對應 Q,12 對應 K。
- 要確定花色,請將牌面數字除以 13,去除餘數。然後將商數除以 4,取餘數。最後,將餘數對應到對應的花色,如下所示:0 表示黑桃,1 表示紅桃,2 表示方塊,3 表示梅花。
- 否則,如果步驟 5 的結果大於 207,或已找到該卡,則忽略哈希中的這兩位數字。
- 在哈希表中前進兩個位置,然後返回步驟3,直到到達哈希表末端。這樣你得到的牌應該比處理一手二十一點所需的牌多得多。
例子
以下是範例手的運作流程。
上圖來自公平遊戲面板,是在下注前拍攝的。為了確保遊戲公平,最重要的步驟是輸入並記錄新的客戶端種子(一組隨機字元即可)以及下一個伺服器種子的雜湊值,遊戲將其命名為「下一個伺服器種子 SHA256」。具體如下:
客戶端種子 = 5v5b85n85vb856nvbn5vbn
- 下一個伺服器種子 SHA256 =
581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6
就我個人而言,我會將這些項目複製並貼上到記事本中,以完成這個過程。
在上圖中,我先下注0.00001 BTC(比特幣),相當於大約10美分。他們讓玩家用這個賭注買下10個籌碼,然後再把全部10個籌碼都押上。我不知道他們為什麼要用這個步驟來混淆視聽。
我原本的牌是 11 點,對面是 3 點,所以我加倍,得到了 3 點。莊家的牌是 5,總共 8 點,然後抽了一張 K,總共 18 點。因此,我以 18 比 14 輸了。
png" />
接下來,我回到公平遊戲面板,確保遊戲公平,因為在我下注之前,牌的順序就已經確定了。步驟如下:
- 從公平遊戲面板中,我們看到伺服器種子是
Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ
。 - 我們對其執行 SHA-256 哈希運算,得到581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6 。
- 我們將步驟 2 中的雜湊值與下注前記錄的「下一個伺服器種子 SHA256」進行比較,並驗證它們是否匹配。如果不匹配,則表示您操作有誤,或賭場在說謊/作弊。在這種情況下,它們匹配。這驗證了牌的順序是預先決定的。
- 要檢查您是否拿到了正確的卡牌,請按順序組合伺服器種子和客戶端種子。這樣您將獲得Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ5v5b85n85vb856nvbn5vbn 。如果您選擇使用隨機數,則該隨機數位於客戶端種子的末尾。
- 取步驟4中合併雜湊值的SHA-512雜湊值。我不知道他們為什麼使用兩個不同的雜湊函數(SHA-256和SHA-512)。這將得到2b87fbc5eac7368ef393c8ab292f71a0251702f6db028ca8a855bfaa541b78df3ae996ad22ac022588a46231ed32180d5bbbde86d
- 取前兩個字元2b ,並將其轉換為十六進位:2b = 2*16 + 11 = 43。
- 由於 43 <= 207,將其轉換為一張牌:rank = mod(43,13) = 4,對應數字 5。 suit = mod(int(43/13),4) = mod(3,4) = 3,對應數字梅花。這是發給玩家的第一張牌,梅花 5。
- 將步驟 4 中的雜湊值前進兩位,即87 。將其從十六進制轉換為十進制:8*16 + 7 = 135。
- 由於 135 <= 207 且尚未找到,因此將其轉換為一張牌:rank = mod(135,13) = 5,對應 6。花色 = mod(int(135/13),4) = mod(10,4) = 2,對應方塊。這是發給玩家的第二張牌,方塊 6。
- 將步驟 4 中的哈希值前進兩位,即fb 。將其從十六進制轉換為十進制:15*16 + 11 = 251。
- 由於 251 > 207,我們跳過這兩個位置。
- 將步驟 4 中的雜湊值前進兩位,即c5 。將其從十六進制轉換為十進制:12*16 + 5 = 197。
- 由於 197 <= 207 且尚未找到,因此將其轉換為一張牌:rank = mod(197,13) = 2,映射到 3 的等級。花色 = mod(int(197/13),4) = mod(15,4) = 3,映射到梅花。這是發給莊家的第一張(面朝上的)牌,即梅花 3。
- 將步驟 4 中的雜湊值前進兩位,即ea 。將其從十六進制轉換為十進制:14*16 + 10 = 234。
- 由於 234 > 207,我們跳過這兩個位置。
- 將步驟 4 中的雜湊值前進兩位,即c7 。將其從十六進制轉換為十進制:12*16 + 7 = 199。
- 由於 199 <= 207 且尚未找到,因此將其轉換為一張牌:rank = mod(199,13) = 4,映射到 5。花色 = mod(int(199/13),4) = mod(15,4) = 3,映射到梅花。這是發給莊家的第二張(面朝下)牌,即梅花 5。
- 將步驟 4 中的雜湊值前進兩位,即36 。將其從十六進制轉換為十進制:3*16 + 6 = 54。
- 由於 54 <= 207 且尚未找到,因此將其轉換為一張牌:rank = mod(54,13) = 2,對應 3。花色 = mod(int(54/13),4) = mod(4,4) = 0,對應黑桃。這張黑桃 3 是牌盒中的下一張牌,在玩家加倍後發給了他。因此,玩家的點數為 5+6+3 = 14
- 將步驟 4 中的雜湊值前進兩位,即8e 。將其從十六進制轉換為十進制:8*16 + 14 = 142。
- 由於 142 <= 207 且尚未找到,因此將其轉換為一張牌:rank = mod(142,13) = 12,對應為 K。花色 = mod(int(142/13),4) = mod(10,4) = 2,對應為方塊。這張方塊 K 是牌盒中的下一張牌,當莊家必須拿到硬 8 時,這張牌會歸莊家所有,最終總點數為 18。
- 選手以 14 比 18 落敗。
- 如果需要更多卡片,我們將繼續循環此過程,直到找到足夠的卡片。
如果覺得步驟太多,我同意。所以我寫了一個 PHP 腳本來幫你完成!使用方法如下:
- 轉到PHP 沙盒。
- 在第 3 行輸入伺服器種子。
- 在第 4 行輸入客戶端種子。
- 在第 5 行輸入下一個伺服器種子的雜湊值。
- 按一下“執行程式碼”。
該程式將把伺服器種子雜湊值與您下注前提供的內容以及遊戲中發出的牌進行比較。
我還有一份程式碼副本,您可以點擊下面的按鈕查看。
[劇透]// Crypto.Games 的二十一點公平性檢查 $server_seed = "Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ"; $客戶端種子 = “5v5b85n85vb856nvbn5vbn”; $next_hash =「581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6」; $rank_array=array("A",2,3,4,5,6,7,8,9,10,"J","Q","K"); $suit_array=array("黑桃","紅心","方塊","梅花"); $cards_found=0; $位置=0; $combined_seed = $server_seed.$client_seed; echo "組合種子 = $combined_seed\n"; $combined_hash = hash('sha512', $combined_seed); echo“組合種子的雜湊值=$combined_hash\n”; 做 { $first_two=substr($combined_hash,$position,2); $hex_to_dec=hexdec($first_two); 如果 ($hex_to_dec <=207) { $重複=0; 如果 ($cards_found>0) { 對於 ($i=0; $i<$cards_found; $i++) { 如果($hex_to_dec == $card_array[$i]) { $重複=1; } } } 如果 ($repeat==0) { $card_array[$cards_found] = $hex_to_dec; $cards_found++; $rank=$hex_to_dec%13; $suit=intdiv($hex_to_dec,13)%4; echo "卡 $cards_found = \t$rank_array[$rank] 的 $suit_array[$suit]\n"; } } $位置+=2; 如果 ($位置==128) { echo“錯誤——哈希中沒有更多空間。\n”; $cards_found=10; } } 當 ($cards_found<20) 時; $server_seed_hash=hash('sha256', $server_seed); 如果 ($server_seed_hash==$next_hash) { echo "伺服器種子符合.\n"; } 別的 { echo“伺服器種子不符!\n”; echo "伺服器種子 =\t$server_seed\n"; echo「伺服器種子雜湊=\t$server_seed_hash\n」; echo“所謂的下一個哈希=\t$next_hash\n”; } // 程式 // 1. 將「步長」設為 0,並將「位置」設為 0。 // 2. 依序加入伺服器和客戶端種子、步驟和伺服器種子。 // 3. 產生步驟 2 字串的 SHA-512 雜湊值。 // 4. 從步驟 3 中的雜湊「位置」開始,將前兩個字元從十六進位轉換為十進位。 // 5. 如果步驟 4 的結果為 0 到 207,則將其對應到四副牌盒中的特定牌。 // 6. 如果步驟 5 的結果已經出現,那麼這將是遊戲中下一張要發的牌。 // 7. 若要將步驟 6 中的卡片位置轉換為實際卡片,請執行以下操作: // A. 將步驟 4 的結果除以 13 並取餘數。 // B. 將步驟 7A 的結果映射得到排名,如下:0 到 A,1 到 2,2 到 3,…,9 到 10,10 到 J,11 到 Q,12 到 K。 // C. 將步驟 4 的結果除以 13,然後刪除餘數。 // D. 將步驟 7C 的結果除以 4 並取餘數。 // E. 將步驟 7D 的結果對應為花色,如下所示:0 為黑桃,1 為紅桃,2 為方塊,3 為梅花。 // 8. 繼續重複步驟 4 到 7,直到到達哈希的末尾,儘管遊戲中不太可能需要這麼多卡片。 ? >[劇透]