マインクラフト統合版で鉄を千個あつめるゲーム（鉄千）のコマンド

マインクラフト統合版で鉄を千個あつめるゲーム（鉄千）のコマンド部分をつくっていく

この記事は  [マインクラフト統合版で鉄を千個あつめるゲーム（鉄千）の実現方法](https://qiita.com/nobu-maple/items/f42bce4e8b081eb90dd2) の続き

コマンドブロックでは大文字小文字が区別されるので注意して書くこと



## 焼いた鉄をカウントする

カウンター用の変数とユーザを切り離す方式で実装してみる
これはユーザが変わる度にコマンドブロック内を編集するのが大変で間違いも起こりやすいと思うので
あとはユーザ毎に表示する文字色を変えたりしたいなと思うので

ほとんどのコマンドブロック内では User1、User2、User3。。。のように書いておいて、
表示する部分だけ、User?? と ゲーマータグ(名前/表示名) を関連付ける。という方式にしておきます。

```mermaid
flowchart TD
    A[user1] --> A1(長女)
    B[user2] --> B1(長男)
    C[user3] --> C1(次男)
    D[user4] --> D1(友人１)
    E[user5] --> E1(友人２)
```


まず、カウントするための変数？を scoreboard で用意する
名前は Iron にしとく

```bat
scoreboard objectives add Iron dummy
```

次に鉄が焼けたことを検知するための仕組みとしてこんなのを作る

![t10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/10eccce4-6f49-746a-5f5d-949fd55d19fa.jpeg)

・チェスト
・チェストにつながるようにホッパー
・ホッパーの上に溶鉱炉
・ホッパーの後ろにコンパレータ
・コンパレータの出力を受け取るコマンドブロック

これで溶鉱炉で焼けた鉄がホッパーに吸われてチェストに入る
ホッパーを通った時にコンパレータで検知してコマンドブロックを動かす。という仕組み

コマンドブロックの中は上で作った Scoreboard の Iron の「 User1 」 に＋１しているだけ

```bat
scoreboard players add User1 Iron 1
```

　インパルス、無条件、動力が必要

![t11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/c33f44aa-48d4-12f6-870a-681c704b9576.jpeg)


これを人数分作って、コマンドブロックの **User1** 部分をそれぞれ User**2**とかUser**3**とかに変えておく

もちろん、溶鉱炉を増やしてもOK。
その場合は最初のホッパーにつなげるか、それぞれの後ろにコマンドブロックを増やしておくかが必要

私は溶鉱炉を３つに増やして、カウントアップで光るようにレッドストーンランプも付けておいた

![t12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/7f35b2e2-66b5-fe3b-75c0-81afea34ad6a.jpeg)


## 焼いた鉄を表示する

焼いた鉄の数を画面に表示する用のコマンドブロックを用意


このコマンドブロックは変数 Iron を利用するため、溶鉱炉の近くに置かなくてもＯＫ
会場とは離れた場所、もしくは会場の地下、上空などに配置してもよいと思います


Scoreboard Iron のどの User?? を 「誰」 に表示するのか、と言う所を気をつけて
「 誰 」の部分には「ゲーマータグ(名前/表示名)」 に変更してください
（人数分このブロックを用意）

遅延は 20 を設定して、１秒毎の表示にしてます

```javascript
titleraw 誰 actionbar {"rawtext": [{"text": "§e現在の鉄: "}, {"score": {"name": "User1", "objective": "Iron"}}]}
```

　リピート、無条件、動力が必要、ティックの遅延（20）

![u1-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/c08289ab-555b-f811-9d91-b76e764487ce.jpeg)


```mermaid
flowchart LR
    A(レバー) --> A1[リピート：鉄表示-User1]
    A(レバー) --> A2[リピート：鉄表示-User2]
    A(レバー) --> A3[リピート：鉄表示-User3]
    A(レバー) --> A4[リピート：鉄表示-User4]
    A(レバー) --> A5[リピート：鉄表示-User5]

```

このコマンドブロックをレバーとかで働かせると、鉄の数が表示されるようになる

![t15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/3563a2c9-c919-1fd4-f679-7e7f15cfae2c.jpeg)



## 鉄千クリアを検知する

こども達が1000個集めるのは大変だと思うので、クリア条件は可変にしておきます

```bat
scoreboard players set Max Iron 1000
```

1000の所を 500 とかに変えれば、500集めた時点でクリアと判定する
これは初期設定時点で利用


#### クリア検知

鉄の個数を確認する用のコマンドブロックを用意して、条件を満たしたらもう検知されないように カウンターを 9999 に設定
（ **User1** の部分はユーザ毎に変更。人数分このブロックを用意）

```javascript
execute if score User1 Iron = Max Iron run scoreboard players set User1 Iron 9999
```

　リピート、無条件、動力が必要、ティックの遅延（5）
 
---


その後ろにチェーンで４つコマンドブロックを連結（これも人数分用意）


#### サブタイトル設定

```javascript
title @a subtitle §l鉄千達成！！
```
　チェーン、条件付き、常時実効


#### タイトル設定

```javascript
title @a title §cちょうじょちゃん
```

　チェーン、条件付き、常時実効

　※ 表示したい名前を入れておく（プレイヤーIDよりわかりやすく）
　※ これは 先に判定した User1 の人の名前
　※ サブタイトルを設定した後にタイトル表示にすること


#### コメント表示

```javascript
tellraw @a {"rawtext":[{"text":"§c§lちょうじょちゃん§r 鉄千達成!!§r"}]}
```

　チェーン、条件付き、常時実効

　※ ここの名前も同じく表示したい名前を入れておく



#### クリア音再生

```javascript
playsound  random.levelup  @a
```

　チェーン、条件付き、常時実効

　音はレベルアップ時の音としたけど、襲撃でもウォーデンビームでもなんでもOK




私のレイアウトはこんな感じ

![u5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/88e5e1c4-8ee6-1b6b-f635-54c11622ac09.jpeg)

(下の図はちょっと大きくなってしまうので、User1～3までにしときます）

```mermaid
flowchart LR
    A(レバー) 

    subgraph User3
		subgraph 鉄表示-User3
          A(レバー) --> A3[リピート：鉄表示]
		end
		subgraph クリア検知-User3
          A(レバー) 
              --> B3[リピート：クリア検知] 
          　　--> C3[チェーン：サブタイトル設定]
          　　--> D3[チェーン：タイトル表示]
          　　--> E3[チェーン：コメント表示]
          　　--> F3[チェーン：クリア音再生]
		end
	end
  
    subgraph User2
		subgraph 鉄表示-User2
          A(レバー) --> A2[リピート：鉄表示]
		end
		subgraph クリア検知-User2
          A(レバー) 
              --> B2[リピート：クリア検知] 
          　　--> C2[チェーン：サブタイトル設定]
          　　--> D2[チェーン：タイトル表示]
          　　--> E2[チェーン：コメント表示]
          　　--> F2[チェーン：クリア音再生]
		end
	end

    subgraph User1
		subgraph 鉄表示-User1
          A(レバー) --> A1[リピート：鉄表示]
		end
		subgraph クリア検知-User1
          A(レバー) 
              --> B1[リピート：クリア検知] 
          　　--> C1[チェーン：サブタイトル設定]
          　　--> D1[チェーン：タイトル表示]
          　　--> E1[チェーン：コメント表示]
          　　--> F1[チェーン：クリア音再生]
		end
	end

```





---

先ほどの「焼いた鉄を表示する」の部分も変更
今のままではクリアした後もずーっと表示を続けてしまうので、クリアを検知するまでは表示という風にしておきます

```javascript
execute if score User1 Iron < Max Iron run titleraw 誰 actionbar {"rawtext": [{"text": "§e現在の鉄: "}, {"score": {"name": "User1", "objective": "Iron"}}]}
```





## 制限時間で終了する

制限時間を設定しておいて、時間になったら 「鉄千終了」 と画面表示を行う。

設定は「分」で指定可能としておく。
最初から秒やTickで指定してもらえれば計算部分がなくなってコマンドブロック数が減って作る方は楽になるけど、使う方はまぁ簡単に「分」で指定できた方がいいよね。


#### 制限時間を「 分 」 で設定

```bat
scoreboard players set Limit Iron 90
```

使う人はここの 90 分 部分のみを変更すればよい
子供たちは・・30分くらいにしておいた方がいいかな



#### 分から秒への計算用の変数を準備

```bat
scoreboard players set seed Iron 60
```

#### 制限時間を「 秒 」 に変換

```bat
scoreboard players operation Limit Iron *= seed Iron
```

これを１秒毎(20Tick毎)にカウントダウンしていって、ゼロになったらゲーム終了ということ


#### 終了判定用の「ゼロ」を準備

```bat
scoreboard players set zero Iron 0
```



ここまでは初期設定として、最初に設定するだけでＯＫ

----

#### 制限時間カウントダウン

```bat
execute if score Limit Iron >= zero Iron run scoreboard players add Limit Iron -1
```

　リピート、無条件、動力が必要、ティックの遅延（20）

まだゼロでなければ、カウントダウン
　（ティックの遅延を20にしているので１秒毎にカウントダウン）


#### 制限時間になったら？

```bat
execute if score Limit Iron = zero Iron run scoreboard players set Limit Iron -1
```

  チェーン、条件付き、常時実効


#### サブタイトルとタイトルを設定して終了をお知らせ（音も）

```bat
title @a subtitle 制限時間になりました
```

　チェーン、条件付き、常時実効
 
```bat
title @a title ！！！鉄千終了！！！
```

　チェーン、条件付き、常時実効
 
```bat
playsound block.bell.hit @a
```

　チェーン、条件付き、常時実効




```mermaid
flowchart TD
    A(レバー) --> C1[リピート：制限時間カウントダウン] 
    --> C2[チェーン：制限時間判定]
    --> C3[チェーン：サブタイトル設定]
    --> C4[チェーン：タイトル表示]
    --> C5[チェーン：制限時間の音再生]
  
```

----

とりあえず、これだけあればゲームはできるかな

あとは会場を整えて、その他コマンドもちょっと付け足して。。

ビヘイビアーパックにまとめる、と。