如何使用 Rust !ink 在 Aleph Zero 上创建 P2P 井字游戏智能合约;首先要理解 psp22 标准
作者:互联网
显然,五分之二的人都知道“井字棋”虽然游戏,根据公众的判断、方向、地点或选择,可以用不同的名字来称呼。
[package]
name = "tic_tac_toe"
version = "0.8.0"
authors = [ "YOUR_NAME
edition = "2021"
overflow-checks = false
[dependencies]
# 导入所有墨水!板条箱
ink_primitives = { version = "~3.3.0" , default-features = false }
ink_metadata = { version = "~3.3.0" , default-features = false , features = [ "derive" ],
"~3.3.0" , default-features = false }
ink_storage = { version = "~3.3.0" , default-features = false }
ink_lang = { version = "~3.3.0" , default-features = false }
ink_prelude = { version = "~3.3.0" , default-features = false }
ink_engine = { version = "~3.3.0" , default-features = false , optional = true }
scale = { package = "parity-scale-codec " , 版本 = "3" ,默认功能=假, features = [ "derive" ] }
scale-info = { version = "2" , default-features = false , features = [ "derive" ], optional = true }
openbrush = { version = "~2.2.0" , default-features = false , features = [ "psp22" ] }
[lib]
overflow-checks = false
name = "tic_tac_toe"
path = "lib.rs"
crate-type = [
# 用于普通合约 Wasm blob。
“cdylib”
]
[配置文件。
= false
[features]
default = [ "std" ]
std = [
"ink_primitives/std" ,
"ink_metadata" ,
"ink_metadata/std" ,
"ink_env/std" ,
"ink_storage/std" ,
"ink_lang/std" ,
" scale/std" ,
"scale-info" ,
"scale-info/std" ,
# Brush dependency
"openbrush/std" ,
请注意,本文提供的源代码未经批准,存在漏洞;仅用于教育目的,仅供参考。
如果你从未听说过井字游戏,它是一种棋盘游戏,有3种棋盘游戏,x3格方形网格(根据玩家的爱好可能会有更多的数量,比如6x6,10x10等)每个玩家应用两个角色进行游戏,一般是“X”和“O”。
玩家可以将相关角色插入(制作)到空单元格中移动,以建立标准、对角度或垂直图案,并避免对手做同样的事情,以及他们的智慧赢得完整的线而不受阻碍。对于每一轮,如果没有赢家(即所有的槽都被填满,但没有玩家制作有效的图案),游戏被标记为平局,并开始新一轮。
从下图可以看出,分配“X”所有三轮标记的玩家都是赢家(忽略)“O”没有玩完整轮的事实;玩家二是傻瓜)。
在这个例子中,两个玩家也会玩一定数量的游戏。赢家拿走了所有的钱,比赛结束了,但如果是平局,他们会把钱还给对方,比赛就结束了。每场比赛结束后,旗盘将被重置。
构造器
接下来我们要做的就是做的“TicTacToe”构造以后的“tic_tac_toe”在模块完成过程中定义构造函数,在安排我们的智能合同时启用,以复位我们想要注册的一些值,默认进入。
我们想定义玩家的地址,游戏中常用的地址PSP22货币,他们的标记及其给出的游戏下注额度。
let me = ink_lang::utils:: initialize_contract (|contract: & mut Self | {
let board = vec! [ 0 ; 9 ]; //空数组
contract.board = board; //设置 board 为空状态
contract.staking_token = staking_token; //设置质押代币
contract.stake_amount = stake_amount; //设置质押金额
assert! (player_one != player_two); //地址不能相同
assert! (player_one_symbol != player_two_symbol); //符号必须是不同的
断言!((player_one_symbol ==1 || player_one_symbol == 2 ) && (player_two_symbol == 1 || player_two_symbol == 2 )); //符号必须是 1 或 2
contract.player_one = player_one; //设置玩家一地址
contract.player_two = player_two; //设置玩家两个地址
contract.symbols. 插入(player_one, &player_one_symbol); //设置玩家一符号
contract.symbols. 插入(player_two,&player_two_symbol);//设置玩家两个符号
contract.turn = player_one; //初始化轮到玩家一
});
在这个例子中,我们将0作为空单元格,1作为空单元格X,将2做为O。我们还将应用0到8来表示电路板的单元格,从左上角到右下角,这意味着左上角的单元格为0,右下角的单元格为8,中心的单元格为5。
从上到下分析上面的代码,我们可以看到创建了一个空数组,每个人都通过它将0插入从0到8的每个索引,这意味着一开始是一个空板。
货币及其质押金额也按其基本参数质押。
我们需要确保玩家1没有使用与玩家2相同的地址,并且没有分配相同的标记(仅限于1和2)。应用程序提供的基本参数玩家1和玩家2地址。
然后,您还将两个玩家选择的标记插入投影中,以他们的地址为键,选择的标记为键u64类别的值。
然后我们最终将玩家1设置为第一个转弯。