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个作为下注用户。
    在这里插入图片描述
  2. 按照上图所示输入下注的金额以及大(true)/小(false)
    在这里插入图片描述
  3. 这是每一次测试时账户地址余额变换的截图在这里插入图片描述
  4. 游戏结束之后,进行开奖,最终胜利的是下注为大的,将获取下注为小的总金额的90%的奖励
    在这里插入图片描述
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟逆袭之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值