solidity经典案例----智能小游戏

参考于https://ke.qq.com/webcourse/2379017/103111126#taid=10365401060101385&vid=5285890802017890711

1. 案例功能介绍

  1. 平台方部署智能合约,用户选择下大或者下小。
  2. 智能合约指定游戏规则,利用简单的随机数实现。

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. 测试步骤如下

  1. 选取7个账户地址,1个用户部署合约,充当平台方角色,其余6个作为下注用户。
    solidity经典案例----智能小游戏_第1张图片
  2. 按照上图所示输入下注的金额以及大(true)/小(false)
    solidity经典案例----智能小游戏_第2张图片
  3. 这是每一次测试时账户地址余额变换的截图solidity经典案例----智能小游戏_第3张图片
  4. 游戏结束之后,进行开奖,最终胜利的是下注为大的,将获取下注为小的总金额的90%的奖励
    solidity经典案例----智能小游戏_第4张图片

你可能感兴趣的:(solidity,区块链)