-
Notifications
You must be signed in to change notification settings - Fork 0
/
isopod_game.rb
117 lines (101 loc) · 2.87 KB
/
isopod_game.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
# frozen_string_literal: true
# isopod_game.rb
class Game
attr_reader :inventory, :current_location
def initialize(input: $stdin, output: $stdout)
@map = create_map
@inventory = []
@current_location = :start
@input = input
@output = output
end
def play
@output.puts 'Welcome, Isopod! Your mission is to find a place to hide, a cookie crumb, and another isopod friend.'
loop do
display_location
action = prompt_action
process_action(action)
break if win_condition_met?
end
@output.puts 'Congratulations, you found all the items and won the game!'
end
private
def create_map
{
start: { description: 'You are at the start.', adjacent: %i[forest beach] },
forest: { description: 'You are in a dense forest.', adjacent: %i[start cave] },
cave: { description: 'You found a dark cave.', adjacent: [:forest] },
beach: { description: 'You are on a sandy beach.', adjacent: %i[start rock_pool] },
rock_pool: { description: 'You see a shallow rock pool.', adjacent: [:beach] }
}
end
def display_location
@output.puts @map[@current_location][:description]
@output.puts "You can move to: #{map_adjacent_locations.join(', ')}"
end
def map_adjacent_locations
@map[@current_location][:adjacent]
end
def prompt_action
@output.puts 'What would you like to do? (move/inventory/quit)'
@input.gets.chomp.downcase
end
def process_action(action)
case action
when 'move'
move_to_location
when 'inventory'
display_inventory
when 'quit'
exit_game
else
@output.puts 'Invalid action. Please try again.'
end
end
def move_to_location
@output.puts "Where would you like to go? (#{map_adjacent_locations.join('/')})"
destination = @input.gets.chomp.to_sym
if map_adjacent_locations.include?(destination)
@current_location = destination
find_items_at_location
else
@output.puts "You can't move there. Please try again."
end
end
def display_inventory
if @inventory.empty?
@output.puts 'Your inventory is empty.'
else
@output.puts "You have: #{@inventory.join(', ')}"
end
end
def exit_game
@output.puts 'Thank you for playing. Goodbye!'
exit
end
def win_condition_met?
@inventory.include?('place to hide') &&
@inventory.include?('cookie crumb') &&
@inventory.include?('isopod friend')
end
def find_items_at_location
case @current_location
when :cave
find_item('place to hide')
when :rock_pool
find_item('cookie crumb')
when :forest
find_item('isopod friend')
else
@output.puts 'Nothing to find here.'
end
end
def find_item(item)
if @inventory.include?(item)
@output.puts "You already found the #{item}."
else
@output.puts "You found a #{item}!"
@inventory << item
end
end
end