Here it is. Okay so it isn't tommorow. I shortened it a bit, but its the same really.
--As for the rest, it is mine.
Here's a first approximation of a rewrite. ;-) (Major problem: it always asks what you want to do twice...)
This version keeps track of the state of the game, and uses that to guide the flow. Note that I actually did put commands in a variable...
However, now each location you can go to is entirely independent of any other.
I'm sure this can be simplified. It's just the first treatment I thought of.
Daniel T. Staal
--------------------------------------------------------------- This email copyright the author. Unless otherwise noted, you are expressly allowed to retransmit, quote, or otherwise use the contents for non-commercial purposes. This copyright will expire 5 years after the author's death, or in 30 years, whichever is longer, unless such a period is in excess of local copyright law. ---------------------------------------------------------------
#!/usr/bin/perl
use warnings; use strict; # Game strings. my $dowhat="\nWhat will you do?\n"; my $bridge = "\nYou are on the bridge. There is a red light flashing on the main console.\nThere are doorways to the north, south, and west.\n"; my $bridge2 = "\nYou are on the bridge. You can see out the window that the ship has landed on an unknown planet.\nThere are doorways to the north, south and west\n\n"; my $engine = "\nYou are in the engineering room. There seems to be some smoke coming from\nan open panel.\nThere is a wall panel on the floor. The bridge is to the north.\n\n"; my $engine2 = "\nYou are in the engineering room. There seems to be smoke coming from an open panel.\nThe bridge is to the north\n\n"; my $engine3 = "\nYou are in engineering. The bridge is to the north\n\n"; my $crew = "\nYou enter the crew quarters. Of course, since the crew evacuated, you have them all to yourself. The bridge is to the south\n\n"; my $light = "\nThe light is labeled \"Smoke alert in engineering\"\n\n"; my $airlock2 = "\nYou are in the airlock. The ship has landed on a habitable planet, and\nyou may leave if you want to. The bridge is to the east\n"; my $airlock = "\nYou are in the airlock. You are currently travelling through hyperspace,\nand cannot leave the ship. The bridge is to the east\n"; # Game locations my %places = ( BRIDGE => \&bridge, AIRLOCK => \&airlock, ENGINE => \&engine, CREW => \&crew, ); # Game variables. my %gamestate; # Actually start the program. # Main game loop. my $playtime = 'y'; while ($playtime eq 'y') { # Game variables. %gamestate = ( location => 'BRIDGE', plate => 0, lightbulb => 0, previous => 'NONE', command => 'NONE', ); print qq(Welcome to "Spaceship"\n); print "What is your name? \n\n"; print "My name is: "; chomp ($gamestate{'name'}=<>); print "Welcome to the bridge, $gamestate{'name'}\n\n", "Uh Oh, it looks like something is wrong. You will need to make an emergency\nlanding... If you can fix the ship first.\n\n"; while ($gamestate{'location'} ne 'WINNER') { $gamestate{'command'} = getcommand(); &{$places{"$gamestate{'location'}"}}(); } print 'Play again? [y/n]'; chomp ($playtime=<>); print "\n\n\n\n\n"; } # End of game loop. # End the game. print "Exiting..."; # # End of program. Start of subroutines. # # Get a command. sub getcommand { print "$dowhat"; chomp (my $command = <>); return $command; } # They're on the bridge. sub bridge { if ($gamestate{'previous'} ne 'BRIDGE') { if ($gamestate{'lightbulb'} == 0) { print "$bridge"; } else { print "$bridge2"; } } $gamestate{'previous'} = $gamestate{'location'}; if ($gamestate{'command'} eq "examine light") { print $light; } elsif ($gamestate{'command'} eq "north") { $gamestate{'location'} = 'CREW'; } if ($gamestate{'command'} eq "west") { $gamestate{'location'} = 'AIRLOCK'; } elsif ($gamestate{'command'} eq "look") { if ($gamestate{'lightbulb'} == 0) { print "$bridge"; } else { print "$bridge2"; } } elsif ($gamestate{'command'} eq "south") { $gamestate{'location'} = 'ENGINE'; } } # They're in the airlock. sub airlock { my $command = $_[0]; if ($gamestate{'previous'} ne 'airlock') { if ($gamestate{'lightbulb'} == 1) { print "$airlock2"; } else { print "$airlock"; } } $gamestate{'previous'} = $gamestate{'location'}; if ($gamestate{'command'} eq "leave ship"){ if ($gamestate{'lightbulb'} == 1) { print "Congratulations! You fixed the ship. You have left to explore the alien\nlandscape. To continue this storyline, wait for me to get bored and make a\nsequal.\n"; $gamestate{'location'} = 'WINNER'; } elsif ($gamestate{'lightbulb'} == 0) { print "\nYou can't leave yet, you have to fix the ship first so it can land\n"; } } $gamestate{'location'} = 'BRIDGE' if ($gamestate{'command'} eq "east"); } # They're in the engine room. sub engine { if ($gamestate{'previous'} ne 'ENGINE') { if ($gamestate{'plate'} == 0) { print "$engine"; } elsif ($gamestate{'plate'} == 1) { print "$engine2"; } elsif ($gamestate{'plate'} == 2) { print "$engine3"; } } $gamestate{'previous'} = $gamestate{'location'}; if ($gamestate{'command'} eq "take panel") { print "You take the metal panel"; $gamestate{'plate'}=1; } elsif ($gamestate{'command'} eq "north") { $gamestate{'location'} = 'BRIDGE'; } elsif ($gamestate{'command'} eq "use panel") { if ($gamestate{'plate'} == 1) { print "You replace the plate over the hole in the wall, and\nsinglehandedly save yourself from smoke inhalation.\n"; $gamestate{'plate'} = 2; $gamestate{'lightbulb'} = 1; } else { print "\nYou have no plate to use\n"; } } } # They're in the crew's quarters. sub crew { print $crew if ($gamestate{'previous'} ne 'CREW'); $gamestate{'previous'} = $gamestate{'location'}; if ($gamestate{'command'} eq "south") { $gamestate{'location'} = 'BRIDGE'; } elsif ($gamestate{'command'} eq "look") { print $crew; } }
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>