読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

オセロプログラム

プログラム全般

とりあえず掲示板側で展開されている話には関わらないでおきますが。
オセロと聞いて、数ヶ月前に暇潰しに作った javascript 用のオセロチェックプログラムの事を思い出したので、晒してみます。(チェックの部分だけ抜粋)
……本当はリファクタリングしたいところが大量にあるけど、あえて当時組んだままで。(一応、動作確認済)

// オセロ盤
var _table = new Array();
for (var j = 0; j < 8; j++) {
  _table[j] = new Array();
  for (var i = 0; i < 8; i++) {
    _table[j][i] = 0;
  }
}
_table[3][3] = 1;
_table[3][4] = -1;
_table[4][3] = -1;
_table[4][4] = 1;

var _current = 1;

// チェック用変数
var _checker = new Array();
_checker[0] = new Array(-1, -1);
_checker[1] = new Array(-1, 0);
_checker[2] = new Array(-1, 1);
_checker[3] = new Array(0, -1);
_checker[4] = new Array(0, 1);
_checker[5] = new Array(1, -1);
_checker[6] = new Array(1, 0);
_checker[7] = new Array(1, 1);

// (rowindex, colindex) に _current を置けるかチェックする
//  [in]
//    rowindex : チェックする場所 (Y)
//    colindex : チェックする場所 (X)
var check = function(rowindex, colindex, current) {
  var result = new Array(0, 0, 0, 0, 0, 0, 0, 0); // (rowindex, colindex) から放射線状に反転する数を保持する
  var finflag = new Array(0, 0, 0, 0, 0, 0, 0, 0); // 作業用変数
  var checkcol = 0;
  var checkrow = 0;
  var stamp = false;
  if (rowindex < 2) {
    finflag[0] = 1;
    finflag[1] = 1;
    finflag[2] = 1;
  }
  if (5 < rowindex) {
    finflag[5] = 1;
    finflag[6] = 1;
    finflag[7] = 1;
  }
  if (colindex < 2) {
    finflag[3] = 1;
  }
  if (5 < colindex) {
    finflag[4] = 1;
  }
  for (var k = 1; k < 8; k++) {
    stamp = false;
    for (var l = 0; l < 8; l++) {
      if (finflag[l] == 1) {
        continue;
      }
      checkrow = rowindex + _checker[l][0] * k;
      checkcol = colindex + _checker[l][1] * k;
      if ((_checker[l][0] == 0 && (checkcol == 0 || checkcol == 7))
            || (_checker[l][1] == 0 && (checkrow == 0 || checkrow == 7))
            || (_checker[l][0] != 0 && _checker[l][1] != 0 &&  (checkcol == 0 || checkcol == 7 || checkrow == 0 || checkrow == 7))) {
        if (_table[checkrow][checkcol] != _current) {
          result[l] = 0;
        }
        finflag[l] = 1;
        continue;
      }
      if (result[l] != 0 && _table[checkrow][checkcol] == _current) {
        finflag[l] = 1;
        continue;
      } else if (_table[checkrow][checkcol] == 0 || _table[checkrow][checkcol] == _current) {
        result[l] = 0;
        finflag[l] = 1;
        continue;
      }
      result[l]++;
      stamp |= true;
    }
    if (!stamp) {
      break;
    }
  }
  return result;
}

我ながら、結構面倒な書き方してるなぁ。(わざとなところもある)
……別に読んでみろと云う訳ではないですが、こんな解法もあるよ、と云う一例として。