From 5acf1694ee9b1e8656dbbc7592d18908fe119591 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 13 Sep 2019 20:59:12 +0300 Subject: [PATCH] Separate command queue --- src/queue.cr | 15 +++++++++++++++ src/village.cr | 21 ++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/queue.cr b/src/queue.cr index ec5a056..9d531aa 100644 --- a/src/queue.cr +++ b/src/queue.cr @@ -1,10 +1,25 @@ class App::CommandQueue def initialize + @data = [] of {Int32, Command} end def push(ts : Int32, cmd : Command) + @data.push({ts, cmd}) + @data.sort! do |x| + -x[0] + end end def pop(ts : Int32) : Command | Nil + if @data.size == 0 + return nil + end + last_ts = @data[-1][0] + if last_ts <= ts + last_item = @data.pop + return last_item[1] + else + nil + end end end diff --git a/src/village.cr b/src/village.cr index 4174003..3722264 100644 --- a/src/village.cr +++ b/src/village.cr @@ -1,3 +1,5 @@ +require "./queue" + class Resources def initialize @wood = 0 @@ -146,7 +148,7 @@ class World def initialize @resources = Resources.new @map = Map.new - @queue = Array(Command).new + @queue = App::CommandQueue.new end def resources @@ -162,21 +164,18 @@ class World return false end printf "push command %d\n", command.ts - @queue.push(command) - @queue.sort! do |c| - -c.ts - end + @queue.push(command.ts, command) true end def run(ts : Int32) - while @queue.size != 0 - c = @queue.pop - printf "pop command %d\n", c.ts - if c.ts > ts + loop do + cmd = @queue.pop(ts) + if cmd.nil? break end - c.run(self) + printf "pop command %d\n", cmd.ts + cmd.run(self) end printf "Wood: %d\n", @resources.wood end @@ -186,4 +185,4 @@ w = World.new w.map.print w.push(BuildMillCommand.new(0)) w.push(BuildForesterHouseCommand.new(0)) -w.run(100) +w.run(20)