burger_game 0.1.1 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'burger_game'
4
+
5
+ begin
6
+ BurgerGame.new *ARGV.dup
7
+ rescue StandardError => e
8
+ puts "Something went wrong."
9
+ puts "Error message: " + e.message
10
+ end
@@ -0,0 +1,37 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "burger_game"
3
+ s.version = "1.0.4"
4
+ s.summary = "A Ruby Burger Game"
5
+ s.description = "A simple text-based Ruby terminal game, that simulates a burger shop, where you need to build the meal for the customers with different requests and preferences."
6
+ s.authors = ["Jessica Gozali"]
7
+ s.email = "gcas012115@coderacademy.edu.au"
8
+ s.require_paths = ["lib"]
9
+ s.bindir = "bin"
10
+ s.executables = ["start_burger_game"]
11
+ s.files = ["./burger_game.gemspec",
12
+ "./Gemfile",
13
+ "./Gemfile.lock",
14
+ "./LICENSE",
15
+ "./bin/start_burger_game",
16
+ "./lib/burger_game.rb",
17
+ "./lib/customer_request.rb",
18
+ "./lib/game_state.rb",
19
+ "./lib/player_option.rb",
20
+ "./lib/recipe.rb",
21
+ "./lib/score_comparison.rb",
22
+ "./lib/screen_message.rb",
23
+ "./lib/customer_request.json",
24
+ "./lib/customer_response.json",
25
+ "./lib/recipe.json",
26
+ "./spec/burger_game_spec.rb"]
27
+ s.homepage = "https://rubygems.org/gems/burger_game"
28
+ s.license = "GPL-3.0"
29
+ s.required_ruby_version = "~> 2.7"
30
+ s.add_runtime_dependency "bundler", "~> 2.2"
31
+ s.add_runtime_dependency "artii", "~> 2.1"
32
+ s.add_runtime_dependency "colorize", "~> 0.8.1"
33
+ s.add_runtime_dependency "json", "~> 2.5"
34
+ s.add_runtime_dependency "rspec", "~> 3.10"
35
+ s.add_runtime_dependency "tty-box", "~> 0.7.0"
36
+ s.add_runtime_dependency "tty-prompt", "~> 0.23.1"
37
+ end
data/lib/burger_game.rb CHANGED
@@ -10,187 +10,190 @@ require_relative './player_option'
10
10
  require_relative './score_comparison'
11
11
 
12
12
  class BurgerGame
13
- # Initialise
14
- game_state = GameState.new
15
- show_menu = Recipe.new
16
- no_of_recipe = Recipe.all_recipes.length
17
- screen = ScreenMessage.new
18
- player_options = PlayerOption.new
19
- customer = CustomerRequest.new
20
- options = OpenStruct.new
21
-
22
- # Handle command line argument
23
- opt_parser = OptionParser.new do |opt|
24
- opt.banner = "Usage: main.rb [options]"
25
-
26
- opt.on("-h", "--help", "Print this Help menu for Ruby Burger Game.") do |arg|
27
- puts opt
28
- exit
13
+ def initialize(*args)
14
+ # Initialise
15
+ game_state = GameState.new
16
+ show_menu = Recipe.new
17
+ no_of_recipe = Recipe.no_of_recipe
18
+ screen = ScreenMessage.new
19
+ player_options = PlayerOption.new
20
+ customer = CustomerRequest.new
21
+ no_of_customer = CustomerRequest.no_of_customer
22
+ options = OpenStruct.new
23
+
24
+ # Handle command line argument
25
+ opt_parser = OptionParser.new do |opt|
26
+ opt.banner = "Usage: start_burger_game [options]"
27
+
28
+ opt.on("-h", "--help", "Print this Help menu for Ruby Burger Game.") do |arg|
29
+ puts opt
30
+ exit
31
+ end
32
+
33
+ opt.on("-m", "--money TARGET_MONEY", screen.display_h_money) { |arg| options.target_money = arg }
34
+
35
+ opt.on("-r", "--reputation MAX_REPUTATION", screen.display_h_reputation) { |arg| options.max_reputation = arg }
29
36
  end
30
37
 
