-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.rb
135 lines (115 loc) · 2.85 KB
/
player.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
require 'debugger'
class Player
attr_accessor :warrior, :observations
def play_turn(warrior)
@warrior = warrior
puts "Threatened? - #{threatened?}"
make_decision!
end
def observe
forward = warrior.look(:forward).collect{|i| i.to_s}
backward = warrior.look(:backward).collect{|i| i.to_s}
observations = backward + forward
end
def threatened?
observations = observe
return true if observations.include?('Archer')
return true if observations.slice(1, 4).include?('Wizard')
return true if observations.slice(2, 2).any? {|o| o.index(/Sludge/)}
return false
end
def make_decision!
if !threatened? && warrior.health < 20
heal!
elsif wizard_infront?
attack!
elsif wizard_behind?
change_direction!
elsif archer_infront?
puts "I detected an archer in front of me"
attack!
elsif archer_behind?
puts "I detected an archer behind me and am turning around"
change_direction!
elsif sludge_infront?
puts "I detected a sludge in front of me and am attacking!!!!"
attack!
elsif sludge_behind?
change_direction!
else
puts "I am moving foward!!"
move!
end
end
def wizard_infront?
observations = observe
return true if observations.slice(3, 3).include?('Wizard')
return false
end
def wizard_behind?
observations = observe
return true if observations.slice(0, 3).include?('Wizard')
return false
end
def archer_infront?
observations = observe
return true if observations.slice(3, 3).include?('Archer')
return false
end
def archer_behind?
observations = observe
return true if observations.slice(0, 3).include?('Archer')
return false
end
def sludge_infront?
observations = observe
return true if observations.slice(3, 3).any? {|o| o.index(/Sludge/)}
return false
end
def sludge_behind?
observations = observe
return true if observations.slice(0, 3).any? {|o| o.index(/Sludge/)}
return false
end
def threat_priority
end
def change_direction!
warrior.pivot!
end
def heal!
puts "I'm healing because i'm not being attacked"
warrior.rest!
end
def move!
if warrior.feel.captive?
warrior.rescue!
return
elsif warrior.feel.wall?
change_direction!
return
elsif look_behind_for_hostage?
change_direction!
else warrior.walk!
end
end
def look_behind_for_hostage?
backward = warrior.look(:backward).collect{|i| i.to_s}
if backward.include?('Captive')
return true
else return false
end
end
def look_front_for_hostage?
forward = warrior.look(:forward).collect{|i| i.to_s}
if forward.include?('Captive')
return true
else return false
end
end
def attack!
if look_front_for_hostage?
move!
else warrior.shoot!
end
end
end