マイクラでバトロワを作ってみた

# ■ 概要
マイクラでコマンドを使って、バトロワを作ってみた。
ワールドデータをダウンロードして、realmsやサーバーにアップロードすればフレンドと遊べると思います。

ワールドデータ↓（データパックも入ってる）

https://drive.google.com/drive/folders/17ZsqHztkfIT-NlQm8ZxD-MXVgEOlfNuP?usp=drive_link

データパック↓（ワールドデータないと動かないのでコード確認用）

https://github.com/xx-z/minecraft_BattleDataPack

# ■ 環境
minecraft : 1.20.4

# ■ ゲームの内容
### ● ゲームルール
ゲームエリアで武器などを拾い、一人になるまで戦う
最終的にキル数と順位によって<font color="red">**一番ポイントの高い人が優勝**
![2024-04-13_13.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/80096f6f-75b2-6297-ec62-b07474ac37b3.png)

### ● ゲームエリア
150x150マスの中で戦う
ゲーム開始から一定時間経つとワールドボーダーによってエリアが小さくなる

<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/1192a458-bba7-689b-9344-72322dfd6587.png>

### ● プレイヤーのスポーン位置
真ん中のチェストを囲んで丸形でスポーン
ゲームタイマーがスタートしてからプレイヤーが移動できるようになる
<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/5d3e5e2c-e2dc-aa12-ce88-678aed5b0690.png>

### ● 戦闘用アイテムの入ったチェストについて
チェストの種類は4種類
**・メイン**
　　プレイヤーで囲んだ真ん中にあるチェスト
　　チェストの中身はランダム(20種類)、食料が充実している
　　<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/d03c900d-8319-0c93-01ab-8cbee9cfab56.png>
**・ベース**
　　固定の場所に置かれているチェスト
　　チェストの中身はランダム(20種類)、武器が充実している
　　<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/d60ec99f-2957-ec29-0bf1-c9f255072310.png>
**・ランダム**
　　ランダムに生成される5つチェスト
　　中身は固定、金にんじんが入っている
　　<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/d6deaa27-94c2-ed3c-a239-32b929e472bc.png>

**・レア**
　　マップの端にあるチェスト
　　チェストの中身はランダム(5種類)、ネザライト防具などが入っている
　　<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582644/ea645a45-bd4c-e74f-233a-d099bc143c36.png>


# ■ データパックの中身
### ● メイン実行ファイル
コマンドブロックとして使用するファイル
```python
#ゲームスタート
data\battle\functions\game_start.mcfunction

#ゲームストップ
data\battle\functions\game_stop.mcfunction

#ゲームデータをリセット（game_startとgame_stopで使用）
data\battle\functions\game_reset.mcfunction
```

### ● ゲームの状況によるフォルダごとの処理内容
```python
#エントランスでの処理
data\battle\functions\functions\standby

#ゲームエリア内でゲーム開始までの処理
data\battle\functions\functions\ready

#ゲームエリア内でゲーム終了までの処理
data\battle\functions\functions\play

#ゲーム終了からエントランスに戻るまでの処理
data\battle\functions\functions\end
```

### ● その他のファイル、フォルダ
```python
#ゲームデータを編集する関数まとめ
data\battle\functions\functions\data_edit\data_setup.mcfunction  #ゲームデータ作成
                                         \data_delete.mcfunction #ゲームデータ削除

#ゲームの設定を変更するコマンドブロック一覧
data\battle\functions\functions\setting
```

# ■ 個人的に実装で学べたところ
### ● チェストの中身をランダム化する
1. ストラクチャーブロックでチェストを保存し、名前を`chest_base1`,`chest_base2`のように割り当てる
2. `random value 1..2`で乱数を実行して、`scoreboard`に記録する
3. if文で`scoreboard`と同じ数字のチェストを`place template`で生成する
```python
execute store result score baseChest Chest run random value 1..2
execute if score baseChest Chest matches 1 run place template minecraft:chest_base1 300 26 128
execute if score baseChest Chest matches 2 run place template minecraft:chest_base2 300 26 128
```
↑ 頭の悪いコードを書いている気がするので他の方法があるなら知りたい...

### ● チェストをランダムに生成する
1. ストラクチャーブロックでチェストを保存し、名前を`chest_random`でつける
2. アーマースタンドに、tag名で`randomChest`をつける
3. `spreadplayers`で、tag名が`randomChest`のアーマースタンドをランダムに移動
4. tag名が`randomChest`のアーマースタンドの位置に、`place template`で`chest_random`を生成する

```python
spreadplayers 275 75 1 74 under 32 false @e[type=minecraft:armor_stand,tag=randomChest]
execute as @e[type=armor_stand,tag=randomChest] at @s if block ~ ~ ~ air run place template chest_random
```

参考にしたサイト↓

https://note.com/hayaodori_0204/n/ne70581d4b3fd

### ● 雪玉でフグを生成する
1. 雪玉に名前`どくどくだま`を付ける
2. `execute as @e at @s`で着弾を検知して、`summon`でフグを生成する
```python
execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'[{"text":"どくどくだま"}]'}}}}] at @s unless block ~ ~-1 ~ air run summon minecraft:pufferfish ~ ~ ~
```

参考にしたサイト↓

https://note.com/nashidaicraft/n/n5cbfe8dce434

# ■ 使用感、感想
twitch配信者の[だみあさん](https://twitch.tv/dami88282)の企画で使用してもらいました。
ゲームバランスの不安があったんですが、そこまで悪くなかった印象。
初めて作ったデータパックにしては、まあまあかなといった感じでした。

四枚目の写真がプレイしている様子↓

https://x.com/__DA8v/status/1779512404495503534