Correction to this solution: in plot_course, @path.nil? should be path.nil? I should note here that plot_course is almost completely untested, since it depends heavily on Galaxy, which I haven't completely stubbed out. Tim On Mar 19, 2006, at 7:14 PM, Timothy Bennett wrote: > > 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 > >