in reply to Wizardv1.1

Not bad, but it's a bit rough :) It let me have -12 golds and -2 health :) I corrected these, added use strict and warnings, and added some punctuation, indented the file (thanks to perltidy) and corrected a mistake : don't use "die" as a sub name, it's dangerous, and BTW you made a big mistake with the curly braces putting all the following code inside the "die" sub, luckily it worked anyway :)
I don't understand the warning on line 297, looks weird, if anyone comes to an idea... Enjoy!
update: I corrected a bug that caused the program to exit if you entered anything but 1,2 or q during combat. Have fun!
update 2: I made a single "battle" sub for better coding practice! Next, I'll create a hash of various monsters to allow some variety in monsters types.
update 3: I forgot to remove one of the "&die". BTW, I should remove the "&" next, because it's...ugly :)
update 4: removed the "&", work in progress, beware V 1.2 :)
update 5:OK, I guess we hit the 1.2 mark : 6 different random monsters! :)
#!/usr/bin/perl -w # Version 1.2 ;) use strict; my ( $room, $choice, $shop ); my $wizard = 50; my $wizardl = 1; my $gold = 10; my $damage = 3; # various monsters my @monsters = ( { 'name' => 'goblins', 'health' => 12}, { 'name' => 'orcs', 'health' => 14}, { 'name' => 'trolls', 'health' => 13}, { 'name' => 'wolves', 'health' => 10}, { 'name' => 'rats', 'health' => 6}, { 'name' => 'bats', 'health' => 5} ); print "Welcome to Wizard! Type your wizard's name..."; my $name = <STDIN>; chomp($name); print "Welcome $name to Wizard.\n You are now in Merlin's castle.\n You are +surrounded by other mages and disscussion flows back "; print "and forth in the room. Suddenly Merlin stands up in front of all an +d says:<< I need a powerful man to go out and slay all the monsters t +hat have been plauging my land.\n"; print "Which one of you can raise to the challenge?>> Slowly all those in th +e room rise, including yourself.\n\n"; print "<<Good, good...>> merlin utters. Then be off.\n\n\n"; print "(note: the higher the number you choose, the more often you will enco +uter enemies!)\n\n\n"; sub goodbye { print "Thanks for playing, $name.\n\n"; exit; } sub toad { my ($monster, $monsterhealth) = @_; if ( $room != 6 ) { my $toad = int( rand 4 ) + 1; if ( $toad <= $wizardl ) { print "The $monster have been zapped into toads!\n"; $gold = $gold + 3; print "good job you got 3 gold!\n"; freedale(); } else { print "your spell has failed! -2 health\n"; $wizard = $wizard - 2; battle($monster, $monsterhealth); } } else { my $toad = int( rand 7 ) + 1; if ( $toad <= $wizardl ) { print "The demons have been zapped into toads!\n"; $gold = $gold + 6; print "great job you got 6 gold!\n"; freedale(); } elsif ( $toad > $wizardl ) { print "your spell has failed! -2 health\n"; $wizard = $wizard - 2; battle($monster, $monsterhealth); } } } sub battle { my ($monster, $monsterhealth) = @_; print "What do you want to do?..press 1 to use spells or 2 for com +bat.\n"; $choice = <STDIN>; chomp $choice; if ( $choice eq '1' ) { toad($monster, $monsterhealth); } elsif ( $choice =~ "q" ) { goodbye(); } elsif ( $choice eq '2' ) { do { $monsterhealth = $monsterhealth - $damage; $wizard = $wizard - 2; print "wizard health: $wizard\t"; print "$monster health: $monsterhealth\n"; } until ( $monsterhealth <= 0 || $wizard <= 0 ); if ( $wizard > 0 ) { print "good job you got 3 gold!\n"; $gold = $gold + 3; freedale(); } elsif ( $wizard <= 0 ) { goodbye(); } } else { print "You must choose 1, 2, or q!\n"; battle($monster, $monsterhealth); } } sub forest { print "The forest is dark and smells of old mold and rotton fish. + The foul waters have turned this once peaceful place in to a\n"; +print "dark evil place.\n"; my $gobbo = int( rand 6 ) + 1; if ( $gobbo >= 5 ) { my $randommonster=$monsters[int( rand 6 )]; print "$randommonster->{name} attack\n"; battle( $randommonster->{name}, $randommonster->{health} ); } else { print "There are no monsters here now.\n"; freedale(); } } sub mountain { print "Its pretty cold up here, but from this altitude you can see + the whole town below you.\n"; print "Although it is clear that you are not the first one here!\n +"; my $gobbo = int( rand 6 ) + 1; if ( $gobbo >= 4 ) { my $randommonster=$monsters[int( rand 6 )]; print "$randommonster->{name} attack\n"; battle( $randommonster->{name}, $randommonster->{health} ); } else { print "There are no monsters here now.\n"; freedale(); } } sub dungeon { print "There is a heavy feeling in the air, it's very dark and mus +ty down here.\n"; print "You can see clear signs that goblins have been here, and ma +ybe worse things!\n"; my $gobbo = int( rand 6 ) + 1; if ( $gobbo >= 3 ) { my $randommonster=$monsters[int( rand 6 )]; print "$randommonster->{name} attack\n"; battle( $randommonster->{name}, $randommonster->{health} ); } else { print "There are no monsters here now.\n"; freedale(); } } sub splane { print "This is a mysterious place full of horribly powerful monste +rs...\n"; print "You see tracks unlike any other you have encountered before +.\n"; my $gobbo = int( rand 6 ) + 1; if ( $gobbo >= 2 ) { print "Demons attack!\n"; battle( 'demons', 18 ); } else { print "There are no demons here now.\n"; freedale(); } } sub shop { print "Hello welcome to freedale market may I help you?\n"; print "type 1 for 30 more health.................................. +....... +.....10 gold\n"; print "type 2 for daggers (increases damage per round by one)............... +.......................... +....15 gold\n"; print "type 3 for magic wands(increases magic level by one)................. +.................... +30 gold\n"; print "type 4 to leave the shop\n"; $shop = <STDIN>; if ( $shop == 1 ) { if ( $gold < 10 ) { print "you don't have enough gold\n"; freedale(); } else { print "Thank you\n"; $gold = $gold - 10; $wizard = $wizard + 30; freedale(); } } elsif ( $shop == 2 ) { if ( $gold < 15 ) { print "you don't have enough gold\n"; freedale(); } else { print "thank you\n"; $gold = $gold - 15; $damage = $damage + 1; freedale(); } } elsif ( $shop == 3 ) { if ( $gold < 30 ) { print "you don't have enough gold\n"; freedale(); } else { print "thank you\n"; $gold = $gold - 30; $wizardl = $wizardl + 1; freedale(); } } elsif ( $shop == 4 ) { print "Thank you for coming!\n"; freedale(); } else { print "Please enter a number between 1 and 4!\n"; freedale(); } } sub cheat { $wizardl = $wizardl + 2; $wizard = 100; $gold = 60; freedale(); } sub error { freedale(); } sub wizstat { print "health:\t$wizard\n"; print "magic level:\t$wizardl\n"; print "gold:\t$gold\n"; freedale(); } sub freedale { print "you are in freedale.\n"; print "where do you want to go?\n"; print "type 1 for the forest, 2 for the mountain, or 3 for the dungeon, 4 +for the shop, 5 to view stats, 6 for the Shadow Plane, or q to quit. +\n "; print "press q at anytime to quit.\n"; $room = <STDIN>; chomp $room; if ( $room eq '1' ) { forest(); } elsif ( $room eq '2' ) { mountain(); } elsif ( $room eq '3' ) { dungeon(); } elsif ( $room eq '4' ) { shop(); } elsif ( $room eq '5' ) { wizstat(); } elsif ( $room eq '6' ) { if ( $wizardl < 3 ) { print "You're level isn't high enough! You must have a magic lvl of 3 to com +e here.\n"; freedale(); } elsif ( $wizardl => 3 ) { splane(); } } elsif ( $room eq '7' ) { cheat(); } elsif ( $room =~ "q" ) { goodbye(); } else { print "Please enter a number between 1 and 6 or q to quit!\n" +; error(); } } freedale()

