From: Timothy Bennett Date: 2006-03-20T12:14:01+09:00 Subject: Re: [QUIZ] Space Merchant (#71) Here's the Sector implementation I was working on. It can use a bunch of cleaning up (choose_station and choose_planet need to be merged together at least in part - much duplicate code there), but as this is the second posted Sector implementation, and no one has mentioned working on a Planet or Station implementation, I'm going to go ahead and send in a Planet class tomorrow instead of cleaning this up. module SpaceMerchant class Sector attr_reader :links, :planets, :stations, :location def initialize ( name, location = nil ) @name = name @location = location @links = [] @planets = [] @stations = [] end def name @name.to_s end def to_s name end def add_planet ( planet ) @planets << planet end def add_station ( station ) @stations << station end def link ( to_sector ) @links << to_sector end def handle_event ( player ) player[:visited_sectors] ||= [] player[:visited_sectors] << self unless player [:visited_sectors].find { |sector| sector == self } print_menu choice = gets.chomp case choice when /d/i: choose_station when /l/i: choose_planet when /p/i: plot_course when /q/i: throw(:quit) when /\d+/: warp player, choice else invalid_choice end end def == ( other ) if other.class == Sector self.name == other.name elsif other.class == String self.name == other else false end end private def warp ( player, sector_name ) sector = Galaxy.instance.sectors.find { |sector| sector_name == sector.name } if sector && @links.find { |sec| sector_name == sec } player[:location] = sector puts "Warping to Sector #{sector_name}..." elsif sector.nil? puts "Sector #{sector_name} does not exist." else puts "Sector #{sector_name} cannot be reached from here." end puts end def print_menu puts "Sector #{@name}" puts @location if @location puts puts "Station" + (@stations.size == 1 ? '' : 's') + ": " + @stations.map{|stat| stat.name}.join(', ') unless @stations.empty? puts "Planet" + (@planets.size == 1 ? '' : 's') + ": " + @planets.map{|plan| plan.name}.join(', ')} unless @planets.empty? puts "Nothing here!" if @stations.empty? && @planets.empty? puts puts "(D)ock with station" unless @stations.empty? puts "(L)and on planet" unless @planets.empty? puts "(P)lot a course" puts puts "(Q)uit game" puts puts "Or warp to nearby sector: #{@links.join(', ')}" puts end def invalid_choice puts "Please enter a valid choice." end def choose_station player = Player.instance puts "There are no stations to dock with!" if @stations.empty? if @stations.size == 1 dock @stations[0], player else @stations.each_with_index do |station, index| puts "(#{index + 1}) #{station.name}" end puts "Enter the number of the station to dock with: " station_index = gets.chomp.to_i - 1 if @stations[station_index] dock @stations[station_index], player else puts "Invalid station." end end end def choose_planet player = Player.instance puts "There are no planets to land on!" if @planets.empty? if @planets.size == 1 land @planets[0], player else @planets.each_with_index do |planet, index| puts "(#{index + 1}) #{planet}" end puts "Enter the number of the planet to land on: " planet_index = gets.chomp.to_i - 1 if @planets[planet_index] dock @planets[planet_index], player else puts "Invalid planet." end end end def land (planet, player) puts "Landing on #{planet.name}..." player[:location] = planet end def dock (station, player) puts "Docking at #{station.name}..." player[:location] = station end def plot_course player = Player.instance galaxy = Galaxy.instance unknown_sectors = galaxy.sectors - player[:visited_sectors] reachable_sectors = galaxy.find_reachable(self, unknown_sectors) reachable_sectors.each do |sector| puts "#{sector}" + sector.location ? "(# {sector.location})" : '' end puts puts "Enter the sector name to which you wish to travel: " sector_name = gets.chomp destination = galaxy.sectors.find { |sector| sector == sector.name } path = galaxy.find_path( self, destination, unknown_sectors) puts unless @path.nil? puts "Your course:" path.each do |sector| puts "#{sector}" + sector.location ? "(# {sector.location})" : '' end puts "Confirm course (y/n)?" confirm = gets.chomp =~ /y/i if confirm me[:location] = destination puts "Traveling to Sector #{destination}..." end else puts "That sector can not be reached." end end end end