康威的生命游戏:为啥模式行为不正确?
Posted
技术标签:
【中文标题】康威的生命游戏:为啥模式行为不正确?【英文标题】:Conway's Game Of Life: Why patterns behave incorrectly?康威的生命游戏:为什么模式行为不正确? 【发布时间】:2020-11-21 16:56:28 【问题描述】:我正在尝试在 Lua 中创建 Conway 的生命游戏的实现。
游戏场是一个有 100 行 47 列(总共 4700 个单元格)的二维圆形表,其中一个单元格的值可以是 1(活着)或 0(死)。
问题是当我尝试创建一个 blinker 并制作 3 个彼此相邻的活细胞的模式时,两个侧细胞在下一代中死亡,而没有其他细胞成为活细胞。我也尝试过创建一个滑翔机,但在下一代中,它的中上单元和左下单元死亡,然后图案变得静止。
当我尝试调试时,所有变量似乎都有正确的值,所以我认为问题出在函数 nextGen()
从表 field
到 nfield
的值分配中,反之亦然。我可能做错了什么?
-- Game window's width and height.
-- Rows 48, 49, and 50 are used for control tips and program information
local width = 100
local height = 50
-- Current generation field
local field =
-- Next generation field
local nfield =
-- UI Color codes
local black = 0x000000
local white = 0xFFFFFF
-- Field clearing/generation
local function clearField()
-- Making the field array circular (code from https://***.com/a/63169007/12696005)
setmetatable(field,
__index = function(t,i)
local index = i%width
index = index == 0 and width or index
return t[index] end
)
--
for gx=1,width do
field[gx] =
nfield[gx] =
-- Making the field array circular pt.2
setmetatable(field[gx],
__index = function(t,i)
local index = i%height-3
index = index == 0 and height-3 or index
return t[index] end
)
--
for gy=1,height-3 do
field[gx][gy] = 0
end
end
end
--Field redraw
local function drawField(data)
for x=1, width do
for y=1,height-3 do
if data[x][y]==1 then
-- Alive cell
display.setBackgroundColor(white)
display.setForegroundColor(black)
else
-- Dead cell
display.setBackgroundColor(black)
display.setForegroundColor(white)
end
-- Drawing the cell
display.fillRectangle(x, y, 1, 1, " ")
end
end
end
--- Calculating next generation field
local function nextGen()
-- Going through all the table
for x=1,width do
for y=1,height-3 do
local livingCells = 0
-- Calculation of living cells around x:y
for i=x-1,x+1 do
for j=y-1,y+1 do
livingCells = livingCells + field[i][j]
end
end
-- Substracting the x:y cell from the overall amount
livingCells = livingCells - field[x][y]
-- Cell spawns
if field[x][y]==0 and livivngCells==3 then
nfield[x][y] = 1
-- Cell dies
elseif field[x][y]==1 and (livingCells < 2 or livingCells > 3) then
nfield[x][y] = 0
-- Remains the same
else
nfield[x][y] = field[x][y]
end
end
end
end
-- Game loop
clearField()
while true do
local lastEvent = events.listenFilter(filter)
-- Cell creation/deletion
if lastEvent[1] == "mouseClicked" and lastEvent[5] == "lmb" then
--State invertion and cell redrawing
if field[lastEvent[3]][lastEvent[4]]==1 then
field[lastEvent[3]][lastEvent[4]] = 0
display.setBackgroundColor(black)
display.setForegroundColor(white)
else
field[lastEvent[3]][lastEvent[4]] = 1
display.setBackgroundColor(white)
display.setForegroundColor(black)
end
display.fillRectangle(lastEvent[3], lastEvent[4], 1, 1, " ")
elseif lastEvent[1] == "key_pressed" then
-- Previous generation
if lastEvent[4] == keyboard.lbracket then
drawField(field)
-- Next generation
elseif lastEvent[4] == keyboard.rbracket then
display.setBackgroundColor(blue)
display.fillRectangle(1, height-2, width, 1, " ")
nextGen()
drawField(nfield)
for i=1,width do
for j=1,height-3 do
field[i][j] = nfield[i][j]
end
end
elseif lastEvent[4] == keyboard.backslash then
-- more code --
end
end
end
变量display
、keyboard
和events
是库。
【问题讨论】:
你有一个错字livivngCells
哦,我明白了。原来这是代码的唯一问题,谢谢
【参考方案1】:
原来唯一的问题是if field[x][y]==0 and livivngCells==3 then
行中的livingCells
拼写错误。
【讨论】:
以上是关于康威的生命游戏:为啥模式行为不正确?的主要内容,如果未能解决你的问题,请参考以下文章