忍者ブログ

cc-memo

Computer Craft のメモ

tr (turtle runner)

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

tr (turtle runner)


・trというコマンドを作ってみた。
・いつもの俺々フレームワークの「ミニ言語」を使ってタートルを動かす為のプログラム。
・ちょっとした用事の為にタートルを使いたいと思っても、
 わざわざその為のプログラムを書くは面倒くさい、という場合に
 このtrコマンドを使って、使い捨てのプログラムを作って走らせると良いかもしれない。
 ファイルに保存することも可能。
 そのファイルをeditで編集して、trで実行させることも可能。
 (但しまだ改行は非対応、、、だと思う)
・ヘルプ機能付き。

 tr --help

 というように、trコマンドの後に「--help」オプションを付けて実行すると、
 linuxとかの「manページ」風のヘルプが表示される。

 また、「ミニ言語」のスクリプト入力中に、
 どんなコマンドが有るか忘れてしまった場合は、スクリプト中に「?」と入力し、
 Enterキーを押すことでもヘルプが表示される。
 ヘルプ終了後、元のスクリプトの作成を再開することができる。
・もう少し盛り込みたい機能もあるのだが、とりあえず投稿。

画像で説明。

trと打つと上記のメッセージが表示されるので、ここにタートルを動かす手順を記入する。
この例では
((ffr)4)2
と入力しているが、これは
前進、前進、右に90度回転
を8回繰り返す、という意味。

コマンド入力中に、どんなコマンドが有るかを確認したくなった場合は、
?を入力してEnterキーを押すと、、、


ヘルプが表示される。
ページの切り替えはカーソルキーでも可能。


5ページ目あたりに、コマンドについての説明があるので、ここを読んで確認する。
確認が済んだらqキーを押す。


コマンドを入力する画面に戻った時に、入力途中のコマンドは表示されていないが、
**で始まるメッセージに書かれているように、「↑」カーソルキーを押すと、
入力中のコマンドが再表示される。


