Guest User

Untitled

a guest
Sep 9th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.29 KB | None | 0 0
  1.  
  2. local function randomColor()
  3.     return {random(90,255),random(90,255),random(90,255)}
  4. end
  5.  
  6. local function getNearbyCoords(x,y)
  7.     return {
  8.         {x,y+1},
  9.         {x+1,y+1},
  10.         {x+1,y},
  11.         {x+1,y-1},
  12.         {x,y-1},
  13.         {x-1,y-1},
  14.         {x-1,y},
  15.         {x-1,y+1},
  16.     }
  17. end
  18.  
  19. local function randomEntry(t)
  20.     return t[random(#t)]
  21. end
  22.  
  23. local function bindCords(x,y)
  24.     local x,y = x,y
  25.     if(x>laenge) then x = laenge end
  26.     if(x<1) then x = 1 end
  27.     if(y>hoehe) then y = hoehe end
  28.     if(y<1) then y = 1 end
  29. end
  30.  
  31. local function isPheromone(x,y)
  32.     for k,v in pairs(pheromone) do
  33.         if(v.x == x and v.y == y) then
  34.             return true
  35.         end
  36.     end
  37.     return false
  38. end
  39.  
  40. local function isFood(x,y)
  41.     for k,v in pairs(sources) do
  42.         if(v.x == x and v.y == y) then
  43.             return true
  44.         end
  45.     end
  46.     return false
  47. end
  48.  
  49. local function isNest(x,y)
  50.     return (nestX == x and nestY == y)
  51. end
  52.  
  53. local function takeFood(x,y)
  54.     for k,v in pairs(sources) do
  55.         if(v.x == x and v.y == y) then
  56.             v.amount = v.amount-1
  57.             foodTaken = foodTaken+1
  58.             if(v.amount <= 0) then
  59.                 sources[k] = nil
  60.  
  61.             end
  62.         end
  63.     end
  64. end
  65.  
  66. local function distanceBetween(x1,y1,x2,y2)
  67.     return math.sqrt((x2-x1)^2+(y2-y1)^2)
  68. end
  69.  
  70. function love.load(arg)
  71.     love.math.setRandomSeed(os.time())
  72.     random = love.math.random
  73.     require"settings"
  74.     love.window.setMode(laenge,hoehe,{})
  75.  
  76.     --Erstelle die Ameisen und setzte sie an den Anfang
  77.     ants = {}
  78.     for i = 1, ameisenAnzahl do
  79.         ants[#ants+1] = {x=nestX,y=nestY,carries=false,releasePheromon=false,mode="wandering"}
  80.     end
  81.  
  82.     --Erstelle die Futter Quellen
  83.     sources = {}
  84.     for i = 1, futterQuellen do
  85.         sources[#sources+1] = {amount=futterProQuelle,x=random(laenge),y=random(hoehe)}
  86.     end
  87.  
  88.     foodInNest = 0
  89.     foodTaken = 0
  90.  
  91.     --Lege Tabelle für Pheromone an
  92.     pheromone = {}
  93.  
  94.     movementTimer = 0
  95.  
  96.     sourceColor = randomColor()
  97.     nestColor = randomColor()
  98.     antColor = randomColor()
  99.     pheromoneColor = randomColor()
  100.  
  101. end
  102.  
  103. function love.update(dt)
  104.  
  105.     --Update die Timer
  106.     movementTimer = movementTimer+dt
  107.     for k,v in pairs(pheromone) do
  108.         v.timer = v.timer - dt
  109.     end
  110.  
  111.  
  112.  
  113.     if(movementTimer >= movementUpdate) then
  114.         movementTimer = 0
  115.         for k,v in pairs(ants) do
  116.  
  117.             if(v.carries) then
  118.                 v.mode = "returning"
  119.             end
  120.  
  121.                 local nearby = getNearbyCoords(v.x,v.y)
  122.                 local nearbyPheromones = {}
  123.                 local nearbyFood = {}
  124.                 for _,j in pairs(nearby) do
  125.                     if(isPheromone(j[1],j[2])) then
  126.                         table.insert(nearbyPheromones,{j[1],j[2],distanceBetween(j[1],j[2],nestX,nestY)})
  127.                     end
  128.                     if(isFood(j[1],j[2])) then
  129.                         table.insert(nearbyFood,{j[1],j[2]})
  130.                     end
  131.                 end
  132.             if(v.mode=="wandering") then
  133.                 if(#nearbyFood>0) then
  134.                     v.x,v.y = nearbyFood[1][1],nearbyFood[1][2]
  135.                     v.mode = "returning"
  136.                     v.carries = true
  137.                     v.releasePheromon = true
  138.                     takeFood(v.x,v.y)
  139.                 elseif(#nearbyPheromones>0) then
  140.                     if(#nearbyPheromones==1) then
  141.                         v.x,v.y = nearbyPheromones[1][1],nearbyPheromones[1][2]
  142.                     else
  143.                         local farest = {0,0,0}
  144.                         for _,j,v in pairs(nearbyPheromones) do
  145.                             if(j[3]>farest[3]) then
  146.                                 farest = j
  147.                             end
  148.                         end
  149.                         v.x,v.y = farest[1],farest[2]
  150.                     end
  151.                     v.mode="following"
  152.                 else
  153.                     randomCord = randomEntry(nearby)
  154.                     v.x,v.y = randomCord[1],randomCord[2]
  155.                 end
  156.             elseif(v.mode=="returning") then
  157.                 local nearest = {0,0,hoehe*laenge} --Ich könnte hier auch einfach eine große Zahl benutzen, damit die distance am anfang "zu groß" ist.
  158.                 for _,j in pairs(nearby) do
  159.                     local dist = distanceBetween(j[1],j[2],nestX,nestY)
  160.                     if(dist<nearest[3]) then
  161.                         nearest = {j[1],j[2],dist}
  162.                     end
  163.                 end
  164.                 if(isPheromone(v.x,v.y)) then
  165.  
  166.                 else
  167.                     pheromone[#pheromone+1] = {x=v.x,y=v.y,timer=sekundenBisPheromonZuende}
  168.                 end
  169.                 v.x,v.y = nearest[1],nearest[2]
  170.             elseif(v.mode=="following") then
  171.                 if(#nearbyPheromones>0) then
  172.                     local farest = {0,0,-1}
  173.                     for _,l in pairs(nearbyPheromones) do
  174.                         if(l[3]>farest[3]) then
  175.                             farest = l
  176.                         end
  177.                     end
  178.                     if(#nearbyFood>0) then
  179.                         v.x,v.y = nearbyFood[1][1],nearbyFood[1][2]
  180.                         takeFood(v.x,v.y)
  181.                         v.mode = "returning"
  182.                     else
  183.                         v.x,v.y = farest[1],farest[2]
  184.                     end
  185.                 else
  186.                     v.mode = "wandering"
  187.                     randomCord = randomEntry(nearby)
  188.                     v.x,v.y = randomCord[1],randomCord[2]
  189.                 end
  190.             end
  191.  
  192.             if(v.x == nestX and v.y == nestY) then
  193.                 if(v.carries) then
  194.                     v.mode = "wandering"
  195.                     v.carries = false
  196.                     foodInNest = foodInNest+1
  197.                 end
  198.             end
  199.         end
  200.     end
  201.  
  202.     for k,v in pairs(sources) do
  203.         --print(v.amount)
  204.     end
  205.  
  206. end
  207.  
  208. function love.draw(dt)
  209.     love.graphics.clear()
  210.  
  211.     --Zeichne Pheromone
  212.     love.graphics.setColor(unpack(pheromoneColor))
  213.     for k,v in pairs(pheromone) do
  214.         if(v.timer > 0) then
  215.             love.graphics.point(v.x,v.y)
  216.         else
  217.             pheromone[k] = nil
  218.         end
  219.     end
  220.  
  221.     --Zeichne Nest
  222.     love.graphics.setColor(unpack(nestColor))
  223.     love.graphics.point(nestX,nestY)
  224.  
  225.     --Zeiche alle Ameisen
  226.     love.graphics.setColor(unpack(antColor))
  227.     for k,v in pairs(ants) do
  228.         love.graphics.point(v.x,v.y)
  229.     end
  230.  
  231.     --Zeichne alle Futterquellen
  232.     love.graphics.setColor(unpack(sourceColor))
  233.     for k,v in pairs(sources) do
  234.         love.graphics.point(v.x,v.y)
  235.     end
  236.  
  237.     love.graphics.setColor(255,255,255)
  238.     love.graphics.print("Food Taken:"..foodTaken,10,10)
  239.     love.graphics.print("Food in nest:"..foodInNest,10,25)
  240.  
  241. end
Advertisement
Add Comment
Please, Sign In to add comment