FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ライツアウト亜種の攻略法を考える

ライツアウト(lights out)とは、全てのマスのライトをつけるパズルゲーム。
クリックすると上下左右のマスのオン/オフが切り替わる。
Tacoyaki+ - Flash game は、ブラウザでできるライツアウトのひとつ。

ライツアウトの解法は検索すればすぐに見つかる。
点灯パズル自動解答(ライツアウト) のような、とても便利なページもある。

このライツアウトの亜種で、クリックすると斜め45度のマスが全て切り替わるパズルゲームがある。
Tacoyaki - Flash game
この解法は、ネットで調べても見つけられなかった。

しょうがないので攻略法を考えるべく、シミュレートするプログラムを作った。
以下はシミュレート結果の例
○○○○○
☆○●○○
○○○●○
○○○○☆
○○○★○
○●○○○
●○☆○○
○☆○●○
○○●○●
○○○●○
○○★○○
○●○●○
○○○○○
○●○●○
○○★○○
○○○○○
○○★○○
○★○★○
○○★○○
○○○○○
初期状態はすべて白で、星がクリックしたマス。
ゲームページ下のTipsにも書いてあるが、
「斜め45度の辺からなる任意の四角形の頂点4つを全てクリックすると、頂点のオン/オフだけ切り替わる」
という法則がある。これがわかるだけで解くのがかなり楽になる。
シミュレートで見つけたパターンと運に助けられて、7×7マスのステージをクリアできた。

JavaScriptで作ったシミュレートクラスのプログラムを載せておく。
Array.indexOf()をサポートしていないブラウザでは動かないので注意。
/**
 * @namespace
 */
var mitako1 = {};

/**
 * Takoyakiクラス
 * @param {number} num 一辺のマスの数
 * @constructor
 */
mitako1.Tako = function(num) {
  /**
   * 一辺のマスの数
   * @type {number}
   */
  this.num = num;
  /**
   * 各マスのオン・オフ状態。オンなら1,オフなら-1
   * 座標(x, y)のマスはboxst[x][y]になる
   * @type {Array.<Array.<number>>}
   */
  this.boxst = [];
  /**
   * 移動方向配列
   * [x軸方向,y軸方向]
   * @type {Array.<Array.<number>>}
   * @private
   */
  this.dirc_ = [[-1, -1], [-1, 1], [1, -1], [1, 1]];
};
/**
 * 初期化
 */
mitako1.Tako.prototype.init = function() {
  this.boxst = [], num = this.num;
  for (var i = 0; i < num; i++) {
    this.boxst.push([]);
    for (var j = 0; j < num; j++) {
      this.boxst[i][j] = -1;
    }
  }
};
/**
 * マスをクリックする
 * @param {number} x マスのX座標。左端を0とする
 * @param {number} y マスのY座標。上端を0とする
 */
mitako1.Tako.prototype.click = function(x, y) {
  this.boxst[x][y] *= -1;
  var tx, ty, num = this.num;
  for (var i = 0; i < this.dirc_.length; i++) {
    tx = x;
    ty = y;
    dx = this.dirc_[i][0];
    dy = this.dirc_[i][1];
    tx += dx;
    ty += dy;
    while (tx >= 0 && tx < num && ty >= 0 && ty < num) {
      this.boxst[tx][ty] *= -1;
      tx += dx;
      ty += dy;
    }
  }
};
/**
 * マスの状態を表示する
 * @param {Array.<Array.<number>>=} star 星型にする座標配列
 * @return {string} 出力結果。オンが黒、オフが白
 */
mitako1.Tako.prototype.disp = function(star) {
  var outstr = '', num = this.num;
  var sxy = [];
  if (star) {
    for (var i = 0; i < star.length; i++) {
      sxy.push(star[i][0] * num + star[i][1]);
   }
  }
  for (var i = 0; i < num; i++) {
    for (var j = 0; j < num; j++) {
      if (this.boxst[j][i] > 0) {
        if (sxy.indexOf(j * num + i) >= 0) {
         outstr += '★';
        } else {
         outstr += '●';
        }
      } else {
        if (sxy.indexOf(j * num + i) >= 0) {
         outstr += '☆';
        } else {
         outstr += '○';
        }
      }
    }
    outstr += '<br>';
  }
  return outstr;
};

もっと時間をかければ、ちゃんとした攻略法を見つけられそうな気がするがどうしようか。
スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

himax64

Author: 南西
30代後半の無職です。
就活もせずダラダラ生きてます。
作ったもの

最新記事
人気記事
検索フォーム
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QRコード
カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。