Advertisement
Forgotten_Boy

Conway's Life by Vilsol

Oct 23rd, 2013
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Original by Vilsol in pastebin gjG6MXHq
  2. --
  3. -- Added initializing screen with 8 gliders to form a glider gun by Forgotten_Boy.
  4. board = {}
  5. tArgs = { ... }
  6. generation = 0
  7. sleeptime = 0.5
  8.  
  9. if(tArgs[1] == "left" or tArgs[1] == "right" or tArgs[1] == "top" or tArgs[1] == "bottom" or tArgs[1] == "front" or tArgs[1] == "back")then
  10.     mon = peripheral.wrap(tArgs[1])
  11. else
  12.     mon = term
  13. end
  14.  
  15. if(mon.isColor() or mon.isColor)then
  16.     colored = true
  17. else
  18.     colored = false
  19. end
  20.  
  21. w, h = mon.getSize()
  22.  
  23. for x = 1, w do
  24.     board[x] = {}
  25.     for y = 1, h do
  26.         board[x][y] = 0
  27.     end
  28. end
  29.  
  30. function drawScreen()
  31.     w, h = mon.getSize()
  32.     for x = 1, w do
  33.         for y = 1, h do
  34.             nei = getNeighbours(x, y)
  35.             if(board[x][y] == 1)then
  36.                 if colored then
  37.                     if(nei < 2 or nei > 3)then
  38.                         mon.setBackgroundColor(colors.red)
  39.                     else
  40.                         mon.setBackgroundColor(colors.green)
  41.                     end
  42.                 else
  43.                     mon.setBackgroundColor(colors.white)
  44.                 end
  45.             else
  46.                 if colored then
  47.                     if(nei == 3)then
  48.                         mon.setBackgroundColor(colors.yellow)
  49.                     else
  50.                         mon.setBackgroundColor(colors.black)
  51.                     end
  52.                 else
  53.                     mon.setBackgroundColor(colors.black)
  54.                 end
  55.             end
  56.             mon.setCursorPos(x, y)
  57.             mon.write(" ")
  58.         end
  59.     end
  60.     mon.setCursorPos(1,1)
  61.     if colored then
  62.         mon.setTextColor(colors.blue)
  63.     end
  64.     mon.write(generation)
  65. end
  66.  
  67. function getNeighbours(x, y)
  68.     w, h = mon.getSize()
  69.     total = 0
  70.     if(x > 1 and y > 1)then if(board[x-1][y-1] == 1)then total = total + 1 end end
  71.     if(y > 1)then if(board[x][y-1] == 1)then total = total + 1 end end
  72.     if(x < w and y > 1)then if(board[x+1][y-1] == 1)then total = total + 1 end end
  73.     if(x > 1)then if(board[x-1][y] == 1)then total = total + 1 end end
  74.     if(x < w)then if(board[x+1][y] == 1)then total = total + 1 end end
  75.     if(x > 1 and y < h)then if(board[x-1][y+1] == 1)then total = total + 1 end end
  76.     if(y < h)then if(board[x][y+1] == 1)then total = total + 1 end end
  77.     if(x < w and y < h)then if(board[x+1][y+1] == 1)then total = total + 1 end end
  78.     return total
  79. end
  80.  
  81. function compute()
  82.     w, h = mon.getSize()
  83.     while true do
  84.         newBoard = {}
  85.         for x = 1, w do
  86.             newBoard[x] = {}
  87.             for y = 1, h do
  88.                 nei = getNeighbours(x, y)
  89.                 if(board[x][y] == 1)then
  90.                     if(nei < 2)then
  91.                         newBoard[x][y] = 0
  92.                     elseif(nei > 3)then
  93.                         newBoard[x][y] = 0
  94.                     else
  95.                         newBoard[x][y] = 1
  96.                     end
  97.                 else
  98.                     if(nei == 3)then
  99.                         newBoard[x][y] = 1
  100.                     end
  101.                 end
  102.             end
  103.         end
  104.         board = newBoard
  105.         generation = generation + 1
  106.         sleep(sleeptime)
  107.     end
  108. end
  109.  
  110. function loop()
  111.     while true do
  112.         event, variable, xPos, yPos = os.pullEvent()
  113.         if event == "mouse_click" or event == "monitor_touch" or event == "mouse_drag" then
  114.             if variable == 1 then
  115.                 board[xPos][yPos] = 1
  116.             else
  117.                 board[xPos][yPos] = 0
  118.             end
  119.         end
  120.         if event == "key" then
  121.             if tostring(variable) == "28" then
  122.                 return true
  123.             elseif tostring(variable) == "57" then
  124.                 if(mon.isColor() or mon.isColor)then
  125.                     colored = not colored
  126.                 end
  127.             elseif tostring(variable) == "200" then
  128.                 if sleeptime > 0.1 then
  129.                     sleeptime = sleeptime - 0.1
  130.                 end
  131.             elseif tostring(variable) == "208" then
  132.                 if sleeptime < 1 then
  133.                     sleeptime = sleeptime + 0.1
  134.                 end
  135.             end
  136.         end
  137.         drawScreen()
  138.     end
  139. end
  140.  
  141. function intro()
  142.     mon.setBackgroundColor(colors.black)
  143.     mon.clear()
  144.     mon.setCursorPos(1,1)
  145.     mon.write("Conway's Game Of Life")
  146.     mon.setCursorPos(1,2)
  147.     mon.write("It is a game which represents life.")
  148.     mon.setCursorPos(1,3)
  149.     mon.write("The game runs by 4 basic rules:")
  150.     mon.setCursorPos(1,4)
  151.     mon.write("1. If a cell has less than 2 neighbours, it dies.")
  152.     mon.setCursorPos(1,5)
  153.     mon.write("2. If a cell has 2 or 3 neightbours, it lives.")
  154.     mon.setCursorPos(1,6)
  155.     mon.write("3. If a cell has more than 3 neighbours, it dies.")
  156.     mon.setCursorPos(1,7)
  157.     mon.write("4. If a cell has exactly 3 neighbours it is born.")
  158.     mon.setCursorPos(1,9)
  159.     mon.write("At the top left is the generation count.")
  160.     mon.setCursorPos(1,10)
  161.     mon.write("Press spacebar to switch between color modes")
  162.     mon.setCursorPos(1,11)
  163.     mon.write("Press enter to start  the game")
  164.     mon.setCursorPos(1,13)
  165.     mon.write("Colors:")
  166.     mon.setCursorPos(1,14)
  167.     mon.write("Red - Cell will die in next generation")
  168.     mon.setCursorPos(1,15)
  169.     mon.write("Green - Cell will live in next generation")
  170.     mon.setCursorPos(1,16)
  171.     mon.write("Yellow - Cell will be born in next generation")
  172.     mon.setCursorPos(1,18)
  173.     mon.write("Press any key to continue!")
  174.     event, variable, xPos, yPos = os.pullEvent("key")
  175. end
  176.  
  177.  
  178. if (w >=47) then
  179. -- initialize the screen with 8 gliders to synthesize a glider gun
  180.     print(" Gosper Gun initializing...")
  181.     x = 1
  182.     y = 1
  183.     data = "16bo30b$16bobo16bo11b$16b2o17bobo9b$obo10bo21b2o10b$b2o11b2o31b$bo11b2o32b3$10b2o20b2o13b$11b2o19bobo9b3o$10bo21bo11bo2b$27bo17bob$27b2o18b$26bobo!"
  184.     for one in string.gmatch(data, "%d*[%w$!]") do
  185.         count = 1
  186.         start, fin = string.find(one, "%d*")
  187.         token  = string.sub(one, start, fin)
  188.         kind = string.sub(string.reverse(one), 1, 1)
  189.         if (token) then
  190.             count = tonumber(token)
  191.         end
  192.         for counter = 1, count or 1 do
  193.             if(kind == "!") then
  194.                 --eof, begin the show
  195.                 break
  196.             elseif (kind == "$") then
  197.                 y = y + 1
  198.                 x = 1
  199.             elseif (kind == "b") then
  200.                 x = x + 1
  201.             elseif (kind == "o") then
  202.                 board[x][y] = 1
  203.                 x = x + 1
  204.             end
  205.         end
  206.     end
  207.     sleep(1)
  208.     sleeptime = 0.1
  209. end
  210.  
  211. intro()
  212. drawScreen()
  213. while true do
  214.     loop()
  215.     parallel.waitForAny(loop, compute)
  216. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement