Let's Move Sui环形掌上战争 0基础开发入门到精通(4)

  • Summer.XJ
  • 更新于 2024-03-28 16:32
  • 阅读 174

Sui环形掌上战争0基础开发入门到精通(4)游戏币的使用环形掌上战争既然是游戏,那么游戏币就是必不可少的.sui平台提供了很好的游戏代币的框架功能供开发者使用.1.游戏币的创建funinit(witness:HBCOIN,ctx:&mutTxContext){le

<!--StartFragment-->

Sui环形掌上战争 0基础开发入门到精通(4)

游戏币的使用

环形掌上战争既然是游戏,那么游戏币就是必不可少的. sui平台提供了很好的游戏代币的框架功能供开发者使用.

1.游戏币的创建

fun init(witness:HBCOIN,ctx:&mut TxContext){
        let (treasury, metadata) = 
            coin::create_currency(witness, 9, b"HbCoin", b"HbCoin", b"Hb Coins", option::none(), ctx);

        transfer::public_freeze_object(metadata);
        transfer::public_transfer(treasury, tx_context::sender(ctx))
    }

这里我们创建了一个精度为9的游戏币,名字是HbCoin,代号是HBCOIN,描述是Hb Coins. metadata 是一个元数据,里面包含了游戏币的详细信息 treasury 可以理解为游戏币的发行者,这里我们直接把游戏币的发行权交给创建者. treasury具体形式是一个object已经传送给了创建者.

初始化代币

public entry fun init_coin(ctx: &mut TxContext) {
        let zero_coin = coin::zero&lt;HBCOIN>(ctx);
        transfer::public_transfer(zero_coin, sender(ctx));
    }

代币的铸造

public fun mint(
    treasury_cap: &mut TreasuryCap&lt;HBCOIN>, 
    amount: u64, 
    recipient: address, 
    ctx: &mut TxContext,
    ) {
        let coin = coin::mint(treasury_cap, amount, ctx);
        transfer::public_transfer(coin, recipient)
    }

发送奖励给玩家

先准备一个结构体

struct TranscriptRequestEvent has copy, drop {
        // The Object ID of the transcript wrapper
        wrapper_id: u64,
        // The intended address of the transcript
        intended_address: address,
    }

然后写一个发送的函数

public entry fun transfer_to_other(user:u64,nowCoin:Coin&lt;HBCOIN>,to:address){
        event::emit(
            TranscriptRequestEvent{
                wrapper_id:user,
                intended_address:to
            }
        );
        transfer::public_transfer(nowCoin,to);
    }

游戏逻辑的判断

之前章节提到Cast 策略, 是游戏的核心玩法 石头 剪刀 布 只有这三种策略是被接受的 所以要对输入的策略进行过滤

fun isCast(tcast:String):bool{
        let mat = *std::string::bytes(&tcast);
        if(CastRock == mat || CastPaper == mat || CastScissors == mat){
            return true
        }
        else{
            return false
        }
    }

这里利用常量进行字符串判断校验,确保策略的合法性

完整的判断逻辑

public fun new_logic(at_cast:String,df_cast:String) : u64{

        let ret = CLoss;
        let mat = *std::string::bytes(&at_cast);
        let mdf = *std::string::bytes(&df_cast);
        if( mat == mdf){
            ret = CDraw;
        };
        // Rock > Scissors > Paper > Rock
        if( CastRock == mat && CastScissors == mdf){
            ret = CWin;
        };
        if( CastRock == mat && CastPaper == mdf){
            ret = CLoss;
        };
        if( CastScissors == mat && CastPaper == mdf){
            ret = CWin;
        };
        if( CastScissors == mat && CastRock == mdf){
            ret = CLoss;
        };
        if( CastPaper == mat && CastRock == mdf){
            ret = CWin;
        };
        if( CastPaper == mat && CastScissors == mdf){
            ret = CLoss;
        };
        ret
    }

这里把所有的可能进行判断,返回一个u64的数值 然后通过完整的testcase进行测试

print(&new_logic(
            utf8(CastPaper),
            utf8(CastPaper)
            )
            );
        print(&new_logic(
            utf8(CastPaper),
            utf8(CastRock),
            )
            );   
        print(&new_logic(
            utf8(CastRock),
            utf8(CastScissors),
            )
            );

这样就基本做到万无一失了

(未完待续)

telegram: https\://t.me/move_cn

QQ群: 79489587

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Summer.XJ
Summer.XJ
0x0d54...9e80
学好MOVE 光宗耀祖