Replies are listed 'Best First'.
Re^2: Wizard v1.2
by CountZero (Bishop) on May 06, 2005 at 19:07 UTC
    A suggestion for the next update: put all the "places" where you have to fight in one subroutine and the variable things in a hash (similar as you have doen with the fighting routines).

    CountZero

    "If you have four groups working on a compiler, you'll get a 4-pass compiler." - Conway's Law

      Sure. Actually I was thinking about how to give some more depth to the game without making the code any longer... more places, perhaps a "maze", harder monsters (when you reach level 6 you basically never lose anymore)... And what about various "quests"? The first one would be "kill the monsters around Merlin's place", then you'll switch to another...
      I'm afraid it may turn into a real app soon :)
Re^2: Wizard v1.2
by Roy Johnson (Monsignor) on May 09, 2005 at 18:08 UTC
    How come when I kill Demons in combat, I only get 3 gold, but when I zap them with a spell, I get 6?

    Also, I hit a "deep recursion" at one point, which I thought was odd, but it didn't affect gameplay, which is, of course, smooth and realistic. :-)


    Caution: Contents may have been coded under pressure.
      Hmmm, looks like a bug :) For the deep recursion problem, I didn't really understand what happened, but I didn't care too much because it works fine anyway :)
      BTW I'm surprised to see that there so few text-based adventure games on perlmonks, and I started working on it more seriously :)
        The deep recursion is due to, well, everything recursing. You have battle calling freedale, which calls battle, which calls toad, which calls....

        I've revamped the game quite a bit. I got rid of the recursion, in favor of (usually) redo. Freedale is like a main event loop, and everything else is called from there, and eventually returns to there. I introduced some randomness into how much gold you get, gave each zone a limited supply of monsters (and limited the types), got rid of the "you don't find any monsters" thing, added a couple of jokes, changed formatting, just bunches of stuff. Still, it's basically the same game.

