实例5:简单登入系统——function与综合运用

本例子将会使用function
代码块第一行如果为# xxx:xxx就代表是function

准备工作

首先我们来分析一下记分板登入系统需要什么:

  • 检测用户第一次出现以注册,我们会使用tag。
  • 注册系统,我们会使用trigger命令记录用户分数,分数即密码。
  • 检测登入,我们会使用stat.leaveGame判据。(玩家登出了再进来就是登入了)
  • 获取玩家输入,我们也会使用trigger命令记录输入的“密码”。
  • 比较密码是否正确,我们会使用scoreboard players operation

变量:

  • password: trigger。记录用户密码
  • leaveGame: stat.leaveGame。记录玩家登出次数,登入密码正确后重置。(>=1就是登入了)
  • input: trigger。记录用户密码输入

标签:

  • registered: 记录玩家有没有注册过。

初次实现

首先我们先加上那堆变量

# login:init
scoreboard objectives add password trigger
scoreboard objectives add leaveGame stat.leaveGame
scoreboard objectives add input trigger

# 高频执行高频function
gamerule gameLoopFunction login:main

然后我们编写注册系统。(将会高频执行)

# login:register

# 如果有了分数,那就是注册好了,因为默认没有分数
# 显示注册成功信息
tellraw @a[tag=!registered,score_password_min=-2147483648] ["注册完毕!"]

# 加上注册成功的tag
scoreboard players tag @a[tag=!registered,score_password_min=-2147483648] add registered

# 让玩家可以注册
# 放在前面的话,会让玩家重新注册
# 放在这里的话就能保证注册过的玩家必定拥有标签,不会再次enable
scoreboard players enable @a[tag=!registered] password

接着到密码检测系统(假设是让还没登入,并且有input分数的玩家执行)

# login:check_pw

# 如果a=b,a-b=0
scoreboard players operation @s input -= @s password

function login:succ if @s[score_input=0,score_input_min=0]
function login:failed unless @s[score_input=0,score_input_min=0]
# login:succ

# 登入成功
tellraw @s ["登入成功"]
scoreboard players set @s leaveGame 0
scoreboard players reset @s input
# login:failed

# 登入失败
tellraw @s ["登入失败,请再次尝试"]
# 重置使玩家重新进入待输入密码状态
scoreboard players reset @s input

不使用execute的原因:
如果我们不分开function的话,我们需要不停execute来实现function if的功能,无疑是让命令可读性降低很多的;
而且我们需要在每条命令加上参数,每次都要重新选择实体,损害了命令的可读性之余更让命令的效率降低。(总之不是为了偷懒少写一些字符啦)

你可以试试写一个不用function的,相信会多了很多execute命令。

然后我们来写高频的系统了,大部分东西都在这里进行。

# login:main

function login:register

# 如果leaveGame>0的话就代表这玩家重新登入了。(如果登入失败的话这分数还是>0所以能让他们再次尝试)
scoreboard players enable @a[score_leaveGame_min=1] input

# 如果leaveGame>0同时input有分数的话就代表那玩家输入了密码
execute @a[score_leaveGame_min=1,score_input_min=-2147483648] ~ ~ ~ function login:check_pw

然后,开始的时候运行一次以下命令,初始化系统

function login:init

大功告成!

再次实现

看着这系统是不是觉得很简单呢?没错,确实简单的过分——因为我们没加入限制未登入玩家的操作等功能(在简单的系统在,限制功能可以和leaveGame的分数联动)。让我们试试优化这系统吧!

但不是现在。由于难度提升,在之后实战章节将才会有一个完整版本的登录系统哦!不只是分数,而是能够输入一些英文字符,不容错过!

那个完整版只会展示输入和检查的部分,其他部分和这例子类同。


这么简单的系统可没有章末效果图哦

results matching ""

    No results matching ""