MC CommanderMinecraft非公式コマンド支援

氷のボートレースをコマンドで作る方法

氷を敷いたコースをボートで走り、決めた周回数を先に回った人が勝ちのレースです。チェックポイントを順番に通ったかどうかをスコアで数えるので、近道でずるができません。Java版の書き方で説明します。

ミニゲームレースJava版

scoreboardコマンドを作る

更新日:

1. コースを作る

ボートは氷の上だと地面よりずっと速く走ります。packed_ice(氷塊)より blue_ice(青氷)のほうが速いので、直線は青氷、カーブは氷塊にすると曲がりやすくなります。広い範囲に敷くときは /fill を使います。

/fill ~ ~-1 ~ ~20 ~-1 ~4 blue_ice

一度に変えられるブロックの数には上限があるので、長いコースは何回かに分けて敷きます。詳しくは fillコマンドを安全に使う方法 を見てください。

2. 準備(最初に一度だけ)

/scoreboard objectives add cp dummy
/scoreboard objectives add lap dummy "周回"
/scoreboard objectives add time dummy
/scoreboard objectives setdisplay sidebar lap
/scoreboard players set #20 time 20

cp は次に通るチェックポイントの番号、lap は周回数、time はタイムを数えるスコアです。#20 はタイムを秒に直すときに使う「20」という数です。

3. チェックポイントの目印を置く

/summon marker ~ ~ ~ {Tags:["cp1"]}
/summon marker ~ ~ ~ {Tags:["cp2"]}
/summon marker ~ ~ ~ {Tags:["goal"]}

コースの3分の1あたり、3分の2あたり、スタート兼ゴールの線のまん中に立って、それぞれ1回ずつ実行します。コースが長いときは cp3、cp4 と増やします。

4. スタートの合図

/scoreboard players set @a cp 0
/scoreboard players set @a lap 0
/scoreboard players set @a time 0
/tag @a add racing
/title @a title {"text":"スタート!","color":"green"}

ボタンを押すと上から順に動くように、インパルスとチェーンのコマンドブロックで並べます。最初にスコアを0にしておくのが大事です。スコアが空のままだと、5の条件 scores={cp=0} に当てはまりません。ボートは /give @a oak_boat で配ります。

5. チェックポイントを順番に通す(くり返し)

/execute at @e[type=marker,tag=cp1] as @a[distance=..4,scores={cp=0}] run scoreboard players set @s cp 1
/execute at @e[type=marker,tag=cp2] as @a[distance=..4,scores={cp=1}] run scoreboard players set @s cp 2
/execute at @e[type=marker,tag=goal] as @a[distance=..4,scores={cp=2}] run scoreboard players add @s lap 1
/execute at @e[type=marker,tag=goal] as @a[distance=..4,scores={cp=2}] run scoreboard players set @s cp 0

1行目をくり返しコマンドブロック(常時実行)に入れ、残りをチェーンでつなげます。チェックポイント1を通ると cp が1になり、1の人だけがチェックポイント2で2になり、2の人だけがゴールで周回が1増えます。途中を飛ばしてゴールに着いても周回は増えません。コースの幅が広いときは distance=..4 の数を大きくします。

6. タイムを数える(くり返し)

/scoreboard players add @a[tag=racing] time 1

1ティック(20分の1秒)ごとに1ずつ増えます。走っている人だけ数えるので、ゴールした人のタイムはそこで止まります。

7. ゴールの判定(くり返し)

/tag @a[tag=racing,scores={lap=3..}] add goal_now
/tag @a[tag=goal_now] remove racing
/execute as @a[tag=goal_now] run scoreboard players operation @s time /= #20 time
/execute as @a[tag=goal_now] run tellraw @a [{"selector":"@s"},{"text":" がゴール! タイム:"},{"score":{"name":"@s","objective":"time"}},{"text":"秒"}]
/tag @a[tag=goal_now] remove goal_now

3周した人に goal_now タグを付け、タイムを20で割って秒に直してから、全員に表示します。最後にタグを外すので、表示は1人につき1回だけです。周回数を変えるときは lap=3.. の数を変えます。

うまくいかないときの確認ポイント

よくある質問

馬のレースにも使えますか?

同じしくみで使えます。馬の出し方は最強の馬を出すコマンドの記事を参考にしてください。

タイムを小数点まで出せますか?

time を2で割ると10分の1秒の数になります。表示するときに秒と小数に分けて書くと、より細かく出せます。

1位だけを知らせられますか?

最初にゴールした人にだけ first タグを付け、first タグを持つ人がいないときだけ付ける条件にすると、1位だけを表示できます。

関連ページ

トロッコのコマンドチェスト付き・コマンドブロック付き・自動で乗せる方法。stopwatchコマンド本当の秒数でタイムを計ります。パルクールをコマンドで作る

チェックポイントの考え方が同じです。

ロビーをコマンドで作る

スタート前の待機場所に。

scoreboardでミニゲームを作る

スコアの使い方です。

最強の馬を出すコマンド

馬のレースにするときに。

コマンド辞典

基本構文とコマンド別の使い方を確認できます。