Alva

Alva

programmer
github
telegram
email

Let's Move - 学 Move 得 Sui(四):完成一个游戏的上链部署

letsmove

Let's Move 一项学 Move 获得 SUI 的激励计划,鼓励更多的人学习 Move 语言

学习日志 (alva-lin)

タスク 4 - ゲームのデプロイ(mainnet)#

タスク

  • チェーンゲームに関する知識の学習を完了する

  • ランダム数の学習を完了する

  • コントラクト内での Coin の保存方法の学習を完了する

  • 最初のゲームコントラクトをメインネットにデプロイする

このタスクでは、シンプルなゲームである「じゃんけん」を選択しました。このゲームは、単一のプレーヤーがプレイし、ランダムな操作を生成するコンピュータと対戦します。ランダム数のソースとして、グローバルクロックを使用します。

コード#

module new_gaming::rock_paper_scissors {
    use std::string::{Self, String};
    use sui::clock::{Self, Clock};
    use sui::event;

    const EInvalidNumber: u64 = 1;

    struct GamingResultEvent has copy, drop {
        is_win: bool,
        your_choice: String,
        computer_choice: String,
        result: String,
    }

    fun get_random_choice(clock: &Clock) : u8 {
        ((clock::timestamp_ms(clock) % 3) as u8)
    }

    fun map_choice_to_string(choice: u8) : String {
        if (choice == 0) {
            string::utf8(b"rock")
        } else if (choice == 1) {
            string::utf8(b"paper")
        } else if (choice == 2) {
            string::utf8(b"scissors")
        } else {
            string::utf8(b"Invalid")
        }
    }

    public fun play(choice: u8, clock: &Clock) {
        assert!(choice < 3, EInvalidNumber);

        let computer_choice = get_random_choice(clock);
        let (result, is_win) = if (
            (choice == 0 && computer_choice == 1)
            || (choice == 1 && computer_choice == 2)
            || (choice == 2 && computer_choice == 0)
        ) {
            (string::utf8(b"Win"), true)
        } else if (choice == computer_choice) {
            (string::utf8(b"Draw"), false)
        } else {
            (string::utf8(b"Lose"), false)
        };

        event::emit(GamingResultEvent {
            result,
            is_win,
            your_choice: map_choice_to_string(choice),
            computer_choice: map_choice_to_string(computer_choice),
        });
    }
}

ランダム数#

コードでは、sui::clock::Clockを使用してランダム数を生成しています。

対応するソースコード clock.move を見つけることができます。そこには、Clock がシングルトン共有オブジェクトであり、Move の呼び出しに時間を提供することを説明するコメントがあります。このオブジェクトのアドレスは 0x6 であり、エントリーポイント関数のみが取得できます(不変の参照を介してアクセス)

Move では、オブジェクトはアドレスです。つまり、Clock を渡す必要がある場合は、そのアドレス 0x6 を使用して Clock オブジェクトを渡すだけです。

プッシュと呼び出し#

パッケージの公開プロセスをスキップして、メソッドを呼び出します。

# すでに公開されたパッケージを使用することもできます
# export PACKAGE_ID=0xf968242b22a4f05b62847688c4071aa82c8c97c6a39f08b4b2f12cd7f662cdff
sui client call --gas-budget 7500000 --package $PACKAGE_ID --module rock_paper_scissors --function play --args 0 0x6

出力を得ることができます。ゲームの結果をイベントに直接書き込んだため、結果の内容が明確にわかります。メソッドを複数回呼び出すと、computer_choice の変化と result の正しい計算が確認できます。

このトランザクションを SuiScan で確認することもできます。

# トランザクションハッシュ
Transaction Digest: 61QxmsdND2t9yCSGFYXPAGH3LRJH3gYb1TuggBpbuHFX

# イベントの内容
╭──────────────────────────────────────────────────────────────────╮
│ Transaction Block Events                                         │
├──────────────────────────────────────────────────────────────────┤
│  ┌──                                                             │
│  │ EventID: 61QxmsdND2t9yCSGFYXPAGH3LRJH3gYb1TuggBpbuHFX:0
│  │ PackageID: 0xf968242b2XXXXXXXXXXX662cdff                      │
│  │ Transaction Module: rock_paper_scissors                       │
│  │ Sender: 0xb31fcf5cXXXXXXXXa6965c57f48                         │
│  │ EventType: 0xf9682....2cdff::rock_.._ssors::GamingResultEvent │
│  │ ParsedJSON:                                                   │
│  │   ┌─────────────────┬───────┐                                 │
│  │   │ computer_choice │ rock  │                                 │
│  │   ├─────────────────┼───────┤                                 │
│  │   │ is_win          │ false │                                 │
│  │   ├─────────────────┼───────┤                                 │
│  │   │ result          │ Draw  │                                 │
│  │   ├─────────────────┼───────┤                                 │
│  │   │ your_choice     │ rock  │                                 │
│  │   └─────────────────┴───────┘                                 │
│  └──                                                             │
╰──────────────────────────────────────────────────────────────────╯
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。