参考于https://ke.qq.com/webcourse/2379017/103111126#taid=10365401060101385&vid=5285890802017890711
1. 案例功能介绍
- 平台方部署智能合约,用户选择下大或者下小。
- 智能合约指定游戏规则,利用简单的随机数实现。
2. 具体的代码如下
pragma solidity ^0.6.1;
struct User{
address payable addr;
uint256 amount;
}
contract bocai_demo{
User[] bigs;//下大
User[] smalls;//下小
address admin;//平台方地址
bool isFinshed;//是否结束标志
uint256 outtimes;//截止时间
uint256 bigTotalAmount;//下注为大的总金额
uint256 smallTotalAmount;//下注为小的总金额
uint256 result;//开奖结果
constructor() public{
admin = msg.sender;
isFinshed = false;
outtimes = now+120;//下注规定一分钟
bigTotalAmount=0;
smallTotalAmount=0;
}
//下注
function bet(bool flag) public payable{
require(msg.value>0,"msg.value must >0");
require(!isFinshed,"game must not finshed");
require(now <= outtimes,"time not out");
if(flag){
//下大
User memory user = User(msg.sender,msg.value);
bigs.push(user);
bigTotalAmount+=msg.value;
}else{
//下小
User memory user = User(msg.sender,msg.value);
smalls.push(user);
smallTotalAmount+=msg.value;
}
}
//开奖
function open() public payable{
require(!isFinshed,"only open once");
require(outtimes<=now,"time must ok");
//计算下注是大还是小,制定游戏规则
isFinshed=true;
//随机生成0-18以内的数,0-9:小 10-17:大
result = uint256(keccak256(abi.encode(msg.sender,now,outtimes,admin,smalls.length)))%18;
//派奖
User memory user;
if(result<9){
//下注小赢
for(uint256 i = 0;i < smalls.length;i++){
user=smalls[i];
//赢取下大总金额的90%的钱
uint256 amount = bigTotalAmount * user.amount / smallTotalAmount *90 /100 + user.amount;
user.addr.transfer(amount);
}
}else{
//下注大赢
for(uint256 i=0;i<bigs.length;i++){
user=bigs[i];
//赢取下小总金额的90%的钱
uint256 amount = smallTotalAmount * user.amount / bigTotalAmount *90 /100 +user.amount;
user.addr.transfer(amount);
}
}
}
//获取总钱数以及部署该合约的剩余的钱
function getBalance() external view returns(uint256,uint256,uint256){
return (bigTotalAmount,smallTotalAmount,address(this).balance);
}
//获取最终游戏的结果
function getResult() external view returns(string memory){
require(isFinshed,"bet must finshed");
if(result<9){
return "small";
}else{
return "big";
}
}
}
3. 测试步骤如下
- 选取7个账户地址,1个用户部署合约,充当平台方角色,其余6个作为下注用户。
- 按照上图所示输入下注的金额以及大(true)/小(false)
- 这是每一次测试时账户地址余额变换的截图
- 游戏结束之后,进行开奖,最终胜利的是下注为大的,将获取下注为小的总金额的90%的奖励