burger_game 0.1.1 → 1.0.4

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.
@@ -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
+ ]