/logic_puzzle

robozzle like 42 を実装してみた

Primary LanguageJavaScript

logic_puzzle

robozzle like 42を思い出しながら実装してみたやつです

関数

run()

  • renderFunction(0)を実行する非同期関数
  • renderFunction(0)を実行中に呼び出されることを防ぐため、.disabled = trueでボタンを半透明にし、実行できなくする
  • 操作回数上限であるtimeoutを考慮し、time = 0しておく
  • 前回のrun()時の変更を上書きするためflag = falseしておく
  • renderFunction(0)が実行しおわるまで待つ
    • 実行し終わったら操作終了の原因がtimeoutかどうかを確認する(timeoutが原因だったらalertで通知しinit()で初期化)
    • コンソールにEndを出力
    • 最後に.disabled = falseでもう一度実行できるようにする

renderFunction(i)

  • Run時のレンダリングはF1(f[0])のみ
  • recursive関数に引数(f[i], 0, f[i]の長さ)を渡し呼び出す

recursive(fi, j, len)

  • fi[j]が実行可能か判定し、順次実行していく関数(以下、操作終了の条件)
    • 操作回数が設定されたtimeoutを超えている
    • fiの長さとjが一致する(0はじまりなので一致したら範囲外)
    • flagが立っている(Runしてから一度Game clearRange overしている)
  • star0のときnを1カウントアップし、flagを立て、操作終了することで次のレベルに進む処理を行う
  • boardの外へアクセスしたか、tiles[y][x]-1のときf[i]の入力以外を現在のレベルへ初期化し、flagを立て、操作終了する
  • 操作終了の条件に当てはまらず、かつ移動元のタイルが操作条件に当てはまる色のとき、await sleep(speed)moveRocket(command)を実行する。そうでなければ、今回の操作を待ち時間(await sleep(speed))ごとスキップしてawait recursive(fi, j+1, len)を実行する(再帰)。

moveRocket(command)

  • commandに応じて操作を変える(f[i][j]がとりうる値を参照)
  • 移動先のタイルに星があれば星なしに変え、starから1引く(以下タイル番号)
    • 0:赤色
    • 1:緑色
    • 2:青色
    • 3:赤色/星あり
    • 4:緑色/星あり
    • 5:青色/星あり
  • yはy軸の増減分(commandrocketRotateから自動割り出し)
  • xはx軸の増減分(commandrocketRotateから自動割り出し)

LEVEL[i]がとりうる値

  • "board"
    • board[y][x]のとき対応したタイル番号を示している
    • board[y][x]-1のときは、範囲外となる
  • "point"
    • Rocketの初期座標(y, x)と向き(rotate)
    • 常に[y, x, rotate]の形式になる
  • "fn"
    • f[i]に入力できるコマンドの数
    • 常に[f1, f2, f3]の形式になる
  • "timeout"
    • 無限ループを回避するための、操作回数上限

f[i][j]がとりうる値

  • 常に[command, condition]の形式になる
  • j回目の操作ではconditionの条件をみたしたときにcommandを実行できる。
  • command(操作)
    • -1: 動かない
    • 0 : 直進
    • 1 : 右90度方向転換
    • 2 : 左90度方向転換
    • 3 : 赤にぬりかえ
    • 4 : 緑にぬりかえ
    • 5 : 青にぬりかえ
    • 6 : f1実行
    • 7 : f2実行
    • 8 : f3実行
  • condition(操作条件)
    • -1: 操作条件なし
    • 0 : タイルが赤のとき操作可能
    • 1 : タイルが緑のとき操作可能
    • 2 : タイルが青のとき操作可能

LEVEL[i]解法

// LEVEL[0]
f[0] = [[0, 2], [1, 0], [1, 0], [6, 0]];

修正

  • レベルアップ時にfの枠が更新されない問題を解決