Solidity 智能合约基础案例 菠菜游戏(押大小)(2023版)

案例业务:智能“菠菜”游戏(押大小)

需要实现的核心功能:

  • 下注
  • 派奖

角色:

  • 平台方
  • 赌徒

平台方操作:

  • 发布合约
  • 坐等开奖收钱

赌徒操作:

  • 下注
  • 开奖

具体代码实现如下:

// 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);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值