berlin-ai 0.0.33 → 0.0.34
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +2 -2
- data/README.md +4 -2
- data/bin/berlin-ai +29 -0
- data/data/Gemfile +9 -0
- data/data/ai.rb +7 -0
- data/data/config.ru +3 -0
- data/lib/ai/map.rb +5 -15
- data/lib/ai/map_internal.rb +2 -1
- data/lib/ai/node.rb +13 -3
- data/lib/version.rb +1 -1
- data/test/map_test.rb +21 -8
- data/test/node_test.rb +16 -1
- metadata +6 -2
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
berlin-ai (0.0.
|
4
|
+
berlin-ai (0.0.33)
|
5
5
|
rainbow (~> 1.1.4)
|
6
6
|
sinatra (= 1.4.3)
|
7
7
|
sinatra-contrib (= 1.4.1)
|
@@ -17,7 +17,7 @@ GEM
|
|
17
17
|
eventmachine (1.0.3)
|
18
18
|
method_source (0.8.2)
|
19
19
|
minitest (4.7.5)
|
20
|
-
multi_json (1.
|
20
|
+
multi_json (1.8.0)
|
21
21
|
pry (0.9.12.2)
|
22
22
|
coderay (~> 1.0.5)
|
23
23
|
method_source (~> 0.8)
|
data/README.md
CHANGED
@@ -64,7 +64,7 @@ Helper methods to work with nodes.
|
|
64
64
|
```ruby
|
65
65
|
map.directed? # Determine if a path from A to B is A -> B (directed) or A <-> B (not directed)
|
66
66
|
map.nodes # All the nodes.
|
67
|
-
map.owned_nodes #
|
67
|
+
map.owned_nodes # Your nodes, including those with 0 soldiers.
|
68
68
|
map.enemy_nodes # Enemy nodes.
|
69
69
|
map.free_nodes # Nodes not controlled by anyone.
|
70
70
|
map.foreign_nodes # Nodes not owned (i.e. enemy nodes and free nodes).
|
@@ -77,6 +77,7 @@ Node objects obtained when querying the map.
|
|
77
77
|
|
78
78
|
```ruby
|
79
79
|
node.id # Id of the node.
|
80
|
+
node.map # The map to which the node belongs to
|
80
81
|
node.type # Type of node.
|
81
82
|
node.player_id # Owner of the node.
|
82
83
|
node.number_of_soldiers # Number of soldiers on the node.
|
@@ -85,7 +86,8 @@ node.available_soldiers # Owned remaining soldiers on this node (result fr
|
|
85
86
|
node.==(other) # Check if two nodes are the same.
|
86
87
|
node.adjacent?(other_node) # Check if two nodes are adjacents.
|
87
88
|
node.occupied? # Check if some soldiers are on the node.
|
88
|
-
node.owned? # Check if you
|
89
|
+
node.owned? # Check if a player (not only you) owns the node.
|
90
|
+
node.mine? # Check if you own the node.
|
89
91
|
node.free? # Check if no one own the node.
|
90
92
|
node.owned_by?(player_id) # Check if the node is owned by a given player.
|
91
93
|
node.adjacent_nodes # Get a list of adjacent nodes.
|
data/bin/berlin-ai
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
parser = OptionParser.new do |opts|
|
8
|
+
opts.banner = 'Usage: berlin-ai [options]'
|
9
|
+
|
10
|
+
opts.on("--init=NAME") do |name|
|
11
|
+
options[:name] = name
|
12
|
+
end
|
13
|
+
end.parse!
|
14
|
+
|
15
|
+
require File.expand_path('../../lib/version', __FILE__)
|
16
|
+
|
17
|
+
name = options[:name]
|
18
|
+
|
19
|
+
Dir.mkdir name
|
20
|
+
|
21
|
+
%w(Gemfile config.ru ai.rb).each do |file|
|
22
|
+
path = File.expand_path("../../data/#{file}", __FILE__)
|
23
|
+
template = ERB.new(File.read(path))
|
24
|
+
|
25
|
+
File.open(File.expand_path("./#{name}/#{file}"), "w") do |f|
|
26
|
+
f.puts template.result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/data/Gemfile
ADDED
data/data/ai.rb
ADDED
data/data/config.ru
ADDED
data/lib/ai/map.rb
CHANGED
@@ -15,37 +15,27 @@ module Berlin
|
|
15
15
|
|
16
16
|
# Returns an array of all owned nodes
|
17
17
|
def owned_nodes
|
18
|
-
nodes.select
|
19
|
-
node.owned_by?(@player_id)
|
20
|
-
end
|
18
|
+
nodes.select{ |n| n.mine? }
|
21
19
|
end
|
22
20
|
|
23
21
|
# Returns an array of all enemy nodes
|
24
22
|
def enemy_nodes
|
25
|
-
nodes.select
|
26
|
-
node.owned? && !owned_by?(@player_id)
|
27
|
-
end
|
23
|
+
nodes.select{ |n| n.enemy? }
|
28
24
|
end
|
29
25
|
|
30
26
|
# Returns an array of all free nodes
|
31
27
|
def free_nodes
|
32
|
-
nodes.select
|
33
|
-
node.free?
|
34
|
-
end
|
28
|
+
nodes.select{ |n| n.free? }
|
35
29
|
end
|
36
30
|
|
37
31
|
# Returns an array of all nodes that we don't owned
|
38
32
|
def foreign_nodes
|
39
|
-
nodes.reject
|
40
|
-
node.owned_by?(@player_id)
|
41
|
-
end
|
33
|
+
nodes.reject{ |n| n.mine? }
|
42
34
|
end
|
43
35
|
|
44
36
|
# We can now loop on our owned nodes in order to find our controlled nodes.
|
45
37
|
def controlled_nodes
|
46
|
-
owned_nodes.select
|
47
|
-
node.occupied?
|
48
|
-
end
|
38
|
+
owned_nodes.select{ |n| n.occupied? }
|
49
39
|
end
|
50
40
|
|
51
41
|
# Is the map directed?
|
data/lib/ai/map_internal.rb
CHANGED
@@ -21,7 +21,8 @@ module Berlin
|
|
21
21
|
# the node and how many soldiers there is. We'll get back to that later.
|
22
22
|
# map['nodes'] => [{:id => STRING}, ...]
|
23
23
|
data['nodes'].each do |node|
|
24
|
-
|
24
|
+
node_data = node.merge(types[node['type']]).merge(:map => map)
|
25
|
+
map.nodes_hash[node['id']] = Berlin::AI::Node.parse(node_data)
|
25
26
|
end
|
26
27
|
|
27
28
|
# Same thing here, with paths.
|
data/lib/ai/node.rb
CHANGED
@@ -6,12 +6,12 @@ module Berlin
|
|
6
6
|
class Node
|
7
7
|
include Internal
|
8
8
|
|
9
|
-
attr_accessor :id, :player_id, :number_of_soldiers, :incoming_soldiers,
|
9
|
+
attr_accessor :id, :map, :player_id, :number_of_soldiers, :incoming_soldiers,
|
10
10
|
:available_soldiers, :type, :soldiers_per_turn, :points
|
11
11
|
|
12
12
|
# Returns true if other_node is adjacent to self
|
13
13
|
def adjacent?(other_node)
|
14
|
-
@links.include?
|
14
|
+
@links.include?(other_node)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Returns true if self has more than zero soldier
|
@@ -24,6 +24,16 @@ module Berlin
|
|
24
24
|
!!@player_id
|
25
25
|
end
|
26
26
|
|
27
|
+
# Returns true if yours
|
28
|
+
def mine?
|
29
|
+
owned_by?(@map.player_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns true if owned by somebody else than you
|
33
|
+
def enemy?
|
34
|
+
owned? && !mine?
|
35
|
+
end
|
36
|
+
|
27
37
|
# Returns true if no one on the node
|
28
38
|
def free?
|
29
39
|
!owned?
|
@@ -41,7 +51,7 @@ module Berlin
|
|
41
51
|
|
42
52
|
# Returns a list of all adjacent nodes, plus self
|
43
53
|
def adjacent_nodes_and_self
|
44
|
-
adjacent_nodes.push(
|
54
|
+
adjacent_nodes.push(self)
|
45
55
|
end
|
46
56
|
end
|
47
57
|
end
|
data/lib/version.rb
CHANGED
data/test/map_test.rb
CHANGED
@@ -9,15 +9,16 @@ require "test/unit"
|
|
9
9
|
class MapTest < Test::Unit::TestCase
|
10
10
|
|
11
11
|
def setup
|
12
|
-
@node1 = Berlin::AI::Node.new(:id => 1, :player_id => 1)
|
13
|
-
@node2 = Berlin::AI::Node.new(:id => 2, :player_id => 1)
|
14
|
-
@node3 = Berlin::AI::Node.new(:id => 3, :player_id => nil)
|
15
|
-
@node4 = Berlin::AI::Node.new(:id => 4, :player_id => 2)
|
16
|
-
@node5 = Berlin::AI::Node.new(:id => 5, :player_id => 3)
|
17
|
-
|
18
12
|
@map = Berlin::AI::Map.new
|
19
13
|
@map.player_id = 1
|
20
|
-
|
14
|
+
|
15
|
+
@node1 = Berlin::AI::Node.new(:id => 1, :map => @map, :player_id => 1, :number_of_soldiers => 0)
|
16
|
+
@node2 = Berlin::AI::Node.new(:id => 2, :map => @map, :player_id => 1, :number_of_soldiers => 3)
|
17
|
+
@node3 = Berlin::AI::Node.new(:id => 3, :map => @map, :player_id => nil)
|
18
|
+
@node4 = Berlin::AI::Node.new(:id => 4, :map => @map, :player_id => 2)
|
19
|
+
@node5 = Berlin::AI::Node.new(:id => 5, :map => @map, :player_id => 3)
|
20
|
+
|
21
|
+
@map.nodes_hash = {1 => @node1, 2 => @node2, 3 => @node3, 4 => @node4, 5 => @node5}
|
21
22
|
end
|
22
23
|
|
23
24
|
def test_nodes_returns_an_array_of_all_nodes
|
@@ -28,8 +29,20 @@ class MapTest < Test::Unit::TestCase
|
|
28
29
|
assert_equal [@node1, @node2], @map.owned_nodes
|
29
30
|
end
|
30
31
|
|
31
|
-
def
|
32
|
+
def test_foreign_nodes_returns_an_array_of_nodes_that_the_current_player_does_not_owned
|
32
33
|
assert_equal [@node3, @node4, @node5], @map.foreign_nodes
|
33
34
|
end
|
34
35
|
|
36
|
+
def test_enemy_nodes_returns_an_array_of_nodes_owned_by_other_players
|
37
|
+
assert_equal [@node4, @node5], @map.enemy_nodes
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_free_nodes_returns_an_array_of_free_nodes
|
41
|
+
assert_equal [@node3], @map.free_nodes
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_controlled_nodes_returns_an_array_of_owned_nodes_with_at_least_one_soldier
|
45
|
+
assert_equal [@node2], @map.controlled_nodes
|
46
|
+
end
|
47
|
+
|
35
48
|
end
|
data/test/node_test.rb
CHANGED
@@ -18,7 +18,9 @@ class NodeTest < Test::Unit::TestCase
|
|
18
18
|
|
19
19
|
def test_reset_resets_all_turn_relative_data
|
20
20
|
node = Berlin::AI::Node.new(:number_of_soldiers => 2, :incoming_soldiers => 3, :available_soldiers => 4)
|
21
|
+
|
21
22
|
node.reset!
|
23
|
+
|
22
24
|
assert_equal 0, node.incoming_soldiers
|
23
25
|
assert_equal node.number_of_soldiers, node.available_soldiers
|
24
26
|
end
|
@@ -34,7 +36,7 @@ class NodeTest < Test::Unit::TestCase
|
|
34
36
|
assert !node1.adjacent?(node3)
|
35
37
|
end
|
36
38
|
|
37
|
-
def
|
39
|
+
def test_occupied_returns_true_if_the_node_has_at_least_one_soldier
|
38
40
|
node = Berlin::AI::Node.new
|
39
41
|
|
40
42
|
assert !node.occupied?
|
@@ -73,5 +75,18 @@ class NodeTest < Test::Unit::TestCase
|
|
73
75
|
|
74
76
|
assert node.owned?
|
75
77
|
end
|
78
|
+
|
79
|
+
def test_mine_returns_true_if_owned_by_current_player
|
80
|
+
Struct.new('Map', :player_id)
|
81
|
+
node = Berlin::AI::Node.new
|
82
|
+
|
83
|
+
node.map = Struct::Map.new(1)
|
84
|
+
|
85
|
+
assert !node.mine?
|
86
|
+
|
87
|
+
node.player_id = 1
|
88
|
+
|
89
|
+
assert node.mine?
|
90
|
+
end
|
76
91
|
|
77
92
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berlin-ai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.34
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-09-
|
14
|
+
date: 2013-09-17 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: sinatra
|
@@ -139,6 +139,10 @@ files:
|
|
139
139
|
- LICENSE
|
140
140
|
- README.md
|
141
141
|
- berlin-ai.gemspec
|
142
|
+
- bin/berlin-ai
|
143
|
+
- data/Gemfile
|
144
|
+
- data/ai.rb
|
145
|
+
- data/config.ru
|
142
146
|
- lib/ai/fake.rb
|
143
147
|
- lib/ai/game.rb
|
144
148
|
- lib/ai/game_internal.rb
|