dApp《BlackJack》申请上线
-
1.dApp的名称:二十一点/Black Jack
2.dApp的介绍:
简介:
黑杰克,也称为 21 点,是世界上最受欢迎的游戏之一。黑杰克是一种玩家与庄家对阵的纸牌游戏。黑杰克使用一副扑克牌进行游戏。规则:
玩家的目标是使自己的手牌分数达到 21 点,或达到一个比庄家更高且不超过 21 点的分数。开始时,玩家向桌上投放赌注,庄家为玩家分配两张牌。J、Q 和 K 每张按 10 点计分。A 对于庄家和玩家均按 1 点或 11 点计分。其他纸牌均按纸牌上所显示的对应数值计分。
得到初始的两张牌后,将两张牌所代表的数值相加。之后玩家可以选择“加牌”以获得更多的牌,或选择“停牌”并停止获得新的牌。在指定的回合中,玩家或庄家达到 21 点或分数小于 21 点但大于对方即为胜。得分高于 21 点(称为“爆牌”)即为败。如庄家爆牌,玩家手牌分数为任何小于 21 点的分数,则玩家胜。
如相加后庄家和玩家手牌分数相等,则该局为和局并称为“push”。和局中玩家不会赢得或输掉任何筹码。
玩家操作:
以下是初始两张牌分发后玩家可采取的操作的列表:要牌: 从庄家处得到一张牌。
开牌: 保留现有手牌数,不再加牌。
投降: 如果发牌后您不想继续玩了,可以选择放弃。当玩家选择放弃时,庄家赢得玩家所下注的赌金的一半,而另一半则返还给玩家。
3.上线状态: 否
4.dApp的合约地址: vite_2755a753c3db610a3f910b35b10e6166f7440b8b705a723ee4
5.合约代码如下:
pragma soliditypp ^0.4.3; contract ViteBet{ address owner; struct GameData { tokenId tkid; uint256 betAmount; bool isStart; uint256 cardsOnTable; uint256 playerCards; uint256 playerSum; uint256 npcCards; uint256 npcSum; } mapping(address => GameData) public gameDataMap; event blackjack(address indexed addr, uint256 playerCards, uint256 npcCards, uint8 result, uint256 reward); constructor() public { owner = msg.sender; } onMessage () payable { } onMessage DrawMoney(uint256 amount) { require(owner == msg.sender); msg.sender.transfer(msg.tokenid, amount); } onMessage startGame() payable { require(msg.amount > 0 && msg.amount <= 1000000000000000000000); gameDataMap[msg.sender].betAmount = msg.amount; gameDataMap[msg.sender].isStart = true; gameDataMap[msg.sender].cardsOnTable = 0; gameDataMap[msg.sender].tkid = msg.tokenid; gameDataMap[msg.sender].playerCards = 0; gameDataMap[msg.sender].playerSum = 0; gameDataMap[msg.sender].npcCards = 0; gameDataMap[msg.sender].npcSum = 0; uint256 card1 = giveCard(msg.sender,true); uint256 card2 = giveCard(msg.sender,true); uint256 card3 = giveCard(msg.sender,false); uint256 sum = calculateSum(gameDataMap[msg.sender].playerCards,gameDataMap[msg.sender].playerSum); if(sum == 21) autoFinishGame(msg.sender,0); else emit blackjack(msg.sender,gameDataMap[msg.sender].playerCards,gameDataMap[msg.sender].npcCards, 0 , 0); } onMessage gameAction(uint8 action) { require(gameDataMap[msg.sender].isStart); uint8 result; if(action == 11){ uint256 card = giveCard(msg.sender,true); uint256 sum = calculateSum(gameDataMap[msg.sender].playerCards,gameDataMap[msg.sender].playerSum); if(sum < 21){ emit blackjack(msg.sender,gameDataMap[msg.sender].playerCards,gameDataMap[msg.sender].npcCards, 0 , 0); return; }else if(sum > 21) result = 2; }else if(action == 14) result = 4; autoFinishGame(msg.sender, result); } function autoFinishGame(address addr,uint8 result) public { uint256 transferAmount; if(result == 0){ uint256 npcSum = calculateSum(gameDataMap[addr].npcCards,gameDataMap[addr].npcSum); while (npcSum < 17){ giveCard(addr,false); npcSum = calculateSum(gameDataMap[addr].npcCards,gameDataMap[addr].npcSum); } uint256 playerSum = calculateSum(gameDataMap[addr].playerCards,gameDataMap[addr].playerSum); if (playerSum > 21) result = 2; else if (npcSum > 21) result = 1; else if (playerSum == npcSum) result = 3; else result = playerSum > npcSum ? 1 : 2; if(result == 1) transferAmount = gameDataMap[addr].betAmount * 19 / 10; else if(result == 3) transferAmount = gameDataMap[addr].betAmount; }else if(result == 4){ transferAmount = gameDataMap[msg.sender].betAmount / 2; } gameDataMap[addr].isStart = false; if(transferAmount > 0) addr.transfer(gameDataMap[addr].tkid,transferAmount); tokenId vgc = "tti_3ccb0fe9845a720b65039e9e"; addr.transfer(vgc, gameDataMap[msg.sender].betAmount * 5 / 100); emit blackjack(addr,gameDataMap[addr].playerCards,gameDataMap[addr].npcCards, result , transferAmount); } function giveCard(address addr,bool toPlayer) public returns(uint256) { uint256 card; uint256 retCard; (gameDataMap[addr].cardsOnTable,card) = nextCard(gameDataMap[addr].cardsOnTable); retCard = card; card = (card % 13); uint256 toAdd; if (card >= 9) toAdd = 10; else toAdd = card + 1; if(toPlayer){ gameDataMap[addr].playerCards |= ( 1 << retCard); gameDataMap[addr].playerSum += toAdd; }else{ gameDataMap[addr].npcCards |= ( 1 << retCard); gameDataMap[addr].npcSum += toAdd; } return retCard; } function nextCard(uint256 cardsOnTable) public returns(uint256,uint256) { //uint64 index = nextrandom(); uint64 index = random64(); index = index % 52; uint256 card = 0; for (uint8 i = 0; i < 52; ++i){ index = (index + i) % 52; uint256 j = (1 << index); if ((cardsOnTable & j) == 0){ card = index; cardsOnTable = cardsOnTable | j; break; } } return (cardsOnTable,card); } function calculateSum(uint256 cards,uint256 sum) public returns(uint256) { bool hasAcer = ((cards & (1 << 0)) !=0) || ((cards & (1 << 13)) !=0) || ((cards & (1 << 26)) !=0) || ((cards & (1 << 39)) !=0); if (hasAcer && (sum + 10) <= 21) return sum + 10; return sum; } }