31
- opt.on("-m", "--money TARGET_MONEY", screen.display_h_money) { |arg| options.target_money = arg }
32
-
33
- opt.on("-r", "--reputation MAX_REPUTATION", screen.display_h_reputation) { |arg| options.max_reputation = arg }
34
- end
35
-
36
- # ERROR HANDLING for command line argument
37
- begin
38
- opt_parser.parse!
39
- rescue OptionParser::InvalidOption => e
40
- puts "You have entered an invalid option. Please check the available options in our Help menu '-h' or '--help'."
41
- puts e.message
42
- exit
43
- rescue OptionParser::MissingArgument => e
44
- puts "You have not entered the argument for your option."
45
- puts e.message
46
- exit
47
- rescue OptionParser::ParseError => e
48
- puts "Error when parsing argument."
49
- puts e.message
50
- exit
51
- rescue => e
52
- puts "Something went wrong."
53
- puts "Error message: " + e.message
54
- exit
55
- end
56
-
57
- if (options.target_money)
58
- if ((options.target_money.to_i >= 10 ) && (options.target_money.to_i <= 99 ))
59
- puts "Change TARGET_MONEY to: $#{options.target_money}.00."
60
- # Set target money in GameState
61
- game_state.set_target_money(options.target_money.to_f)
62
- else
63
- puts screen.display_invalid("for TARGET_MONEY.")
38
+ # ERROR HANDLING for command line argument
39
+ begin
40
+ opt_parser.parse!(args)
41
+ rescue OptionParser::InvalidOption => e
42
+ puts "You have entered an invalid option. Please check the available options in our Help menu '-h' or '--help'."
43
+ puts e.message
64
44
  exit
65
- end
66
-
67
- end
68
- if (options.max_reputation)
69
- if ((options.max_reputation.to_i >= 1 ) && (options.max_reputation.to_i <= 10 ))
70
- puts "Change MAX_REPUTATION to: #{options.max_reputation}."
71
- # Set max reputation in GameState
72
- game_state.set_max_reputation(options.max_reputation.to_i)
73
- else
74
- puts screen.display_invalid("for MAX_REPUTATION.")
45
+ rescue OptionParser::MissingArgument => e
46
+ puts "You have not entered the argument for your option."
47
+ puts e.message
48
+ exit
49
+ rescue OptionParser::ParseError => e
50
+ puts "Error when parsing argument."
51
+ puts e.message
52
+ exit
53
+ rescue => e
54
+ puts "Something went wrong."
55
+ puts "Error message: " + e.message
75
56
  exit
76
57
  end
77
- end
78
58
 
79
- # Ask user if they want to launch the game or exit
80
- puts
81
- launch_game = player_options.get_launch_game
59
+ if (options.target_money)
60
+ if ((options.target_money.to_i >= 10 ) && (options.target_money.to_i <= 99 ))
61
+ puts "Change TARGET_MONEY to: $#{options.target_money}.00."
62
+ # Set target money in GameState
63
+ game_state.set_target_money(options.target_money.to_f)
64
+ else
65
+ puts screen.display_invalid("for TARGET_MONEY.")
66
+ exit
67
+ end
82
68
 
83
- # Exit command line if user select Exit
84
- exit if launch_game === false
85
-
86
- # Show welcome message
87
- puts
88
- puts screen.display_welcome
89
- puts
90
- screen.go_to_next
69
+ end
70
+ if (options.max_reputation)
71
+ if ((options.max_reputation.to_i >= 1 ) && (options.max_reputation.to_i <= 10 ))
72
+ puts "Change MAX_REPUTATION to: #{options.max_reputation}."
73
+ # Set max reputation in GameState
74
+ game_state.set_max_reputation(options.max_reputation.to_i)
75
+ else
76
+ puts screen.display_invalid("for MAX_REPUTATION.")
77
+ exit
78
+ end
79
+ end
91
80
 
92
- # Feature 1: Options to see instructions or to start the game
93
- loop do
81
+ # Ask user if they want to launch the game or exit
94
82
  puts
95
- start_game = player_options.get_start_game
96
-
97
- break if start_game === true
83
+ launch_game = player_options.launch_game
84
+
85
+ # Exit command line if user select Exit
86
+ exit if launch_game === false
98
87
 
99
- # Show instructions
88
+ # Show welcome message
100
89
  puts
101
- puts screen.display_instructions
102
-
90
+ puts screen.display_welcome
103
91
  puts
104
92
  screen.go_to_next
105
- end
106
93
 
107
- # Show prologue
108
- puts
109
- puts screen.display_prologue
94
+ # Feature 1: Options to see instructions or to start the game
95
+ loop do
96
+ puts
97
+ start_game = player_options.start_game
110
98
 
111
- puts
112
- screen.go_to_next
99
+ break if start_game === true
113
100
 
114
- # Loop game until WIN / GAME OVER
115
- loop do
116
- # Display current money and reputation status
117
- puts game_state.display_game_state
101
+ # Show instructions
102
+ puts
103
+ puts screen.display_instructions
104
+
105
+ puts
106
+ screen.go_to_next
107
+ end
118
108
 
109
+ # Show prologue
119
110
  puts
120
- screen.go_to_next
111
+ puts screen.display_prologue
121
112
 
