monkeymusic 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/bin/monkeymusic-generate +6 -0
- data/levels/bomberman2.rb +31 -0
- data/levels/testmaze_10.rb +38 -0
- data/levels/testmaze_20.rb +38 -0
- data/levels/testmaze_30.rb +38 -0
- data/lib/monkey_music.rb +1 -3
- data/lib/monkey_music/game.rb +13 -3
- data/lib/monkey_music/level.rb +1 -1
- data/lib/monkey_music/level_loader.rb +3 -3
- data/lib/monkey_music/player.rb +13 -7
- data/lib/monkey_music/runner.rb +29 -85
- data/lib/monkey_music/ui/console_ui.rb +10 -6
- data/lib/monkey_music/units/monkey.rb +4 -0
- data/lib/monkey_music_generate.rb +6 -0
- data/lib/monkey_music_generate/generator.rb +98 -0
- data/lib/{monkey_music → monkey_music_generate}/recommendation_loader.rb +0 -0
- data/lib/{monkey_music → monkey_music_generate}/score_system.rb +0 -0
- data/lib/{monkey_music → monkey_music_generate}/toplist_loader.rb +0 -0
- metadata +15 -60
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
ZTg1NmQzOTk5MDc1YWI5ODI3ZmFjZGUyN2Q3MDg0ZGNlM2RlNTAyNw==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
NWQwODNmNzc1OGNkMGIyNDgyOTI2MDBhNjQ4ZTMwMmNkMmI1MmJjMQ==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
Mzk0YzYxYmRhOTZjYWYwYjY3NzBmYjIzNWIxMWJjOWQxZDZjMDUwMDQ1MGNm
|
|
10
|
+
ZWViMzRlZjM0M2VjNjYyZDhlNWM3N2Y2NzdhY2M1MjdlYWYxNTkzYTY1ZTJh
|
|
11
|
+
NDc4MjYwMTczMWM5ODc3YTBhNDYyZDViZDg2MzgxZjlmY2Q2MGU=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
Y2U4MDUyOWJjN2E2ZDE5MWI4OWZkOWI4YmY4ZDhhYzdmM2FkYTQ3MjI1NWRk
|
|
14
|
+
MzVkYTRlN2I1NGNhOTFlZWUzOTU2NDRmNTE3ZWNlMzU3YjIyNmE5OWJlN2M5
|
|
15
|
+
NzkxYmVkYWRlMjYwMzNjYTdjNDEyZWVkZmExNTM4ZjNmZmQzZjI=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
carrying_capacity 5
|
|
2
|
+
metadata_requests_per_turn 2
|
|
3
|
+
max_turns 100
|
|
4
|
+
|
|
5
|
+
legend({
|
|
6
|
+
"1" => Monkey.player(1),
|
|
7
|
+
"2" => Monkey.player(2),
|
|
8
|
+
"X" => Track.worth(-2),
|
|
9
|
+
"x" => Track.worth(-1),
|
|
10
|
+
"l" => Track.worth(1),
|
|
11
|
+
"t" => Track.worth(2),
|
|
12
|
+
"T" => Track.worth(3),
|
|
13
|
+
"U" => User,
|
|
14
|
+
"#" => Wall,
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
layout <<LAYOUT
|
|
18
|
+
Xl 1 U 2 lX
|
|
19
|
+
t ll ll t
|
|
20
|
+
###t ########### t###
|
|
21
|
+
#t # #T tlTlt T# # t#
|
|
22
|
+
## #T#l l#T# ##
|
|
23
|
+
#l ######X X###### l#
|
|
24
|
+
## # # x # # ##
|
|
25
|
+
#T# #t# #t# #T#
|
|
26
|
+
#x#l##### # #####l#x#
|
|
27
|
+
# # # l # # #
|
|
28
|
+
### # # # # # # # ###
|
|
29
|
+
#t # # # t#
|
|
30
|
+
#l###l#t#t#t#t#l###l#
|
|
31
|
+
LAYOUT
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
carrying_capacity 3
|
|
2
|
+
metadata_requests_per_turn 2
|
|
3
|
+
max_turns 100
|
|
4
|
+
|
|
5
|
+
legend({
|
|
6
|
+
"1" => Monkey.player(1),
|
|
7
|
+
"2" => Monkey.player(2),
|
|
8
|
+
"X" => Track.worth(-2),
|
|
9
|
+
"x" => Track.worth(-1),
|
|
10
|
+
"l" => Track.worth(1),
|
|
11
|
+
"t" => Track.worth(2),
|
|
12
|
+
"T" => Track.worth(3),
|
|
13
|
+
"U" => User,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
layout <<LAYOUT
|
|
17
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXX
|
|
18
|
+
X X X X X X X 1 2 X X X X
|
|
19
|
+
X X X XXX XXX X X XXXXXXX X X X XXXXX X X
|
|
20
|
+
X X X X X X X X X X X X
|
|
21
|
+
X X XXX XXX XXX X X X XXX X XXXXXXXXX X X
|
|
22
|
+
X X X X X X X X X X X X X X
|
|
23
|
+
XXX X X X XXX X XXX XXXXX X X X X XXX X X
|
|
24
|
+
X X t X X X X X X X X X
|
|
25
|
+
X X XXXXXXXXX XXX XXXXXXX XXX XXX X X X X
|
|
26
|
+
X X X X X X X X X X X
|
|
27
|
+
XXX X X X X XXXXX X X X XXX X XXX X XXX X
|
|
28
|
+
X X X X X X X X X X X X X X X
|
|
29
|
+
X XXX X XXXXX X X X X X X X X XXXXXXX X
|
|
30
|
+
X X X X X X X X X X X X
|
|
31
|
+
XXXXXXXXX X XXX XXXXXXXXX XXX X X XXX XXX
|
|
32
|
+
X X lX X X X X T X X X X X
|
|
33
|
+
X XXX X X X X XXX X X X X XXX X XXX XXX X
|
|
34
|
+
X X X X X X X X X X X X X X X
|
|
35
|
+
XXX XXX X XXXXXXX X XXX X X XXX X X XXX X
|
|
36
|
+
X T X Xt X tX
|
|
37
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
38
|
+
LAYOUT
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
carrying_capacity 3
|
|
2
|
+
metadata_requests_per_turn 2
|
|
3
|
+
max_turns 100
|
|
4
|
+
|
|
5
|
+
legend({
|
|
6
|
+
"1" => Monkey.player(1),
|
|
7
|
+
"2" => Monkey.player(2),
|
|
8
|
+
"X" => Track.worth(-2),
|
|
9
|
+
"x" => Track.worth(-1),
|
|
10
|
+
"l" => Track.worth(1),
|
|
11
|
+
"t" => Track.worth(2),
|
|
12
|
+
"T" => Track.worth(3),
|
|
13
|
+
"U" => User,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
layout <<LAYOUT
|
|
17
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
18
|
+
X X X X l X X XT X X X X
|
|
19
|
+
XXX X X X X XXXXXXX X X X X X XXX X X XXX
|
|
20
|
+
X X X X X X X X X X X X X X X X X X
|
|
21
|
+
X X XXX X X X X X X X X XXXXXXX X X X X X
|
|
22
|
+
X X X X X X X t X X
|
|
23
|
+
XXXXX X XXX XXXXX XXX X XXX XXX X XXXXX X
|
|
24
|
+
X X X X X X X X X X X X X
|
|
25
|
+
X X X XXX X XXX 1U2 X XXX XXX XXX XXX
|
|
26
|
+
X X l X X X X X X
|
|
27
|
+
X X XXX X XXX X X X XXX X X X XXX XXX X X
|
|
28
|
+
X X X X X X X X X X X X
|
|
29
|
+
XXXXX X XXXXX XXX XXX X XXXXXXX XXX X X X
|
|
30
|
+
X X X X X X X X X X X
|
|
31
|
+
X X X X XXX X X X XXXXX X X X X X X XXX X
|
|
32
|
+
X t X X X X X X X X XtX XT X X
|
|
33
|
+
X XXX XXXXX XXXXXXXXXXX X X X XXXXX X X X
|
|
34
|
+
X X X X X X X X X X X X X
|
|
35
|
+
X X X XXXXX X X X X XXXXXXX XXX X XXXXX X
|
|
36
|
+
X X X X X X X X X X
|
|
37
|
+
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
38
|
+
LAYOUT
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
carrying_capacity 3
|
|
2
|
+
metadata_requests_per_turn 2
|
|
3
|
+
max_turns 100
|
|
4
|
+
|
|
5
|
+
legend({
|
|
6
|
+
"1" => Monkey.player(1),
|
|
7
|
+
"2" => Monkey.player(2),
|
|
8
|
+
"X" => Track.worth(-2),
|
|
9
|
+
"x" => Track.worth(-1),
|
|
10
|
+
"l" => Track.worth(1),
|
|
11
|
+
"t" => Track.worth(2),
|
|
12
|
+
"T" => Track.worth(3),
|
|
13
|
+
"U" => User,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
layout <<LAYOUT
|
|
17
|
+
#####################U###################
|
|
18
|
+
# # # # # # 1 2 # # # # #
|
|
19
|
+
# # ### # # # #####l#l### ### # # ### ###
|
|
20
|
+
# # # # # # # # # # # # #
|
|
21
|
+
# # # # # # # ### # # # ### ### # ### # #
|
|
22
|
+
# # # # # # # # # # # # # # # # #
|
|
23
|
+
### # ### ##### # # # ### # ##### # ### #
|
|
24
|
+
# # # # l # # # T# # #
|
|
25
|
+
# # ### ##### # # # # # # ### ### # ### #
|
|
26
|
+
# # # # # # # # # # # # # #
|
|
27
|
+
# ### ### ####### # # ### # ### ##### ###
|
|
28
|
+
# # # # # # # # # # #
|
|
29
|
+
# # # # # # ### # # # ##### ##### # # # #
|
|
30
|
+
# # # # # # # # # # # # # # # # # # #
|
|
31
|
+
# # ##### ### ### ### # # # ### # ##### #
|
|
32
|
+
# # t# # # # # # t# # #
|
|
33
|
+
# # ### ######### # ##### ### # # # # # #
|
|
34
|
+
# # # # # # # # # # # #
|
|
35
|
+
### # ### ### # ### # # ### # ##### ### #
|
|
36
|
+
# # # # # # # #
|
|
37
|
+
#########################################
|
|
38
|
+
LAYOUT
|
data/lib/monkey_music.rb
CHANGED
|
@@ -5,9 +5,6 @@ require 'set'
|
|
|
5
5
|
require 'monkey_music/runner'
|
|
6
6
|
require 'monkey_music/game'
|
|
7
7
|
require 'monkey_music/player'
|
|
8
|
-
require 'monkey_music/toplist_loader'
|
|
9
|
-
require 'monkey_music/recommendation_loader'
|
|
10
|
-
require 'monkey_music/score_system'
|
|
11
8
|
require 'monkey_music/level'
|
|
12
9
|
require 'monkey_music/level_loader'
|
|
13
10
|
|
|
@@ -18,3 +15,4 @@ require 'monkey_music/units/base'
|
|
|
18
15
|
require 'monkey_music/units/monkey'
|
|
19
16
|
require 'monkey_music/units/track'
|
|
20
17
|
require 'monkey_music/units/user'
|
|
18
|
+
require 'monkey_music/units/wall'
|
data/lib/monkey_music/game.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'optparse'
|
|
2
|
+
require 'benchmark'
|
|
2
3
|
|
|
3
4
|
module MonkeyMusic
|
|
4
5
|
class Game
|
|
@@ -10,17 +11,26 @@ module MonkeyMusic
|
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def start
|
|
14
|
+
@ui.update(@level)
|
|
13
15
|
@level.max_turns.times do
|
|
14
16
|
if @level.complete?
|
|
15
17
|
break
|
|
16
18
|
end
|
|
17
|
-
@ui.update(@level)
|
|
18
19
|
# Query players for moves
|
|
19
|
-
|
|
20
|
+
query_threads = []
|
|
21
|
+
query_time = Benchmark.realtime do
|
|
22
|
+
@players.each do |p|
|
|
23
|
+
query_threads << Thread.new do
|
|
24
|
+
p.query_move!
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
query_threads.each(&:join)
|
|
28
|
+
end
|
|
20
29
|
# Move players in random order
|
|
21
30
|
@players.shuffle.each { |p| p.move! }
|
|
31
|
+
# Update ui
|
|
32
|
+
@ui.update(@level, query_time)
|
|
22
33
|
end
|
|
23
|
-
@ui.update(@level)
|
|
24
34
|
end
|
|
25
35
|
|
|
26
36
|
end
|
data/lib/monkey_music/level.rb
CHANGED
|
@@ -13,7 +13,7 @@ module MonkeyMusic
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def metadata_requests_per_turn(n)
|
|
16
|
-
@
|
|
16
|
+
@level.requests_per_turn = n
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def carrying_capacity(capacity)
|
|
@@ -27,8 +27,8 @@ module MonkeyMusic
|
|
|
27
27
|
def layout(layout)
|
|
28
28
|
# Transform layout into x y indexed array
|
|
29
29
|
units = (layout.lines.map { |l| l.chomp.split(//) }).transpose
|
|
30
|
-
@level.width = units
|
|
31
|
-
@level.height = units.length
|
|
30
|
+
@level.width = units.length
|
|
31
|
+
@level.height = units[0].length
|
|
32
32
|
# Add units from layout to level
|
|
33
33
|
@level.height.times do |y|
|
|
34
34
|
@level.width.times do |x|
|
data/lib/monkey_music/player.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module MonkeyMusic
|
|
2
2
|
class Player
|
|
3
|
-
attr_accessor :monkey
|
|
3
|
+
attr_accessor :monkey, :level
|
|
4
4
|
|
|
5
5
|
def initialize(file)
|
|
6
6
|
@file = file
|
|
@@ -9,16 +9,22 @@ module MonkeyMusic
|
|
|
9
9
|
|
|
10
10
|
def query_move!
|
|
11
11
|
IO.popen(@file, "r+") do |io|
|
|
12
|
-
io.puts
|
|
13
|
-
io.puts @monkey.remaining_capacity
|
|
14
|
-
io.puts @monkey.level.width
|
|
15
|
-
io.puts @monkey.level.height
|
|
16
|
-
io.puts @monkey.level.serialize
|
|
12
|
+
io.puts player_output
|
|
17
13
|
move = io.gets
|
|
18
14
|
@next_move = parse_move(move) if move
|
|
19
15
|
end
|
|
20
16
|
end
|
|
21
17
|
|
|
18
|
+
def player_output
|
|
19
|
+
[ @monkey.id,
|
|
20
|
+
@monkey.remaining_capacity,
|
|
21
|
+
@monkey.level.requests_per_turn,
|
|
22
|
+
@monkey.level.width,
|
|
23
|
+
@monkey.level.height,
|
|
24
|
+
@monkey.level.serialize,
|
|
25
|
+
].join("\n")
|
|
26
|
+
end
|
|
27
|
+
|
|
22
28
|
def parse_move(s)
|
|
23
29
|
case s.chomp
|
|
24
30
|
when "N" then :north
|
|
@@ -34,7 +40,7 @@ module MonkeyMusic
|
|
|
34
40
|
end
|
|
35
41
|
|
|
36
42
|
def to_s
|
|
37
|
-
|
|
43
|
+
@monkey.name
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
end
|
data/lib/monkey_music/runner.rb
CHANGED
|
@@ -3,6 +3,9 @@ require 'optparse'
|
|
|
3
3
|
module MonkeyMusic
|
|
4
4
|
class Runner
|
|
5
5
|
|
|
6
|
+
@@default_level = 'testlevel.rb'
|
|
7
|
+
@@default_user = 'synth.yaml'
|
|
8
|
+
|
|
6
9
|
def initialize(arguments)
|
|
7
10
|
@arguments = arguments
|
|
8
11
|
@opt_parser = OptionParser.new
|
|
@@ -13,41 +16,19 @@ module MonkeyMusic
|
|
|
13
16
|
|
|
14
17
|
def run
|
|
15
18
|
@opt_parser.parse!
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
loaded_toplists = toplist_loader.loaded_toplists
|
|
30
|
-
recommendation_loader = RecommendationLoader.new(loaded_toplists)
|
|
31
|
-
recommendation_loader.load_for_user!(user)
|
|
32
|
-
# Disconnect from libspotify
|
|
33
|
-
session.logout!
|
|
34
|
-
# Evaluate recommendations
|
|
35
|
-
puts "Evaluating recommendations..."
|
|
36
|
-
score_system = ScoreSystem.new
|
|
37
|
-
score_system.evaluate_user_recommendations!(user)
|
|
38
|
-
# Dump and print the user
|
|
39
|
-
File.open(@out_file, 'w') do |f|
|
|
40
|
-
f.write(user.dump)
|
|
41
|
-
end
|
|
42
|
-
puts "====="
|
|
43
|
-
puts "DONE!"
|
|
44
|
-
puts "====="
|
|
45
|
-
puts "Loaded tracks:"
|
|
46
|
-
user.recommendations.group_by(&:multiplier).sort.each do |k,v|
|
|
47
|
-
puts "#Multiplier #{k}:\t#{v.length}"
|
|
48
|
-
end
|
|
49
|
-
exit
|
|
50
|
-
elsif not game_is_playable?
|
|
19
|
+
# Handle fallback to default level
|
|
20
|
+
@level_file ||= File.join(
|
|
21
|
+
File.dirname(__FILE__),
|
|
22
|
+
"../../levels",
|
|
23
|
+
@@default_level
|
|
24
|
+
)
|
|
25
|
+
# Handle fallback to default user
|
|
26
|
+
@user_file ||= File.join(
|
|
27
|
+
File.dirname(__FILE__),
|
|
28
|
+
"../../users",
|
|
29
|
+
@@default_user
|
|
30
|
+
)
|
|
31
|
+
if (not game_is_playable?)
|
|
51
32
|
puts @opt_parser
|
|
52
33
|
exit
|
|
53
34
|
end
|
|
@@ -73,14 +54,6 @@ module MonkeyMusic
|
|
|
73
54
|
|
|
74
55
|
private
|
|
75
56
|
|
|
76
|
-
def generate_user?
|
|
77
|
-
(defined? @toplist_file) &&
|
|
78
|
-
(defined? @out_file) &&
|
|
79
|
-
(defined? @spotify_appkey_file) &&
|
|
80
|
-
(defined? @spotify_account) &&
|
|
81
|
-
(defined? @spotify_password)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
57
|
def game_is_playable?
|
|
85
58
|
(defined? @user_file) &&
|
|
86
59
|
(defined? @level_file) &&
|
|
@@ -92,19 +65,7 @@ module MonkeyMusic
|
|
|
92
65
|
end
|
|
93
66
|
|
|
94
67
|
def init_parser(opts)
|
|
95
|
-
opts.banner = 'Usage: monkeymusic [
|
|
96
|
-
|
|
97
|
-
opts.on('-l',
|
|
98
|
-
'--level LEVEL',
|
|
99
|
-
'The level to play.') do |file|
|
|
100
|
-
@level_file = File.join(Dir.getwd, file)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
opts.on('-u',
|
|
104
|
-
'--user USER',
|
|
105
|
-
'The user the players will recommend music for.') do |user|
|
|
106
|
-
@user_file = File.join(Dir.getwd, user)
|
|
107
|
-
end
|
|
68
|
+
opts.banner = 'Usage: monkeymusic -p PLAYER_FILE -n PLAYER_NAME [-u USER_FILE] [-l LEVEL_FILE]'
|
|
108
69
|
|
|
109
70
|
opts.on('-p',
|
|
110
71
|
'--player FILE',
|
|
@@ -119,38 +80,21 @@ module MonkeyMusic
|
|
|
119
80
|
@players[-1].monkey.name = name unless @players.empty?
|
|
120
81
|
end
|
|
121
82
|
|
|
122
|
-
opts.on('-
|
|
123
|
-
'
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
opts.on('-g',
|
|
128
|
-
'--generate TOPLIST_FILE',
|
|
129
|
-
'Generate a user from a toplist file.') do |user|
|
|
130
|
-
@toplist_file = File.join(Dir.getwd, user)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
opts.on('-o',
|
|
134
|
-
'--out OUT_FILE',
|
|
135
|
-
'The file to dump a generated user to.') do |file|
|
|
136
|
-
@out_file = File.join(Dir.getwd, file)
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
opts.on('-k',
|
|
140
|
-
'--app-key KEY',
|
|
141
|
-
'Path to libspotify application key.') do |key|
|
|
142
|
-
@spotify_appkey_file = File.join(Dir.getwd, key)
|
|
83
|
+
opts.on('-l',
|
|
84
|
+
'--level LEVEL',
|
|
85
|
+
'The level to play.') do |file|
|
|
86
|
+
@level_file = File.join(Dir.getwd, file)
|
|
143
87
|
end
|
|
144
|
-
|
|
145
|
-
opts.on('-
|
|
146
|
-
'--
|
|
147
|
-
'
|
|
148
|
-
@
|
|
88
|
+
|
|
89
|
+
opts.on('-u',
|
|
90
|
+
'--user USER',
|
|
91
|
+
'The user the players will recommend music for.') do |user|
|
|
92
|
+
@user_file = File.join(Dir.getwd, user)
|
|
149
93
|
end
|
|
150
94
|
|
|
151
|
-
opts.on('-
|
|
152
|
-
'
|
|
153
|
-
@
|
|
95
|
+
opts.on('-d', '--delay DELAY', OptionParser::DecimalNumeric,
|
|
96
|
+
'The delay (in seconds) between each round.') do |delay|
|
|
97
|
+
@delay = delay
|
|
154
98
|
end
|
|
155
99
|
|
|
156
100
|
opts.on('-b', '--browser-ui',
|
|
@@ -12,20 +12,24 @@ module MonkeyMusic
|
|
|
12
12
|
puts "\n"*5
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def update(level)
|
|
15
|
+
def update(level, query_time = 0)
|
|
16
16
|
# Clear screen
|
|
17
17
|
puts "\e[H\e[2J"
|
|
18
18
|
# Level
|
|
19
19
|
puts level.to_s
|
|
20
20
|
# Score
|
|
21
21
|
puts "\n"
|
|
22
|
-
puts "="*10
|
|
23
|
-
puts "\n"
|
|
24
22
|
level.players.each do |player|
|
|
25
|
-
|
|
26
|
-
puts "
|
|
23
|
+
monkey = player.monkey
|
|
24
|
+
puts "---"
|
|
25
|
+
print "#{monkey.name} | "
|
|
26
|
+
print "Score: #{monkey.score} | "
|
|
27
|
+
puts "Capacity: #{monkey.remaining_capacity}"
|
|
28
|
+
monkey.carrying.each { |t| puts "#{t.value}p: #{t.name}" }
|
|
29
|
+
print("\n"*monkey.remaining_capacity)
|
|
27
30
|
end
|
|
28
|
-
|
|
31
|
+
puts "---"
|
|
32
|
+
sleep [@delay - query_time, 0].max
|
|
29
33
|
end
|
|
30
34
|
end
|
|
31
35
|
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
require 'hallon'
|
|
3
|
+
|
|
4
|
+
module MonkeyMusic
|
|
5
|
+
class Generator
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
OptionParser.new do |opts|
|
|
9
|
+
opts.banner = 'Usage: monkeymusic-generate [options]'
|
|
10
|
+
|
|
11
|
+
opts.on('-g',
|
|
12
|
+
'--generate TOPLIST_FILE',
|
|
13
|
+
'Generate a user from a toplist file.') do |user|
|
|
14
|
+
@toplist_file = File.join(Dir.getwd, user)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
opts.on('-o',
|
|
18
|
+
'--out OUT_FILE',
|
|
19
|
+
'The file to dump a generated user to.') do |file|
|
|
20
|
+
@out_file = File.join(Dir.getwd, file)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
opts.on('-k',
|
|
24
|
+
'--app-key KEY',
|
|
25
|
+
'Path to libspotify application key.') do |key|
|
|
26
|
+
@spotify_appkey_file = File.join(Dir.getwd, key)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
opts.on('-a',
|
|
30
|
+
'--account ACCOUNT',
|
|
31
|
+
'Username for a Spotify premium account.') do |account|
|
|
32
|
+
@spotify_account = account
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
opts.on('-w', '--password PASSWORD',
|
|
36
|
+
'Password for a Spotify premium account.') do |password|
|
|
37
|
+
@spotify_password = password
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
opts.on_tail('-h',
|
|
41
|
+
'--help',
|
|
42
|
+
'Show this message.') do
|
|
43
|
+
puts opts
|
|
44
|
+
exit
|
|
45
|
+
end
|
|
46
|
+
end.parse!
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def run
|
|
50
|
+
if generate_user?
|
|
51
|
+
# Create user
|
|
52
|
+
user = User.new
|
|
53
|
+
# Connect to libspotify
|
|
54
|
+
Hallon.load_timeout = 0
|
|
55
|
+
session = Hallon::Session.initialize(IO.read(@spotify_appkey_file))
|
|
56
|
+
session.login!(@spotify_account, @spotify_password)
|
|
57
|
+
# Load toplists
|
|
58
|
+
puts "Loading toplists from #{@toplist_file}..."
|
|
59
|
+
toplist_loader = ToplistLoader.new(@toplist_file)
|
|
60
|
+
toplist_loader.load_for_user!(user)
|
|
61
|
+
# Generate recommendations
|
|
62
|
+
puts "Loading recommendations..."
|
|
63
|
+
loaded_toplists = toplist_loader.loaded_toplists
|
|
64
|
+
recommendation_loader = RecommendationLoader.new(loaded_toplists)
|
|
65
|
+
recommendation_loader.load_for_user!(user)
|
|
66
|
+
# Disconnect from libspotify
|
|
67
|
+
session.logout!
|
|
68
|
+
# Evaluate recommendations
|
|
69
|
+
puts "Evaluating recommendations..."
|
|
70
|
+
score_system = ScoreSystem.new
|
|
71
|
+
score_system.evaluate_user_recommendations!(user)
|
|
72
|
+
# Dump and print the user
|
|
73
|
+
File.open(@out_file, 'w') do |f|
|
|
74
|
+
f.write(user.dump)
|
|
75
|
+
end
|
|
76
|
+
puts "====="
|
|
77
|
+
puts "DONE!"
|
|
78
|
+
puts "====="
|
|
79
|
+
puts "Loaded tracks:"
|
|
80
|
+
user.recommendations.group_by(&:multiplier).sort.each do |k,v|
|
|
81
|
+
puts "#Multiplier #{k}:\t#{v.length}"
|
|
82
|
+
end
|
|
83
|
+
exit
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def generate_user?
|
|
90
|
+
(defined? @toplist_file) &&
|
|
91
|
+
(defined? @out_file) &&
|
|
92
|
+
(defined? @spotify_appkey_file) &&
|
|
93
|
+
(defined? @spotify_account) &&
|
|
94
|
+
(defined? @spotify_password)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
metadata
CHANGED
|
@@ -1,68 +1,18 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: monkeymusic
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.0.2
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Oscar Soderlund
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date: 2013-05-
|
|
11
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
|
-
- !ruby/object:Gem::Dependency
|
|
15
|
-
name: hallon
|
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
|
-
requirements:
|
|
19
|
-
- - ! '>='
|
|
20
|
-
- !ruby/object:Gem::Version
|
|
21
|
-
version: '0'
|
|
22
|
-
type: :runtime
|
|
23
|
-
prerelease: false
|
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
|
-
requirements:
|
|
27
|
-
- - ! '>='
|
|
28
|
-
- !ruby/object:Gem::Version
|
|
29
|
-
version: '0'
|
|
30
|
-
- !ruby/object:Gem::Dependency
|
|
31
|
-
name: rack
|
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
|
-
requirements:
|
|
35
|
-
- - ! '>='
|
|
36
|
-
- !ruby/object:Gem::Version
|
|
37
|
-
version: '0'
|
|
38
|
-
type: :runtime
|
|
39
|
-
prerelease: false
|
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
|
-
requirements:
|
|
43
|
-
- - ! '>='
|
|
44
|
-
- !ruby/object:Gem::Version
|
|
45
|
-
version: '0'
|
|
46
13
|
- !ruby/object:Gem::Dependency
|
|
47
14
|
name: json
|
|
48
15
|
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
none: false
|
|
50
|
-
requirements:
|
|
51
|
-
- - ! '>='
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: '0'
|
|
54
|
-
type: :runtime
|
|
55
|
-
prerelease: false
|
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
-
none: false
|
|
58
|
-
requirements:
|
|
59
|
-
- - ! '>='
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
- !ruby/object:Gem::Dependency
|
|
63
|
-
name: em-websocket
|
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
none: false
|
|
66
16
|
requirements:
|
|
67
17
|
- - ! '>='
|
|
68
18
|
- !ruby/object:Gem::Version
|
|
@@ -70,7 +20,6 @@ dependencies:
|
|
|
70
20
|
type: :runtime
|
|
71
21
|
prerelease: false
|
|
72
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
-
none: false
|
|
74
23
|
requirements:
|
|
75
24
|
- - ! '>='
|
|
76
25
|
- !ruby/object:Gem::Version
|
|
@@ -82,6 +31,11 @@ executables:
|
|
|
82
31
|
extensions: []
|
|
83
32
|
extra_rdoc_files: []
|
|
84
33
|
files:
|
|
34
|
+
- lib/monkey_music_generate.rb
|
|
35
|
+
- lib/monkey_music_generate/recommendation_loader.rb
|
|
36
|
+
- lib/monkey_music_generate/toplist_loader.rb
|
|
37
|
+
- lib/monkey_music_generate/generator.rb
|
|
38
|
+
- lib/monkey_music_generate/score_system.rb
|
|
85
39
|
- lib/monkey_music.rb
|
|
86
40
|
- lib/monkey_music/level.rb
|
|
87
41
|
- lib/monkey_music/units/wall.rb
|
|
@@ -89,19 +43,21 @@ files:
|
|
|
89
43
|
- lib/monkey_music/units/track.rb
|
|
90
44
|
- lib/monkey_music/units/base.rb
|
|
91
45
|
- lib/monkey_music/units/user.rb
|
|
92
|
-
- lib/monkey_music/recommendation_loader.rb
|
|
93
46
|
- lib/monkey_music/game.rb
|
|
94
|
-
- lib/monkey_music/toplist_loader.rb
|
|
95
47
|
- lib/monkey_music/runner.rb
|
|
96
48
|
- lib/monkey_music/player.rb
|
|
97
49
|
- lib/monkey_music/level_loader.rb
|
|
98
50
|
- lib/monkey_music/ui/browser_ui.rb
|
|
99
51
|
- lib/monkey_music/ui/console_ui.rb
|
|
100
|
-
-
|
|
52
|
+
- levels/testmaze_30.rb
|
|
53
|
+
- levels/bomberman2.rb
|
|
101
54
|
- levels/the_last_crusade.rb
|
|
102
55
|
- levels/testlevel.rb
|
|
56
|
+
- levels/testmaze_10.rb
|
|
103
57
|
- levels/testlevel_maze.rb
|
|
104
58
|
- levels/travelling_salesmonkeys.rb
|
|
59
|
+
- levels/testmaze_20.rb
|
|
60
|
+
- bin/monkeymusic-generate
|
|
105
61
|
- bin/monkeymusic
|
|
106
62
|
- users/synth.yaml
|
|
107
63
|
- users/synth.rb
|
|
@@ -111,26 +67,25 @@ files:
|
|
|
111
67
|
- LICENSE
|
|
112
68
|
homepage: https://github.com/odsod/monkey-music
|
|
113
69
|
licenses: []
|
|
70
|
+
metadata: {}
|
|
114
71
|
post_install_message:
|
|
115
72
|
rdoc_options: []
|
|
116
73
|
require_paths:
|
|
117
74
|
- lib
|
|
118
75
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
|
-
none: false
|
|
120
76
|
requirements:
|
|
121
77
|
- - ! '>='
|
|
122
78
|
- !ruby/object:Gem::Version
|
|
123
79
|
version: '0'
|
|
124
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
|
-
none: false
|
|
126
81
|
requirements:
|
|
127
82
|
- - ! '>='
|
|
128
83
|
- !ruby/object:Gem::Version
|
|
129
84
|
version: 1.3.4
|
|
130
85
|
requirements: []
|
|
131
86
|
rubyforge_project: monkeymusic
|
|
132
|
-
rubygems_version:
|
|
87
|
+
rubygems_version: 2.0.3
|
|
133
88
|
signing_key:
|
|
134
|
-
specification_version:
|
|
89
|
+
specification_version: 4
|
|
135
90
|
summary: A runtime for an AI programming competition.
|
|
136
91
|
test_files: []
|