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

Googleスプレッドシート
  • 手番の情報をシートに記載することで、石を設置するごとに手番を変更する操作を導入します
スポンサーリンク

手番情報は盤上に置く

シートに情報を置く

前回までで、実際に石を設置することができるようになりましたが、手番がいつまでも「1」のままでした。

そこで今回は、設置するごとに手番を変更する動作を入れたいと思います。

今回は、手番の情報は、裏側のGASではなく、操作性のわかりやすさも考慮し、シート上に設置します。

このように、可視化した方がよい情報や、GASでの処理をするごとに変更しつつも、長く情報を保持した方がよいものについては、シート上に設置する方がよいです。

Pythonだと、ゲームを開始してから終了するまで、Pythonの処理は動きっぱなしです。

これに対して、GoogleスプレッドシートのGASは、操作するごとに呼び出しているだけです。なので、GASに長期に保持すべき情報を持たせるのはあまり適切ではありません。

setStoneを変更する

とはsetStoneの関数を変更するだけです。

function setStone(c, r){
  var flag = false
  var s = sheet.getRange('K1').getValue()
  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)
            }
          }
        }
        sheet.getRange('K1').setValue(-s)
      }
    }
    }
  }
}

やっていることは非常に単純で、従前「s」として外から引っ張ってきていた変数を、setStoneの中に組み込み、シートから手番情報を読み取ってきているだけです。

重要なのは、手番の都度手番修正をする必要があるため、「-s」してあげていることです。

myfunctionも更新する

忘れてはならないのは、初期化の際に手番を1に固定することです。

したがって、myfunctionも修正する必要があります。

const gameSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var sheet = gameSpreadSheet.getActiveSheet();

function myFunction() {
  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);
  sheet.getRange('K1').setValue(1);
}

毎回ゲーム開始のタイミングで、手番情報があるK1に「1」を入れるというだけなので、非常に単純ですが、忘れると毎回異なる手番からスタートしてしまうので、注意が必要です。

コメント

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