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