122
- # Feature 2: Formatted display for showing shop's menu
123
- puts
124
- puts "Ruby Burger's Menu"
125
- puts
126
- puts
127
- puts "We have #{no_of_recipe} recipes. Try to remember the recipe name, the stack order of ingredients and the quantity. We will build the burger from bottom to top."
128
113
  puts
114
+ screen.go_to_next
129
115
 
130
- # Loop to display all recipes
131
- i = 0
116
+ # Loop game until WIN / GAME OVER
132
117
  loop do
133
- puts show_menu.display_recipe(i)
118
+ # Display current money and reputation status
119
+ puts game_state.display_game_state
134
120
 
135
121
  puts
136
122
  screen.go_to_next
137
123
 
138
- i += 1
139
- break if i > (no_of_recipe - 1)
140
- end
124
+ # Feature 2: Formatted display for showing shop's menu
125
+ puts
126
+ puts "Ruby Burger's Menu"
127
+ puts
128
+ puts
129
+ puts "We have #{no_of_recipe} recipes. Try to remember the recipe name, the stack order of ingredients and the quantity. We will build the burger from bottom to top."
130
+ puts
141
131
 
142
- # Feature 3: Randomised customers with set of request (and associated preferences) and responses
143
- # Display customer request
144
- puts
145
- puts "There is a customer in the queue..."
146
- puts
147
- # Randomise customer
148
- customer_no = rand(0..9)
149
- puts customer.display_request(customer_no)
150
- puts
132
+ # Loop to display all recipes
133
+ i = 0
134
+ loop do
135
+ puts show_menu.display_recipe(i)
151
136
 
152
- puts
153
- screen.go_to_next
137
+ puts
138
+ screen.go_to_next
154
139
 
155
- # Feature 4: Selectable options for list of ingredients, so no manual entry (typing) is needed.
156
- # Quantity input as integer within a pre-set range.
157
- # Display player's options
158
- player_recipe = player_options.get_options
159
- customer_recipe = customer.get_request(customer_no)
160
-
161
- # Feature 5: Score calculation based on customer's request and preferences compared to player's input
162
- # Calculate score
163
- compare = ScoreComparison.new(player_recipe, customer_recipe)
164
- score = compare.get_score
165
- mood = compare.get_mood(score)
166
-
167
- # Feautre 6: Get customers' responses from a JSON file
168
- # Display customer's response
169
- puts
170
- puts "The customer wants to say something..."
171
- puts
172
- puts customer.display_response(customer_no, mood)
140
+ i += 1
141
+ break if i > (no_of_recipe - 1)
142
+ end
173
143
 
174
- puts
175
- screen.go_to_next
176
- puts
144
+ # Feature 3: Randomised customers with set of request (and associated preferences) and responses
145
+ # Display customer request
146
+ puts
147
+ puts "There is a customer in the queue..."
148
+ puts
149
+ # Randomise customer
150
+ customer_no = rand(no_of_customer)
151
+ puts customer.display_request(customer_no)
152
+ puts
177
153
 
178
- # Update game state
179
- compare.calculate_state(mood)
154
+ puts
155
+ screen.go_to_next
180
156
 
181
- # Feature 7: Lose/win criteria based on reputation and money
182
- # GAME OVER condition
183
- if GameState.current_reputation == 0
184
- puts screen.display_game_over
157
+ # Feature 4: Selectable options for list of ingredients, so no manual entry (typing) is needed.
158
+ # Quantity input as integer within a pre-set range.
159
+ # Display player's options
160
+ player_recipe = player_options.get_selection
161
+ customer_recipe = customer.get_request(customer_no)
162
+
163
+ # Feature 5: Score calculation based on customer's request and preferences compared to player's input
164
+ # Calculate score
165
+ compare = ScoreComparison.new(player_recipe, customer_recipe)
166
+ score = compare.get_score
167
+ mood = compare.get_mood(score)
168
+
169
+ # Feautre 6: Get customers' responses from a JSON file
170
+ # Display customer's response
185
171
  puts
186
- break
187
- end
172
+ puts "The customer wants to say something..."
173
+ puts
174
+ puts customer.display_response(customer_no, mood)
188
175
 
189
- # WIN condition
190
- if GameState.current_money >= GameState.target_money
191
- puts screen.display_win
192
176
  puts
193
- break
177
+ screen.go_to_next
178
+ puts
179
+
180
+ # Update game state
181
+ compare.calculate_state(mood)
182
+
183
+ # Feature 7: Lose/win criteria based on reputation and money
184
+ # GAME OVER condition
185
+ if GameState.current_reputation == 0
186
+ puts screen.display_game_over
187
+ puts
188
+ break
189
+ end
190
+
191
+ # WIN condition
192
+ if GameState.current_money >= GameState.target_money
193
+ puts screen.display_win
194
+ puts
195
+ break
196
+ end
194
197
  end
