処理のイメージから作る
石を置く動作を関数にする
前回、スプレッドシートと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で作成したときと同様、次能な手順です。
- 8方向を順番にチェックする
- 相手の石があったらその先をチェックする
- その先に自分の石があったら間をすべて自分の石にする
実装する
あとは、これを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手進んだ局面が現れます。
コメント