【スプレッドシート入門】オセロを作ってみる!②

Googleスプレッドシート
  • スプレッドシートとGASで作るオセロの第2回です。
  • 第2回は実際に石を置く動作を処理していきます。
スポンサーリンク

処理のイメージから作る

石を置く動作を関数にする

前回、スプレッドシートとGASを使って、オセロの初期の盤面を作成しました。

今回は石を置きますが、初めから簡素に作成することを想定して、石を置く動作を関数として記載する部分から作成していきます。

とはいえ、指定した場所に石を設置するだけなので、イメージは、「setStone(5, 6, -1)」といった記載です。

初期盤面からの流れ

実際に石を置く関数を初期盤面から続けて書くと、次のようになります。

function myFunction() {
  const gameSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = gameSpreadSheet.getActiveSheet();
  for (let i = 1; i <= 8; i++){
  for (let j = 1; j <= 8; j++){
    sheet.getRange(i, j).setValue(0);
  }
  }
  sheet.getRange(4,4).setValue(1);
  sheet.getRange(5,5).setValue(1);
  sheet.getRange(4,5).setValue(-1);
  sheet.getRange(5,4).setValue(-1);
  setStone(5, 6, -1)
  setStone(6, 6, 1)
}

これにより、F5に「-1」が設置され、F6に「1」が設置されるというイメージです。

関数の中身を入れる

関数の中身のイメージ

あとは、この入力内容に合わせて、関数を作成していくだけです。

イメージは依然Pythonで作成したときと同様、次能な手順です。

  1. 8方向を順番にチェックする
  2. 相手の石があったらその先をチェックする
  3. その先に自分の石があったら間をすべて自分の石にする

実装する

あとは、これをIF文やFor文を使って処理をしていくだけです。

実装は次のようになります。

function setStone(c, r, s){
  const gameSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = gameSpreadSheet.getActiveSheet();
  var flag = false
  if (sheet.getRange(c, r).getValue() == 0) {
    for (let i = -1; i <= 1; i++){
    for (let j = -1; j <= 1; j++){
      if (sheet.getRange(c + i, r + j).getValue() == -1 * s){
        for (let k = 2; k <= 8 ; k ++){
          if (c + i * k < 1) continue;
          if (r + j * k < 1) continue;
          if (sheet.getRange(c + i * k, r + j * k).getValue() == s){
            for (let l = 0; l < k ; l ++){
              sheet.getRange(c + i * l, r + j * l).setValue(s)
            }
          }
        }
      }
    }
    }
  }

注意点は、はみ出ないように判定する場所の行番号や列番号が1未満になれば離脱するという部分です。

これを入れないと、「too small」という形でエラーが吐き出されてしまいます。

うまくいくと、次のように2手進んだ局面が現れます。

コメント

タイトルとURLをコピーしました