gembots 0.0.1 → 0.0.02
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/gembots/arena.rb +28 -22
- data/lib/gembots/bot.rb +91 -38
- data/test/test_bot.rb +33 -0
- metadata +5 -19
- data/test/test_arena.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 573baa7dd49ebfa9c61459cb561216065d5eff8b
|
4
|
+
data.tar.gz: 0b506e01537918e8d553a4a37538139db3286a1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63d16728df0f12fd991d020b75e72bfa23b603fda1c81465a5d1686d1f71765d42dbf400a9b31bad040ed55e386efdd695e4b1bc08fec47cdfd7c2e011406525
|
7
|
+
data.tar.gz: 7c269dafb617699296e1ab794436e9c17e81421a86b473242058e59e353f21b5976cae9ed4622a811ef12f0d3a6da5c2a5c0be1e2050725d3e17d39c2992ea08
|
data/lib/gembots/arena.rb
CHANGED
@@ -1,33 +1,39 @@
|
|
1
1
|
require 'gembots'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
self.caption = "Gembots battle"
|
8
|
-
@bots = []
|
3
|
+
# The Arena class is used to create and simulate arenas.
|
4
|
+
class Gembots::Arena
|
5
|
+
# This is a hash table containing the ids of each object.
|
6
|
+
attr_reader :objects
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@bots << bot
|
14
|
-
end
|
15
|
-
end
|
8
|
+
# 2-dimensional array of the current arena.
|
9
|
+
# By default this is a 20x20 board
|
10
|
+
attr_reader :board
|
16
11
|
|
17
|
-
def
|
18
|
-
@
|
19
|
-
|
12
|
+
def initialize *bots
|
13
|
+
@objects = Hash.new
|
14
|
+
@board = Array.new 20, (Array.new 20, [])
|
15
|
+
|
16
|
+
# define each bots' update function and add to players hash
|
17
|
+
bots.each do |bot|
|
18
|
+
bot.arena = self
|
19
|
+
@objects[bot.id] = bot
|
20
|
+
@board[bot.x_pos][bot.y_pos] << bot.id
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
@bots.each do |bot|
|
24
|
-
if bot.actions.empty?
|
25
|
-
bot.on_idle
|
22
|
+
def bot.update arena
|
23
|
+
arena.update_bot self
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
|
-
|
31
|
-
|
28
|
+
# Used for activating the robot's custom functions based on active events.
|
29
|
+
def update_bot robot
|
30
|
+
# something here
|
31
|
+
end
|
32
|
+
|
33
|
+
# Spawn object into board and objects array.
|
34
|
+
# Most used for spawning projectiles.
|
35
|
+
def spawn object
|
36
|
+
@objects[object.id] = object
|
37
|
+
@board[object.x_pos][object.y_pos] << object.id
|
32
38
|
end
|
33
39
|
end
|
data/lib/gembots/bot.rb
CHANGED
@@ -1,59 +1,112 @@
|
|
1
1
|
require 'gembots'
|
2
2
|
|
3
|
+
# The Robot class is used to create and define robots.
|
3
4
|
class Gembots::Robot
|
4
|
-
|
5
|
+
# String contains the robot's name.
|
6
|
+
# This will typically used for things like announcements during battles.
|
7
|
+
attr_accessor :name
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# X position relative to the arena.
|
10
|
+
attr_reader :x_pos
|
11
|
+
|
12
|
+
# Y position relative to the arena.
|
13
|
+
attr_reader :y_pos
|
14
|
+
|
15
|
+
# Number between 0 and 360 representing the robot's current facing angle.
|
16
|
+
attr_reader :angle
|
17
|
+
|
18
|
+
# This is simply the robot's player ID.
|
19
|
+
# It is typically the Object ID, but may be changed to fit other uses.
|
20
|
+
attr_reader :id
|
21
|
+
|
22
|
+
# This is the ID of a cloned robot's parent.
|
23
|
+
# Otherwise if the robot is not a cloned one, the value will be nil.
|
24
|
+
attr_accessor :parent_id
|
25
|
+
|
26
|
+
# This is set and used by the current robot's arena, if there is one.
|
27
|
+
attr_accessor :arena
|
28
|
+
|
29
|
+
def initialize name = 'Robot'
|
30
|
+
@name = name
|
31
|
+
|
32
|
+
@x_pos = 0
|
33
|
+
@y_pos = 0
|
34
|
+
@angle = 0
|
35
|
+
|
36
|
+
@id = self.object_id
|
37
|
+
@parent_id = nil
|
12
38
|
end
|
13
39
|
|
14
|
-
|
15
|
-
|
40
|
+
# Returns a duplicate robot(clone) with it's own +parent_id+.
|
41
|
+
def clone
|
42
|
+
clone = self.dup
|
43
|
+
clone.parent_id = self.id
|
44
|
+
clone
|
16
45
|
end
|
17
46
|
|
18
|
-
|
19
|
-
|
47
|
+
# Returns true if robot is a clone of target_robot.
|
48
|
+
def is_clone_of? target_robot
|
49
|
+
@parent_id == target_robot.id
|
20
50
|
end
|
21
51
|
|
22
|
-
|
23
|
-
|
52
|
+
# Moves the robot forward along it's angle for the distance specified.
|
53
|
+
# To move backward just use a negative value.
|
54
|
+
# Currently it only supports movement along 8 directions.
|
55
|
+
def move dist = 1
|
56
|
+
# Eventually some math using rotation_matrix will be here, in order to calculate all 360 directions.
|
57
|
+
# For now I'm only implementing 8 directions.
|
58
|
+
directions = [
|
59
|
+
[1, 0], # 0
|
60
|
+
[1, 1], # 45
|
61
|
+
[0, 1], # 90
|
62
|
+
[-1, 1], # 135
|
63
|
+
[-1, 0], # 180
|
64
|
+
[-1, -1], # 225
|
65
|
+
[0, -1], # 270
|
66
|
+
[1, -1] # 315
|
67
|
+
]
|
68
|
+
@y_pos += dist * directions[360 / @angle - 1][0]
|
69
|
+
@x_pos += dist * directions[360 / @angle - 1][1]
|
70
|
+
|
71
|
+
self.update @arena
|
24
72
|
end
|
25
73
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@y += Gosu::offset_y @angle, dist
|
35
|
-
@x %= 640
|
36
|
-
@y %= 480
|
74
|
+
# Rotates angle in degrees clockwise.
|
75
|
+
# To rotate counter-clockwise just use a negative number.
|
76
|
+
def turn angle
|
77
|
+
@angle += angle
|
78
|
+
|
79
|
+
# Used for wrapping:
|
80
|
+
@angle -= 360 if @angle > 360
|
81
|
+
@angle += 360 if @angle < 0
|
37
82
|
|
38
|
-
|
39
|
-
|
83
|
+
self.update @arena
|
84
|
+
end
|
40
85
|
|
41
|
-
|
42
|
-
|
86
|
+
# Spawns projectile of type `bullet` in arena(if there is one).
|
87
|
+
def fire
|
88
|
+
arena or return
|
89
|
+
@arena.spawn Projectile.new 'bullet', @id, @x_pos, @y_pos, @angle
|
90
|
+
end
|
43
91
|
|
44
|
-
|
45
|
-
deg = @actions[0][1] <= 9 ? @actions[0][1] : 10
|
92
|
+
# These functions are just for documentation and to prevent erros when calling these undefined.
|
46
93
|
|
47
|
-
|
48
|
-
|
49
|
-
|
94
|
+
# Called whenever the game is in idle state.
|
95
|
+
# It is likely used as the robot's main loop.
|
96
|
+
def when_idle robot
|
97
|
+
end
|
98
|
+
|
99
|
+
# Called whenever another robot is seen within the facing angle.
|
100
|
+
# It usually has some code to fire at the target robot.
|
101
|
+
# Make sure to check that it is not your robot's clone!
|
102
|
+
def when_find_robot robot, target_robot
|
103
|
+
end
|
50
104
|
|
51
|
-
|
52
|
-
|
105
|
+
# Called whenever this robot has ended up colliding with another robot.
|
106
|
+
def when_robot_collision robot, target_robot
|
53
107
|
end
|
54
108
|
|
55
|
-
|
56
|
-
|
57
|
-
@image.draw_rot @x, @y, 1, @angle - 90 % 360
|
109
|
+
# This function is used by the arena for updates and delays and stuff.
|
110
|
+
def update *i
|
58
111
|
end
|
59
112
|
end
|
data/test/test_bot.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'gembots/bot'
|
3
|
+
|
4
|
+
def make_bot
|
5
|
+
bot = Gembots::Robot.new
|
6
|
+
bot.name = "test"
|
7
|
+
bot.turn 90
|
8
|
+
bot.move 5
|
9
|
+
bot
|
10
|
+
end
|
11
|
+
|
12
|
+
class BotTest < Test::Unit::TestCase
|
13
|
+
def test_name
|
14
|
+
bot = make_bot
|
15
|
+
assert_equal "test", bot.name
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_position
|
19
|
+
bot = make_bot
|
20
|
+
assert_equal 5, bot.x_pos
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_clone
|
24
|
+
bot = make_bot
|
25
|
+
bot_clone = bot.clone
|
26
|
+
assert_equal bot_clone.parent_id, bot.id
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_id
|
30
|
+
bot = make_bot
|
31
|
+
assert_equal bot.object_id, bot.id
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gembots
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.02
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- L8D
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: gosu
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,7 +47,7 @@ extra_rdoc_files: []
|
|
61
47
|
files:
|
62
48
|
- lib/gembots/arena.rb
|
63
49
|
- lib/gembots/bot.rb
|
64
|
-
- test/
|
50
|
+
- test/test_bot.rb
|
65
51
|
homepage: http://github.com/L8D/gembots
|
66
52
|
licenses:
|
67
53
|
- MIT
|
@@ -82,9 +68,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
68
|
version: '0'
|
83
69
|
requirements: []
|
84
70
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.0.
|
71
|
+
rubygems_version: 2.0.2
|
86
72
|
signing_key:
|
87
73
|
specification_version: 4
|
88
74
|
summary: Create your own gembots and battle them in a cli arena
|
89
75
|
test_files:
|
90
|
-
- test/
|
76
|
+
- test/test_bot.rb
|
data/test/test_arena.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'gembots'
|
3
|
-
require 'gembots/arena'
|
4
|
-
require 'gembots/bot'
|
5
|
-
|
6
|
-
class MyBot1 < Gembots::Robot
|
7
|
-
def on_idle
|
8
|
-
self.move
|
9
|
-
self.turn
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class MyBot2 < Gembots::Robot
|
14
|
-
def on_idle
|
15
|
-
self.move 50
|
16
|
-
self.turn 180
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class ArenaTest < Test::Unit::TestCase
|
21
|
-
def test_arena_window
|
22
|
-
arena = Gembots::Arena.new MyBot1, MyBot2
|
23
|
-
arena.show
|
24
|
-
end
|
25
|
-
end
|