康威的生命游戏:为啥模式行为不正确?

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() 从表 fieldnfield 的值分配中,反之亦然。我可能做错了什么?

-- 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

变量displaykeyboardevents 是库。

【问题讨论】:

你有一个错字livivngCells 哦,我明白了。原来这是代码的唯一问题,谢谢 【参考方案1】:

原来唯一的问题是if field[x][y]==0 and livivngCells==3 then 行中的livingCells 拼写错误。

【讨论】:

以上是关于康威的生命游戏:为啥模式行为不正确?的主要内容,如果未能解决你的问题,请参考以下文章

这么简单的游戏还卡壳?神经网络在「生命游戏」里苦苦挣扎

康威生命游戏_学习记录

为啥我的神经网络不能正确分类这些井字游戏模式?

康威生命游戏的简单动画与 FuncAnimation

优化康威的“生命游戏”

ruby 康威的生命游戏 - 版本1