game of life 8

初代行列をフリーハンドで設定する。

local stringPen = "PEN UP"
local stringEraser = "ERASER UP"
local posX, posY = 0, 0
local posC, posR = 1, 1 
local penDown = false 
local eraserDown = false

-- 行列のサイズを決める。
local rdim, cdim = 7, 7

-- セルの一辺の長さを決める。
local sideLen = 25

-- 画面サイズを決める。
local screenW, screenH = sideLen * cdim, sideLen * rdim 

-- 空行列を作る
local mat = {}
for r = 1, rdim do
   mat[r] = {}
   for c = 1, cdim do
      mat[r][c] = 0
   end
end
function on.paint(gc)
   if penDown and mat[posR][posC] == 0 then mat[posR][posC] = 1 -- 行列に 1 を代入     
   elseif eraserDown and mat[posR][posC] == 1 then mat[posR][posC] = 0 -- 行列に 0 を代入
   end
   var.store("mat", mat) -- あとで再現できるよう、できた行列を nspire 側に保存しておく
   for r = 1, rdim do
      for c = 1, cdim do
         if mat[r][c] == 1 then
            gc:setColorRGB(0, 0, 0)
            gc:fillRect((c - 1) * sideLen, (r - 1) * sideLen, sideLen, sideLen) -- 行列の要素が 1 だったら塗る
         end
         gc:setColorRGB(209,209,209)
         gc:setFont("serif", "r", 7)
         gc:drawString(mat[r][c], (c - 1) * sideLen, (r - 1) * sideLen, "top") -- 確認のため行列の要素を表示する           
      end
   end
   gc:setColorRGB(0,0,0)
   gc:drawRect((posC -1) * sideLen, (posR - 1) * sideLen, sideLen, sideLen) -- カーソルの位置に目印の枠を出す
   gc:drawString(stringPen, 230, 0) -- ペンの状態を表示する
   gc:drawString(stringEraser, 230, 15) -- 消しゴムの状態を表示する
   gc:drawString("x = "..posX, 230, 30) -- x 座標を表示する
   gc:drawString("y = "..posY, 270, 30) -- y 座標を表示する
   gc:drawString("Col = "..posC, 230, 45) -- 列番号を表示する
   gc:drawString("Row = "..posR, 270, 45) -- 行番号を表示する
end

--[[ 中央値函数
function median(lowerLimit, x, upperLimit)
   return math.max(lowerLimit, math.min(x, upperLimit))
end--]]
function on.mouseDown() -- 左クリックでペンを下ろす
   stringPen = "PEN DOWN"
   penDown = true
   platform.window:invalidate()
end
function on.mouseUp()
   stringPen = "PEN UP"
   penDown = false
   platform.window:invalidate()
end
function on.rightMouseDown() --右クリックで消しゴムを下ろす
   eraserDown = true
   stringEraser = "ERASER DOWN"
   platform.window:invalidate()
end
function on.rightMouseUp()
   eraserDown = false
   stringEraser = "ERASER UP"
   platform.window:invalidate()
end
function on.mouseMove(x, y)
   posX, posY = x, y
   posC = math.floor(posX/(screenW/cdim)) + 1 -- x 座標を列番号にマッピングする。 
   posC = math.max(1, math.min(posC, cdim)) -- 列数をはみ出さないようにする。
   posR = math.floor(posY/(screenH/rdim)) + 1 -- y 座標を行番号にマッピングする。
   posR = math.max(1, math.min(posR, rdim)) -- 行数をはみ出さないようにする。
   platform.window:invalidate()
end