数据库
首页 > 数据库> > 如何使用 Rust !ink 在 Aleph Zero 上创建 P2P 井字游戏智能合约;首先要理解 psp22 标准

如何使用 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设置为第一个转弯。

标签:井字棋,构造,源代码
来源: