【Minecraft】寝られる時間をお知らせするの巻【CCの道も一行から#1】

YouTube とニコニコ動画で投稿中の動画シリーズで、動画に収まりきらなかったこぼれ話や詳細解説を掲載しています。

動画はこちらから

作成したプログラム

clock.lua

簡単なデジタル時計のプログラム。

pastebin get gb5gBLWD clock.luaでゲーム内からダウンロードできる。

コメント付き版

-- 周辺機器のモニターを取得する
local monitor = peripheral.find('monitor')

-- hh:MM 形式の時刻を返す
function getFormattedTime()
    -- os.time() はデフォルトでゲーム内時刻を、
    -- 00:00 からの経過時間[h]で 0.0 以上 24.0 未満で返す
    local now = os.time()
    
    -- now を切り捨てて、時間をもとめる
    local hour = math.floor(now)
    
    -- now を 60 倍して、00:00 からの経過時間[min]をもとめ、
    -- 60 で割ったあまりを求めることで分を計算
    local minute = math.floor(now * 60) % 60
    
    -- local second = math.floor(now * 60 * 60) % 60
    
    -- format メゾットは % と d の中にオプションを指定することができる
    -- 02 は 2 桁になるようにゼロ埋めすることを示す
    return ("%02d:%02d"):format(hour, minute)
end

-- 晴れの日の時ベッドが使える時刻なら true を返す
function canSleep()
    local now = os.time()
    
    -- Minecraft の内部時刻[tick]に変換
    local tick = math.floor(((now + (24 - 6)) % 24) * 1000)

    -- 晴れの日は 12542[tick] から 13459[tick] まで寝ることが出来る
    return 12542 <= tick and tick < 23460
end
 
function setup()
    monitor.setTextScale(1)
end
 
-- モニターの背景色と文字色を指定する
function setColor()
    if canSleep() then
        -- 寝られるときは黒字に白
        monitor.setTextColor(colors.white)
        monitor.setBackgroundColor(colors.black)
    else
        -- 寝られないときは白地に黒
        monitor.setTextColor(colors.black)
        monitor.setBackgroundColor(colors.white)
    end
end
 
function update()
    setColor()
 
    monitor.clear() -- モニターをリセット
    monitor.setCursorPos(2, 3) -- 中央ぞろえ風
    monitor.write(getFormattedTime()) -- 時刻を記入
end
 
setup()
 
while true do -- 無限ループ
    update()
    os.sleep() -- 0.05 秒 (=1tick) 休む
end
Lua
Expand

補足

動画では省略したが、これではワールドから出るたびに停止してしまうので、startup.luaに以下のコードを記載しておくとよい。

shell.run("clock")
Lua

詳細解説

動画に登場した要素を詳しく解説します。

用語集

動画内に出てきた専門用語やアイテムなどの解説です。

モニター

デフォルトで 7×5 文字表示できる、周辺機器の一つ。カラー表示には上位版が必要。

表示機能のほかに、右クリックを検知する機能を持っているため、タッチパネルとしても活躍する。

コマンド

動画内で使用した、CC のコンピューターなどで実行可能なコマンドの解説です。

worm コマンド

ヘビゲームが遊べる。それだけ。

プログラム関連

実際に CC でプログラミングするときに必要な知識です。基本的にプログラミング経験者向けの情報になります。

--(コメント)

--以降(行末まで)はコメント扱いとなり、処理に影響しない。

local(ローカル変数の宣言)

Lua の変数はデフォルトでグローバルのため、ローカル変数の定義にはlocal句が必要である。代入を同時に行わないときは、nil(null や None や undefined のようなもの)がセットされる。

local 変数名
local 変数名 = 初期値

function

関数を定義する。

function 関数名(引数)
    内容
end

return

戻り値(返り値)を返す。functionブロックの中で使用する。

if

条件式の真偽によって実行する命令を分岐する。elseif文によって条件を増やしたり、else文によってすべての条件が偽であった時の動作も指定できる。

if 条件式 then
    真のときのみ実行する内容
end

if 条件式1 then
    ブロック1
elseif 条件式2 then
    ブロック2
elseif 条件式3 then
    ブロック3
else
    ブロック4
end

while

条件が真の間、doendを繰り返す。

while 条件 do
    繰り返す内容
end

%(剰余演算子)

余りを求める演算子。

preipheral.find(ty [, filter])

指定したタイプ(ty)の周辺機器のメゾットをラップしたテーブルを返す。filterに関数を与えることで、より詳細な肢体ができる。以降、モニターをラップしたテーブルをmonitorとする。

monitor.setCursorPos(x, y)

monitor.writeの書き初め位置を指定する。

monitor.write(text)

textをカーソル位置に記入し、カーソルをその末尾に移動する。printのような改行は行われない。

monitor.clear

モニターの表示内容を現在の背景色でリセットする。

monitor.setTextScale(scale)

0.55.0の間で、文字サイズを指定する。0.5刻み。

monitor.setTextColor(color)

文字色を指定する。色の指定方法は colors を参照。通常版では白黒表示しかできないことに注意。

monitor.setBackgroundColor(color)

背景色を指定する。同上。

os.time([locate])

デフォルトでゲーム内時刻を0.0以上24.0未満で返す。

os.sleep([time])

timeで指定した秒数だけ処理を中断する。time0.05の倍数に切り上げられ、未指定の場合は0.05として扱う。

math.floor(x)

床関数やガウス関数と呼ばれる関数。xを超えない最大の整数を返す。

string.format(formatstring, ...)

フォーマット文字列を処理する。今回のプログラム中では、:(コロン)を使ってメゾット風に使っている。

:(メゾットアクセス)

これだけで記事が一本書けるレベルなので省略。簡単に言うと、a:b()a.b(a)のシンタックスシュガー1

編集後記

これ以来、やたらと雨が降って使いどきを失いかけています。雨用の表示も制作したい。


  1. ほかの構文と等価だが、煩雑な記載を省略するための簡略化された構文のこと。 ↩︎
Verified by MonsterInsights