[Minecraft1.8]スコアボードのスコアをレッドストーン信号に変換する その2

[Minecraft1.8]スコアボードのスコアをレッドストーン信号に変換する、レッドストーン信号をスコアボードのスコアに変換する
これの続編です。

前回の変換回路(回路なのか?)は0.4秒程度という恐ろしい速さで変換できました。大量にスコアボードを展開することを気にしなければ、最良の方法かと思います。

ただ、同じ処理を何度も書いていると、つい1つに纏めたくなってくる。えぇ。纏めちゃいました。

論理回路だと思ってたレッドストーンが気が付けば言語的な…

2014-11-25_17.png

細長いですが。
ディスプレイ部分はスタック構造になっています。
クォーツブロックの箇所は入力ボタンで、パルス(短いON信号)を生成するようにしてあります。入力信号をループさせるため。

アルゴリズム(testScore00を表示させたい)
1.Cを8にする。(8はビット数)
2.C> 0 を満たす間3~6をループする
 3.testScore00を2で割った余りをXに入れる。
 4.X=0であればOFFを、X=1であればONをディスプレイスタックにプッシュする。
 5.testScore00を2で割る。
 6.Cから1引く。

実際に実装する上では、testScore00を弄るためコピーを用意したり、2を保持するスコアボードも必要等厄介なので、いろいろ盛り込みます。

#temp0はダミーユーザ。
[Tick-1] // スコアボード作成
/scoreboard players operation #temp0 testScore00 = @p testScore00 // ダミーユーザにスコアをコピー
/scoreboard objectives add testScore00a dummy // ダミースコア
/scoreboard objectives add times dummy // 回数
/scoreboard objectives add num2 dummy // 2
[Tick-2] // 初期値セット
/scoreboard players set #temp0 times 8 // 16にしたり4にしたりすることもできる
/scoreboard players operation #temp0 testScore00a = #temp0 testScore00
/scoreboard players set #temp0 num2 2
[Tick-3]
/scoreboard players operation #temp0 testScore00a %= #temp0 num2 // 剰余
/scoreboard players remove #temp0 times 1
[Tick-4]
/scoreboard players test #temp0 testScore00a 1 [ディスプレイへ]
/scoreboard players test #temp0 times * 0 [終了処理スイッチへ]
/scoreboard players test #temp0 times 1 [ループスイッチへ]
Tick-4の入力信号をディスプレイへ[PUSH]
[ループスイッチ-1]
/scoreboard players operation #temp0 testScore00a = #temp0 testScore00 // testScore00a 復帰
入力信号を[Tick-3]へ
[ループスイッチ-2]
/scoreboard players operation #temp0 testScore00a /= #temp0 num2 // 2で割る
/scoreboard players operation #temp0 testScore00 /= #temp0 num2 // 2で割る
[終了処理スイッチ] // スコアボードの解放
/scoreboard objectives remove times
/scoreboard objectives remove num2
/scoreboard objectives remove testScore00a

フローチャートみたいな図貼りたいのですが画像添付が面倒でな

operation 系統は「AをBで演算した結果をAに入れる」という計算しかできない(すなわちAが上書きされる)ので、必要に応じてバックアップが必要。

ディスプレイの回路部分はリピータの信号保持機能使っています。
スポンサーサイト

tag : Minecraft

[Minecraft1.8]スコアボードのスコアをレッドストーン信号に変換する、レッドストーン信号をスコアボードのスコアに変換する

1.8でスコアボード系のコマンドも充実しましたし、ひょっとしてこれはいけるのではないか。
これができれば遅延で悩んでた算術回路等の高速化も行けるんじゃないかな。






レッドストーン信号をスコアボードのスコアに変換する

2014-11-05_23_30.png

ちょっと2進数を知っていればすぐ理解できます。
スコアボードを0にして、下位ビットから1,2,4,8...と割り振ればいいんです。

上図の操作は、右から「スコアボード消去」「スコアボード初期化」「2^0桁」「2^1桁」「2^2桁」「2^3桁」「スコアボード書き込み」のボタンになっています。
「スコアボード初期化」をクリックすると、次のコマンドを実行します。スコア作るだけです。
/scoreboard objectives add viewDecimal dummy result
「スコアボード消去」をクリックすると、次のコマンドを実行します。使い終わったら押す奴です。
/scoreboard objectives remove viewDecimal

裏はこうなっており・・・
2014-11-05_23_40.png
「スコアボード書き込み」を押すと、以下のコマンドを実行してからピストンが降ります。0に初期化するんですね。プレイヤーは@aで指定していますが、気にしない。
/scoreboard players set @a viewDecimal 0
ピストンの先のコマンドブロックにはこれ。
/scoreboard players add @a viewDecimal 1
/scoreboard players add @a viewDecimal 2
/scoreboard players add @a viewDecimal 4
/scoreboard players add @a viewDecimal 8
たとえば、「2^0桁」「2^2桁」のレバーがONの状態で「スコアボード書き込み」を実行すれば、1+4=5がスコアviewDecimal にセットされる。






スコアボードのスコアをレッドストーン信号に変換する

下図はスコアボードに37がセットされた状態でボタンを押したもの。37=00100101なので、正しいですね。
2014-11-06_00_01.png
コマンドブロックが多い印象ですが、同じ事書いてるだけです。

考え方はこう。
testScore00の値を出力したい、とする。演算記号a%bはaをbで割った余り、a^bはaのb乗を示す。
0bit目 = (1 <= (testScore00 % 2 ))
1bit目 = (2 <= (testScore00 % 4 ))
2bit目 = (4 <= (testScore00 % 8 ))
nbit目 = (2^n <= (testScore00 % 2^(n+1) ) )

「/scoreboard players operation」というコマンドを使うと剰余が計算できます。わぁすごい。

手順。
1.計算用スコアボードの用意
2.計算用スコアボードの値のセット
3.players operationで演算
4.players testで比較、出力
5.計算用スコアボードの消去

例えばtestScore00から2進数2bit目の値を取り出すには、
Q2 = (4 <= (testScore00 % 8 ) )

コマンドでは、(ダミープレイヤー#temp0 使用)
[1]/scoreboard objectives add num8
/scoreboard objectives add testScore00c
[2]/scoreboard players set #temp0 num8 8
/scoreboard operation #temp0 testScore00c = @p testScore00
[3]/scoreboard operation #temp0 testScore00c %= temp0 num8
[4]/scoreboard players test #temp0 testScore00c 4 「レッドストーン出力」
[5]/scoreboard objectives remove num8
/scoreboard objectives remove testScore00c

operationはスコアボード同士でしか演算ができないので、スコアボードを用意
これを8桁分用意するだけ。






コンパレータやリピータでガリガリやってたのが懐かしいです。応用すれば大規模かつ高速な加算回路も簡単に作れてしまいますね…。

tag : Minecraft

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1139位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
191位
アクセスランキングを見る>>