案例业务:智能“菠菜”游戏(押大小)
需要实现的核心功能:
角色:
平台方操作:
赌徒操作:
具体代码实现如下:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
struct Player{ //定义结构体记录玩家地址和下注金额;
address addr;
uint256 amount;
}
contract bocai{
Player[] bigs; //下注为大的玩家
Player[] smalls; //下注为小的玩家
uint256 public totalBigAmount; //下注为大的总金额;
uint256 public totalSmallAmount; //下注为小的总金额;
address public owner; //管理员地址;
bool public isFinished; //游戏是否结束;
uint256 minBetAmount; //下注最小金额
uint256 public endTime; //下注结束时间
constructor(uint256 _min,uint256 _end){
owner = msg.sender;
isFinished = false;
minBetAmount = _min;
endTime = block.timestamp + _end; //下注结束时间为当前时间加上游戏持续时间;
}
//isBig = true,big;false,small:当玩家下注为大时是true,下注为小时是false;
function bet(bool isBig) public payable{ //下注
require(!isFinished,"game must not finished!"); //保证游戏没有结束
require(msg.value>=minBetAmount,"bet's must > min"); //下注的金额必须大于最小金额
require(block.timestamp<= endTime,"block.timestamp must <= endTime"); //下注的时间必须在游戏时间之内;
if(isBig){
//big
Player memory player = Player(msg.sender,msg.value);
bigs.push(player);
totalBigAmount+=msg.value;
}else{
//else
Player memory player = Player(msg.sender,msg.value);
smalls.push(player);
totalSmallAmount+=msg.value;
}
}
//按照下注金额分配;
function open()public payable{ //开奖
require(!isFinished,"game must not finished!");
require(block.timestamp<= endTime,"block.timestamp must <= endTime");
//计算0-17的随机数,有大的集合和小的集合;
uint256 random = uint256(keccak256(abi.encode(block.timestamp,owner,totalBigAmount)))%18;
if(random<9){
//small,big money give small;bonus=本金+奖金(totalBigAmount*amount/totalBigAmount);
for(uint256 i=0;i<smalls.length;i++){
Player memory player = smalls[i];
uint256 bonus= player.amount + totalBigAmount * player.amount / totalSmallAmount* 90 / 100 ; //平台方抽10个点;
payable(player.addr).transfer(bonus); //将金额传给下注者账户;
}
payable(owner).transfer(totalBigAmount*10/100);
}else{
for(uint256 i=0;i<bigs.length;i++){
Player memory player = bigs[i];
uint256 bonus= player.amount + totalSmallAmount * player.amount / totalBigAmount* 90 / 100 ; //平台方抽10个点;
payable(player.addr).transfer(bonus); //将金额传给下注者账户;
}
payable(owner).transfer(totalSmallAmount*10/100);
}
}
function getBalance()public view returns(uint256,uint256){
return (address(this).balance, totalBigAmount+totalSmallAmount);
}
}