Re^2: Wizard v1.2
by deibyz (Hermit) on May 10, 2005 at 08:30 UTC
    I've modified it a bit, adding a third number for the number of coins for each monster:

    Adding a variable damage could also be a good idea.
      Fine :) Actually I'd like to implement a more complete combat system with damage, armor, etc. Also I had started a system to build "places" such as a forest, a castle, a cave so you can wander around a little, find some tresures, etc. Then of course you'll need to be able to save the game state; then why not make it CGI-able, and what about multiplayer game? Mmmmh, i'm afraid it's about to become a real project :)

      Here's what I'm working out for the "place generator" :

      Forest, mountain, village, castle, cavern maze.
      • a forest is a group of connected "rooms" with very little "walls". You can almost always go whichever direction you want. There are some obstacles though : rivers, big trees, rocks.
      • mountain is a group of connected "rooms" with walls on a prefered axis (you can easily travel from north to south, but not from east to west) and a top (from which you can go all directions), some rocks and pits. Summit is the preferred place to finc treasures of course.
      • village is a village :), with some streets, some houses, with people, treasures or monsters inside, and perhaps shops.
      • castle is made of groups of rooms (towers) with several floors (some possibly underground), connected through corridors, with a dungeon (a bigger tower) where the monsters and treasures mostly are :)
      • a cavern maze is a maze, haunted by terrible monsters, perhaps even dragons. Wow, big treasures too!
      The game would generate a random "world" to be explored. I'd create a set of basic "quests", you'll end the quest by killing a group of defined monsters or finding a set of defined treasures; then it would generate another world, harder, with a new quest, etc.
      Yes, As I thought about it, it becames quite clear that this would be easily extended to aclient-server mode, so you can play with a command line, a browser (cgi) interface (possibly graphical) or even a graphic display, and why not, make it multiplayer.
      OK, be enthusiast enough and I'll make it :)
        Ok, I'll be enthusiast: "Do it!!" =o)
        I'd be interested in a project like that. I think I could manage to implement a battle system based on somewhat similar to D&D3rd, and maybe a magic system. But I think somethings should be considered before. What do you think?
        I think that would be an excellent idea. Although that's extremely complex for my level (a novice at the monastery as of this morning:)) I think it would be great for someone else to take it further than I could. In your case, you could take all the credit because besides for the original code, anything worth using would have been created by you (or someone else who is willing to tackle such a project.) So feel free.