// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
contract BetGame {
//GM
address public owner;
bool isFinshed;
//紀錄玩家用的 struct
struct Player {
address payable addr;
uint amount;
}
//存下大的玩家
Player[] big;
//存下小的玩家
Player[] small;
//下大的總金額
uint totalBig;
//下小的總金額
uint totalSmall;
uint nowtime;
constructor () {
owner = msg.sender;
totalSmall = 0;
totalBig = 0;
isFinshed = false;
nowtime = block.timestamp;
}
function Bet(bool flag)public payable returns (bool){
require(msg.value>0);
Player memory p = Player(payable(msg.sender),msg.value);
//透過bool true 表示下大
if (flag){
big.push(p);
totalBig += p.amount;
}
else {
small.push(p);
totalSmall += p.amount;
}
return true;
}
function open() payable public returns(bool){
//開獎至少要遊戲開始後60秒
require(block.timestamp > nowtime+60);
require(!isFinshed);
//創造出 0-9的變數 0-4為小 5-9為大
uint points = uint(keccak256(abi.encode(msg.sender,block.timestamp,block.number)))%9;
uint i = 0;
Player memory p;
if (points >=5 ){
for (i=0; i<big.length; i++){
p = big[i];
//給贏家 下注本金+照比例分配獎金
p.addr.transfer(p.amount+totalSmall*p.amount/totalBig);
}
}
else{
for(i = 0 ;i< small.length;i++){
p = small[i];
p.addr.transfer(p.amount+totalBig*p.amount/totalSmall);
}
}
isFinshed = true;
return true;
}
}
可以想像其實每一檔的活動的智能合約都要有開關來當判定比較好。
constructor 一樣部屬智能合約時給定一次性參數
Player memory p = Player(payable(msg.sender),msg.value);
big.push(p);
small.push(p);
這裏會發現 Player 紀錄參與人的資訊,然後記錄到 押大 or 押小
(試著想像紀錄一個大 或 小的地方)
還可以看到 memory 這個修飾詞,通常是區域變數,標示出來可以讓合約更了解我們的型態
當然這個合約還有可以改善的地方,例如for 的部分可以改變一下使用Map →(address ⇒ Player)
然後直接指定address 查詢較有效率。
有任何問題可反饋: [email protected]