マイクラでmod無しコマンドだけで作るパズルゲーム

2021年2月8日

mod無しプラグインなしでマイクラ内で遊べる額縁のパズルゲームを作ったので解説と作り方を紹介します

回転させて向きを揃えるゲームです

統合版では出来ません

環境はjava 1.16.4 tuinity server forge導入済みですが1.13以降のバニラならいけます(多分)

淫夢要素はないです。

遊び方

石のボタンを押すと額縁内のアイテムがランダムな方向を向きます

揃えたらメッセージが届きランキングと今の記録(record)が表示されます

準備

同じものを作る人はいないと思いますが参考程度にどうぞ

/scoreboard objectives add frame_puzzle
/scoreboard objectives add puzzle_record

スコアボードを作成してください

/scoreboard players set view frame_puzzle 1

初期値を指定します

/tag @e[limit=1,sort=nearest,tag=!frame_puzzle1,type=minecraft:item_frame] add frame_puzzle1

額縁を壁に貼ります
設置した後にコマンドを額縁の数だけ実行してください
近い場所から登録されていきます

コマンドブロックの解説

配置は自由ですが解説では上記画像の左上からいきます

特に何も指定がなければリピートは無条件 常時実行
チェーンは条件付き 常時実行です

例外関係1

リピートです

execute if score record puzzle_record matches ..10 if score flag frame_puzzle matches 1 unless entity @e[nbt=!{ItemRotation:0b},nbt=!{ItemRotation:4b},nbt=!{ItemRotation:-4b},type=minecraft:item_frame,tag=frame_puzzle1] run scoreboard players set flag frame_puzzle 0

10tick以下でクリアしたときになかったことにします

例外関係2

次はリピートです

execute if score flag frame_puzzle matches 1 run scoreboard players add record puzzle_record 1

もしスコア(frame_puzzle)のflagが1ならrecordを1増やします
flagが1ならプレイ中(ボタンを押してからクリアするまでの時間)であることを意味します
recordはクリアまでのtick数を計測します

結果のスコアを非表示にするタイマー

次はリピートと2連のチェーンです

execute if score view frame_puzzle matches 1.. run scoreboard players add view frame_puzzle 1

結果が表示されている(viewが1以上)なら結果のタイマー(view)を1増やす

execute if score view frame_puzzle matches 200.. run scoreboard players set view frame_puzzle 0

結果のタイマー(view)が200より大きいなら結果のタイマー(view)を0にする(要するに非表示)

scoreboard objectives setdisplay sidebar

結果のスコアボードを非表示にする

ランダムに額縁を回転

次はリピートと6連のチェーンです リピートは”動力が必要”です リピートにはボタンを付けてください

scoreboard players add @e[type=minecraft:item_frame,tag=frame_puzzle1,sort=random,limit=5] frame_puzzle 1

ランダムで抽出された額縁5つのスコア(frame_puzzle)を1増加させます

scoreboard players add @e[type=minecraft:item_frame,tag=frame_puzzle1,sort=random,limit=5] frame_puzzle 1

ランダムで抽出された額縁5つのスコア(frame_puzzle)を1増加させます よりランダムになるように1tickで2回実行させてます

execute at @e[tag=frame_puzzle1,type=minecraft:item_frame] store result entity @e[type=minecraft:item_frame,limit=1,sort=nearest] ItemRotation int 1 run scoreboard players get @e[type=minecraft:item_frame,sort=nearest,limit=1] frame_puzzle

スコア(frame_puzzle)を額縁のItemRotationに代入します

scoreboard players set flag frame_puzzle 1

スコア(frame_puzzle)のflagを1にします
この数値が1ならプレイ中(ボタンを押してからクリアするまで)であることを意味します

scoreboard players set record puzzle_record 0

puzzle_recordを0にします
puzzle_recordが0なら報酬のコマンドが実行されている事を意味します

scoreboard objectives setdisplay sidebar

サイドバーを非表示にします

クリア判定とクリア後の処理

次はリピートと7連のチェーンです

execute if score record puzzle_record matches 10.. if score flag frame_puzzle matches 1 unless entity @e[nbt=!{ItemRotation:0b},nbt=!{ItemRotation:4b},nbt=!{ItemRotation:-4b},type=minecraft:item_frame,tag=frame_puzzle1] run scoreboard players set flag frame_puzzle 0

もしプレイ開始から10tick以上経過していてかつ揃っているならスコア(frame_puzzle)のflagを0にします
この数値が0ならプレイしていない(ボタンを押してからクリアするまでの時間ではない)事であることを意味します

tellraw @p[sort=nearest,limit=1] {"text":"クリア!"}

クリアとささやきます
@pだとマルチプレイで問題があるかもしれませんが大したことはないです

scoreboard players set view frame_puzzle 1

viewを1にします
これが1以上ならスコアボードが表示されていることを意味します

scoreboard objectives setdisplay sidebar puzzle_record

スコアボード(puzzle_record)を表示します

scoreboard players set reward_flag frame_puzzle 1

puzzle_recordを1にします
puzzle_recordが1なら報酬のコマンドが実行されていることを意味します

execute unless score @p puzzle_record < record puzzle_record run scoreboard players operation @p puzzle_record = record puzzle_record

新記録ならpuzzle_recordの@p(近くのプレイヤー)に今回の記録を代入します
@pだとマルチプレイで問題があるかもしれませんが大したことはないです

tellraw @p {"text":"新記録!"}

新記録であることを通知します
@pだとマルチプレイで問題があるかもしれませんが大したことはないです

報酬関連のコマンド

次はリピートと4連のチェーンです

execute unless score reward_flag frame_puzzle matches 0 run scoreboard players set reward_flag frame_puzzle 0

puzzle_recordが0以外ならpuzzle_recordを0にします
puzzle_recordが0なら報酬のコマンドが実行されていないことを意味します

execute if score record puzzle_record matches ..100 run give @p minecraft:iron_ore 1
execute if score record puzzle_record matches ..90 run give @p minecraft:iron_ore 1
execute if score record puzzle_record matches ..80 run give @p minecraft:iron_ore 1
execute if score record puzzle_record matches ..70 run give @p minecraft:iron_ore 1

各自報酬コマンドです
100なら鉄鉱石1つ
90なら2つ 80なら3つ 70ならそれに追加してダイヤモンドがもらえます