次にファイルに保存するか聞かれるので保存する場合はファイル名を入力する、
保存しない場合は何も入力せずにEnter。
指定されたファイルが既に存在する場合は、
・上書き([o]verwrite)
・別の名前にする([n]ame other)
・ファイルに保存するのをやめる([d]on't save)
・trコマンド自体を終了([q]uit)

と出てくるのでどれかを選ぶ。

後は、スクリプト通りにタートルが動作します。(燃料が入っていれば。)


あと、

 tr --demo

 というように、trコマンドの後に「--demo」オプションを付けて実行すると、
 ヘルプ内にも書かれている豆腐建築のスクリプトが実行できる。
 ※以下のようにアイテムを配置しておく必要有り。
 slot1:ブロック
 slot2:ベッド
 slot3:ドア

 このスクリプトで作成したのが、1番最初の画像の建物。

以下ソース

tr
dofile("lib_log");
dofile("lib_turtle_0.2.4");

local manText = [[
NAME
  tr - Turtle Runner
 
SYNOPSIS
  tr [options] [FILE]
 
DESCRIPTION
  tr is a program which operates a turtle using the script which can be described by a few keystrokes. 
  The script for tr consists of COMMANDS in which a name is extremely short. For example, forward is defined as "f", turnLeft is "l" and placeDown is "p2".
  Moreover, control syntax is also prepared for tr. (Although it is only a repetition.)
  The following example is the script which perform tofu construction.
 
  s1 (up2 ((fp2)4 r (fp2)3 r)2)3 fr (fp2)2 lfp2l fp2 rf p2rf dd p0 blbbd s2p1 rflfr e1fe0f ll s3p1 lbl
 
  *** Set items as follows. ***
  slot1 : block x 48
  slot2 : bed   x  1
  slot3 : door  x  1
 
  When tr is executed, without specifying a FILE, the prompt for script is displayed.
  After the input of a script, the prompt for file name is displayed.
  If you don't want to save, press the Enter key, with no input.
 
  options
    --help
      display this help and exit.
 
    --demo
      interactive input mode with "tofu construction" example.
 
  FILE
    optional. The path of a script file.
 
  COMMANDS
    f - <f>orward
    b - <b>ack
    l - turn <l>eft
    r - turn <r>ight
    u - <u>p
    d - <d>own
    s[slot]
      - <s>elect
        slot  - 1 ~ 16
    p[side]
      - <p>lace
        side  - 0:up, 1:front, 2:down
    t[side],[count]
      - <t>hrow (= drop)
        side  - 0:up, 1:front, 2:down
        count 
    e[side]
      - <e>xcavate (= dig)
        side  - 0:up, 1:front, 2:down
    z[millisecond]
      - <z>zz = sleep
    o[side],[value]
      - set redstone <o>utput
        side  - 0:up, 1:front, 2:down,
                3:left, 4:back, 5:right
        value - 0:off, 1:on
    k[side]
      - suc<k>
        side  - 0:up, 1:front, 2:down
    a[side]
      - <a>ttack
        side  - 0:up, 1:front, 2:down
    v[id]
      - user e<v>ent
        id    - 
  Control syntax
    (xx)[loopCount]
      - loop
        loopCount - loop count.
 
AUTHOR
  kssr (http://cct.blog.shinobi.jp)
 
REPORTING BUGS
  Report bugs to <http://cct.blog.shinobi.jp>.
 
COPYRIGHT
  Copyright (C) 2014 kssr (http://cct.blog.shinobi.jp)
 
SEE ALSO
  http://cct.blog.shinobi.jp
]];

local function split(src, sepalator)
  local ret = { };
  local bgnIdx = 1;
  repeat
    local endIdx = src:find(sepalator, bgnIdx, true);
    if nil == endIdx then
      endIdx = #src + 1;
    end
    table.insert(ret, src:sub(bgnIdx, endIdx - 1));
    bgnIdx = endIdx + 1;
  until #src < bgnIdx;

  return ret;
end

local KNtC = { };
for i = 0, 256 do
  local name = keys.getName(i);
  if nil ~= name then
    KNtC[name] = i;
  end
end

local pages = { };
local function makePages()

  local w, h = term.getSize();
  w = w - 1;
  h = h - 1;

  local current = { };
  local beginIdx = 1;

  local lines = split(manText, "\n");
  for _, val in ipairs(lines) do
    local indent = 0;
    for j = 1, #val do
      if " " ~= val:sub(j, j) then
        indent = j - 1;
        val = val:sub(j);
        break;
      end
    end

    local x = 1;
    local BLANK = " ";
    while true do
      if #val < x then
        break;  
      end
      table.insert(current, BLANK:rep(indent) ..
                            val:sub(x, math.min(x + w - indent - 1, #val)));
      x = x + w - indent;
      if h == #current then
        table.insert(pages, current);
        current = { };
      end
    end
  end
  if 0 < #current then
    table.insert(pages, current);
  end
end

local function isOneOf(val, possibleValues)
  for _, v in ipairs(possibleValues) do
    if val == v then
      return true;
    end
  end
  return false;
end

local pageIdx = 1;
local function man()
  while true do
    term.clear();
    term.setCursorPos(1, 1);
    term.setBackgroundColor(colors.black);
    term.setTextColor(colors.white);

    local w, h = term.getSize();
    local BLANK = " ";
    for i, val in ipairs(pages[pageIdx]) do
      term.setCursorPos(1, i);
      term.write(val .. string.rep(BLANK, w - #val));
    end
    for i = #pages[pageIdx] + 1, h do
      term.setCursorPos(1, i);
      term.write(string.rep(BLANK, w));
    end

    term.setCursorPos(1, h);
    term.setTextColor(colors.black);
    term.setBackgroundColor(colors.white);
    term.write(" [b]ack, [n]ext, [q]uit / page : " .. pageIdx .. " of " .. #pages .. ".");

    while true do
      local event, scanCode = os.pullEvent("key");

      -- key name 
      -- http://computercraft.info/wiki/Keys_(API)
      if isOneOf(scanCode, { KNtC.up, KNtC.left, KNtC.p, KNtC.b, KNtC.w, KNtC.a }) then
        pageIdx = math.max(pageIdx - 1, 1);
        break;
      elseif isOneOf(scanCode, { KNtC.down, KNtC.right, KNtC.n, KNtC.f, KNtC.s, KNtC.d, KNtC.space }) then
        pageIdx = math.min(pageIdx + 1, #pages);
        break;
      elseif isOneOf(scanCode, { KNtC.q, KNtC.e }) then
        term.setBackgroundColor(colors.black);
        term.setTextColor(colors.white);
        term.clear();
        term.setCursorPos(1, 1);
        return;
      end
      sleep(0.5);
    end
  end
end

local function interactiveScriptInputMode(history)
  local input = history;
  while true do
    print("input command or type ? >");
    if nil ~= input and "" ~= input then
      print("** In order to re-display your script,");
      print("** press the 'up' cursor key.");
    end
    input = read(nil, { input });
    if string.find(input, "?", 1, true) then
      man();
    else
      if nil ~= input then
        script = input;
      else
        script = "";
      end
      break;
    end
  end
  return script;
end

local function interactiveFileNameInputMode()
  local pass = false;
  local input;
  local exitFlg = false;
  while true do
    print("Input script name if you want to save. >");
    input = read(nil, { input });

    if nil == input then
      fileName = "";
      pass = true;

    elseif "" ~= input and fs.exists(input) then
      while true do
        print("file exists. [o]verwrite, [n]ame other, [d]on't save, [q]uit");
        
        local ip2 = read();
        if "o" == ip2 then
          fileName = input;
          pass = true;
          break;
          
        elseif "n" == ip2 then
          break;
          
        elseif "d" == ip2 then
          print("Don't save.");
          fileName = "";
          pass = true;
          break;
          
        elseif "q" == ip2 then
          print("Quit.");
          exitFlg = true;
          pass = true;
          break;

        else
          print("Wrong input. retry.");
        end
      end
    else
      fileName = input;
      break;
    end
    if pass then
      break;
    end
  end
  return fileName, exitFlg;
end

local tArgs = { ... };

makePages();

local script;
local fileName = "";
local history = "";
local exitFlg;

if isOneOf("--help", tArgs) then
  man();
  return;

elseif isOneOf("--demo", tArgs) then
  history = "s1 (up2 ((fp2)4 r (fp2)3 r)2)3 " ..
            "fr (fp2)2 lfp2l fp2 rf p2rf dd p0 " ..
            "blbbd s2p1 rflfr e1fe0f ll s3p1 lbl";

elseif 1 == #tArgs then
  fileName = tArgs[1];

end

if "" ~= fileName then
  local hFile = fs.open(fileName, "r");
  local txt = hFile.readAll();
  hFile.close();
  script = txt;

else
  script = interactiveScriptInputMode(history);
  fileName, exitFlg = interactiveFileNameInputMode();

  if exitFlg then
    return;
  end

  if "" ~= fileName then
    local hFile = fs.open("/" .. fileName, "w");
    hFile.writeLine(script);
    hFile.close();
  end
end

if "" ~= script then
  doCommand(script);
  print("tr was completed.");
else
  print("script is empty.");
end
PR

コメント

プロフィール

HN:
kssr
性別:
非公開

Twitter

最古記事

(04/25)
(04/26)
(04/27)
(04/28)
(04/29)

アンテナ・ランキング