195
198
  end
196
199
  end
@@ -0,0 +1,172 @@
1
+ [
2
+ {
3
+ " A Customer ":
4
+ [
5
+ {
6
+ "Normal Burger":
7
+ [
8
+ {"Cheese": 0}
9
+ ]
10
+ },
11
+ {
12
+ "Request": "Hello! Can I please have a \"Normal Burger\" today?"
13
+ },
14
+ {
15
+ "Preference": "I don't like cheese, so, with no cheese please!"
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ " Captain Australia ":
21
+ [
22
+ {
23
+ "Questionable Burger":
24
+ [
25
+ {"Grilled Chicken": 5}
26
+ ]
27
+ },
28
+ {
29
+ "Request": "G'day mate! Can I get \"Questionable Burger\" please?"
30
+ },
31
+ {
32
+ "Preference": "I'm so hungry, please put an extra patty in my burger! Ta!"
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ " John Citizen ":
38
+ [
39
+ {
40
+ "Healthy Burger":
41
+ [
42
+ {"Lettuce": 0}
43
+ ]
44
+ },
45
+ {
46
+ "Request": "Hi there. I'm a healthy person you know.\nSo, can I have \"Healthy Burger\" please?"
47
+ },
48
+ {
49
+ "Preference": "And, with no veggies please. Yes, you heard me right, no veggies!"
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ " Jane Citizen ":
55
+ [
56
+ {
57
+ "Healthy Burger":
58
+ [
59
+ {"Grilled Chicken": 0}
60
+ ]
61
+ },
62
+ {
63
+ "Request": "Hi... I'd like to have the \"Healthy Burger\" please."
64
+ },
65
+ {
66
+ "Preference": "I don't want the chicken. It reminds me of John..."
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ " Scott Morris ":
72
+ [
73
+ {
74
+ "Questionable Burger":
75
+ [
76
+ {"Cheese": 5}
77
+ ]
78
+ },
79
+ {
80
+ "Request": "Good day! A quick question, can I have the \"Questionable Burger\" please?"
81
+ },
82
+ {
83
+ "Preference": "With extra two slices of cheese please.\nI hope it is not cheesy. Hahaha! *laughs at own attempt to be funny*"
84
+ }
85
+ ]
86
+ },
87
+ {
88
+ " The Mighty Princess ":
89
+ [
90
+ {
91
+ "Healthy Burger":
92
+ [
93
+ {"Lettuce": 4}
94
+ ]
95
+ },
96
+ {
97
+ "Request": "Oh, tell me dear citizen, can this Princess have the \"Healthy Burger\" please?"
98
+ },
99
+ {
100
+ "Preference": "Make it with extra one lettuce! I will reward you handsomely..."
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ " Donald T. ":
106
+ [
107
+ {
108
+ "Questionable Burger":
109
+ [
110
+ {"Lettuce": 0}
111
+ ]
112
+ },
113
+ {
114
+ "Request": "I'm a busy man. Give the \"Questionable Burger\". Thanks."
115
+ },
116
+ {
117
+ "Preference": "Oh, and I'll have it without lettuce!\nNo lettuce!! *throws fist in the air*"
118
+ }
119
+ ]
120
+ },
121
+ {
122
+ " Mickey M. ":
123
+ [
124
+ {
125
+ "Healthy Burger":
126
+ [
127
+ {"Tomato Sauce": 2}
128
+ ]
129
+ },
130
+ {
131
+ "Request": "Hello... Hmm... I'm interested in trying the \"Healthy Burger\" please..."
132
+ },
133
+ {
134
+ "Preference": "I love tomato, so can I have double the sauce please?"
135
+ }
136
+ ]
137
+ },
138
+ {
139
+ " Unicorn ":
140
+ [
141
+ {
142
+ "Questionable Burger":
143
+ [
144
+ {"Tomato Sauce": 0}
145
+ ]
146
+ },
147
+ {
148
+ "Request": "Hiya! Can I have \"Questionable Burger\" please?"
149
+ },
150
+ {
151
+ "Preference": "Leave the tomato sauce out please.\nIt will ruin the colour balance of my rainbow."
152
+ }
153
+ ]
154
+ },
155
+ {
156
+ " A Robot ":
157
+ [
158
+ {
159
+ "Normal Burger":
160
+ [
161
+ {"Grilled Chicken": 3}
162
+ ]
163
+ },
164
+ {
165
+ "Request": "Beep... Can I have the.. Beep... \"Normal Burger\" please?"
166
+ },
167
+ {
168
+ "Preference": "Beep... With triple... Beep... Patty please..."
169
+ }
170
+ ]
171
+ }
172
+ ]