Let's move - Sui 骰子猜大小游戏实现

  • stom698
  • 更新于 2024-03-28 16:23
  • 阅读 1071

本文转自本人微信公众号的文章,所以带有wx水印,希望大家能理解一下。后续新文会自己留存不带水印。

1.1 游戏设计

参考于三个骰子猜大小游戏

设计三个骰子参数为随机数,然后其和的值4至10称作小,11至17为大。

新建random.move,用来生成随机数。

module sicbogame::random{
    use std::hash;
    use std::vector;
​
    use sui::bcs;
    use sui::object;
    use sui::tx_context::TxContext;

    const ERR_HIGH_ARG_GREATER_THAN_LOW_ARG: u64 = 101;
​
    fun seed(ctx: &mut TxContext): vector<u8> {
        let ctx_bytes = bcs::to_bytes(ctx);
        let uid = object::new(ctx);
        let uid_bytes: vector<u8> = object::uid_to_bytes(&uid);
        object::delete(uid);
​
        let info: vector<u8> = vector::empty<u8>();
        vector::append<u8>(&mut info, ctx_bytes);
        vector::append<u8>(&mut info, uid_bytes);
​
        let hash: vector<u8> = hash::sha3_256(info);
        hash
    }
​
    fun bytes_to_u64(bytes: vector<u8>): u64 {
        let value = 0u64;
        let i = 0u64;
        while (i < 8) {
            value = value | ((*vector::borrow(&bytes, i) as u64) << ((8 * (7 - i)) as u8));
            i = i + 1;
        };
        return value
    }
​
    /// Generate a random u64
    fun rand_u64_with_seed(_seed: vector<u8>): u64 {
        bytes_to_u64(_seed)
    }
​
    /// Generate a random integer range in [low, high).
    fun rand_u64_range_with_seed(_seed: vector<u8>, low: u64, high: u64): u64 {
        assert!(high > low, ERR_HIGH_ARG_GREATER_THAN_LOW_ARG);
        let value = rand_u64_with_seed(_seed);
        (value % (high - low)) + low
    }
​
    /// Generate a random u64
    public fun rand_u64(ctx: &mut TxContext): u64 {
        rand_u64_with_seed(seed(ctx))
    }
​
    /// Generate a random integer range in [low, high).
    public fun rand_u64_range(low: u64, high: u64, ctx: &mut TxContext): u64 {
        rand_u64_range_with_seed(seed(ctx), low, high)
    }
​
​
}

然后新建sicbogame.move,来制定游戏规则。

module sicbogame::sicbogame{
    use std::vector;
    use sui::event;
    use sui::tx_context::{ TxContext};
    use std::string;
    use sicbogame::random;
​
    const ERROR_INPUT_NUM :u64 = 1;
​
    struct Result has copy,drop {
        msg: string::String
    }
​
​
    public entry fun create_game(input_num: u64, ctx: &mut TxContext){
​
        assert!((input_num != 1 || input_num !=0), ERROR_INPUT_NUM);
​
        let dice1 = random::rand_u64_range(1, 6, ctx);
        let dice2 = random::rand_u64_range(1, 6, ctx);
        let dice3 = random::rand_u64_range(1, 6, ctx);
        let dice = dice1 + dice2 + dice3;
​
        let resp;
​
        if (input_num == 0) {
            if (dice >= 4 && dice <= 10) {
                resp = b"You Win :)";
            } else {
                resp = b"You Lose :(";
            }
        }
        else if (input_num == 1) {
            if (dice >= 11 && dice <= 17) {
                resp = b"You Win :)";
            } else {
                resp = b"You Lose :(";
            }
        } else {
            resp = b"Invalid input number";
        };

        event::emit(Result{msg: string::utf8(resp)});
    }
​
​
    #[test_only]
    public fun test_game(ctx: &mut TxContext) {
        let input_num = 0;
        create_game(input_num,ctx);
    }
​
}

1.2 部署合约

sui client publish --gas-budget 100000000 --skip-dependency-verification
│  ┌──                                                                                             │
│  │ PackageID: 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f                 │
│  │ Version: 1                                                                                    │
│  │ Digest: GVMBTupzMH5weX5hAuSRiWuB6wTxj9obzEdH3dLZHUPM                                          │
│  │ Modules: random, sicbogame                                                                    │
│  └──         

然后猜大小,根据合约中的规则,传入0为猜小,传入1为猜大。

下面猜大,然后通过event获取结果为赢。

sui client call --package 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f --module sicbogame --function create_game --args 1 --gas-budget 10000000
Transaction Digest: CT4xf89srjuUz2exEkuwDMXHzFibT6DX3V7XYshGPD4F
​
╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Block Events                                                                            │
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
│  ┌──                                                                                                │
│  │ EventID: CT4xf89srjuUz2exEkuwDMXHzFibT6DX3V7XYshGPD4F:0                                          │
│  │ PackageID: 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f                    │
│  │ Transaction Module: sicbogame                                                                    │
│  │ Sender: 0x772b31a5738f0ceb70d313c7f1361bb1a9fa9732f9f1c9255cb191a592cbf988                       │
│  │ EventType: 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f::sicbogame::Result │
│  │ ParsedJSON:                                                                                      │
│  │   ┌─────┬────────────┐                                                                           │
│  │   │ msg │ You Win :) │                                                                           │
│  │   └─────┴────────────┘                                                                           │
│  └──                                                                                                │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯

再猜一次大,通过event获取结果为输。

Transaction Digest: B2L7t4HibAmE1ZeLqpEv3Hvovr2tQqJomdwD8QnEPDVV
​
╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Block Events                                                                            │
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
│  ┌──                                                                                                │
│  │ EventID: B2L7t4HibAmE1ZeLqpEv3Hvovr2tQqJomdwD8QnEPDVV:0                                          │
│  │ PackageID: 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f                    │
│  │ Transaction Module: sicbogame                                                                    │
│  │ Sender: 0x772b31a5738f0ceb70d313c7f1361bb1a9fa9732f9f1c9255cb191a592cbf988                       │
│  │ EventType: 0x4047ca9d7990e25abe3dea249e54eb5ed079212dd976f1ccc30700a96d01608f::sicbogame::Result │
│  │ ParsedJSON:                                                                                      │
│  │   ┌─────┬─────────────┐                                                                          │
│  │   │ msg │ You Lose :( │                                                                          │
│  │   └─────┴─────────────┘                                                                          │
│  └──                                                                                                │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯

参考链接:

伪随机数:https://github.com/chrisyy2003/ctf-writeup/blob/main/MoveCTF/simple_game/sources/random.move

Sui move_cn社交账号

telegram: https://t.me/move_cn

X(twitter): https://twitter.com/move_cn

QQ群: 79489587

微信公众号:Move中文

Sui中文开发群: https://t.me/sui_dev_cn

  • 原创
  • 学分: 7
  • 分类: Sui
  • 标签:
点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
5 订阅 9 篇文章

0 条评论

请先 登录 后评论
stom698
stom698
0x06CC...099B
努力提升