Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: logic problem with perl game

by liverpole (Monsignor)
on Dec 05, 2010 at 02:50 UTC ( #875444=note: print w/ replies, xml ) Need Help??


in reply to logic problem with perl game

Hi mynameisG,

A couple of suggestions about simplifying this part of your code:

if($game eq "Fight") { if($response eq "arrow" && $correctryhm eq "sparrow") { $correctryhm=$correctryhm; $response=param('response'); $win=param('win'); $win=$win+1; } elsif($response ne "arrow" && $correctryhm eq "sparrow") { $correctryhm=$correctryhm; $response=param('response'); $lose=param('lose'); $lose=$lose+1; } if($response eq "axe" && $correctryhm eq "wax") { $correctryhm=$correctryhm; $response=param('response'); $win=param('win'); $win=$win+1; } elsif($response ne "axe" && $correctryhm eq "wax") { $correctryhm=$correctryhm; $response=param('response'); $lose=param('lose'); $lose=$lose+1; }code: ...

  1. The line $correctryhm=$correctryhm; doesn't do anything useful (it assigns variable $correctryhm to its current value). You can safely remove it.
  2. The line $win=param('win'); can safely be done outside of the if...elsif...else clause, to avoid the repetition.  Same thing with $response=param('response');
  3. A common shorthand for $X = $X + 1 is ++$X.  Same thing for $x = $X - 1 => --$X.

Just the above changes will already significantly reduce the complexity of the one big conditional clause:

$response = param('response'); $win = param('win'); $lose = param('lose'); if($game eq "Fight") { if($response eq "arrow" && $correctryhm eq "sparrow") { ++$win; } elsif($response ne "arrow" && $correctryhm eq "sparrow") { ++$lose; } if($response eq "axe" && $correctryhm eq "wax") { ++$win; } elsif($response ne "axe" && $correctryhm eq "wax") { ++$lose; } if($response eq "shield" && $correctryhm eq "field") { ++$win; } elsif($response ne "shield" && $correctryhm eq "field") { ++$lose; } if($response eq "spear" && $correctryhm eq "tear") { ++$win; } elsif($response ne "spear" && $correctryhm eq "tear") { ++$lose; } if ($win <= 9 && $lose <= 10) { # Removed for brevity ... } }

And if you want to generalize further, you could create a hash (see perldata for more on hashes) containing the expected, correct rhyme for each word:

$response = param('response'); $win = param('win'); $lose = param('lose'); my %correct_rhyme = ( 'arrow' => 'sparrow', 'axe' => 'wax', 'shield' => 'field', 'spear' => 'tear', ); if($game eq "Fight") { my $correct = $correct_rhyme{$response}; if ($response eq $correct) { ++$win; } else { ++$lose; } if ($win <= 9 && $lose <= 10) { # Removed for brevity ... } }

Now, when you want to add a new word/rhyme pair, it's a straightforward matter of just adding the key/value pair to the %correct_rhyme hash.


s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/


Comment on Re: logic problem with perl game
Select or Download Code
Re^2: logic problem with perl game
by mynameisG (Novice) on Dec 05, 2010 at 23:26 UTC

    I tried altering code and adding the version with the hash, but that made it so no matter what the $response was I always got +1 to # of wins

      It seems to be storing the previous $response...For example if $theword equals wax and $response equals axe, I get +1 #number of losses, and if the next $theword equals wax again and $response equals arrow I get +1 to # of wins, because it is reading the previous $response, it's some kind of logic error, I've been playing around with it for a while but I still can't get it, i'm relatively new to perl, so if you notice any logic problems in the code can someone let me know thank you

      #!/usr/bin/perl use strict; use warnings; use Template; print "Content-type: text/html\n\n"; use CGI qw(:standard); my @words=("sparrow","wax","field","tear"); my $theword=$words[rand @words]; my $startwin=0; my $startlose=0; my $game=param('submit'); my $win=param('win'); my $lose=param('lose'); my $response=param('response'); my $picselect=param('picselect'); my $arrow=param('arrow'); my $axe=param('axe'); my $shield=param('shield'); my $spear=param('spear'); my $correctryhm=param('correctryhm'); #another way of setting up a hash #needs to know where the templates are my $config={ INCLUDE_PATH =>'../../projectTemplate', #or list ref INTERPOLATE => 1, #expand '$var' in plain text POST_CHOMP => 1, #cleans up whitespace EVAL_PERL =>1, #evaluate Perl code blocks }; #<body background="../../projectTemplate/indianbackground"> my $output=<<_html_; <html> <body> </body> </html> _html_ print $output; #create a template object #-> means 'send to' my $template=Template->new($config); $response = param('response'); $win = param('win'); $lose = param('lose'); if($game eq "Fight") { if($response eq "arrow" && $correctryhm eq "sparrow") { ++$win; } elsif($response ne "arrow" && $correctryhm eq "sparrow") { ++$lose; } if($response eq "axe" && $correctryhm eq "wax") { ++$win; } elsif($response ne "axe" && $correctryhm eq "wax") { ++$lose; } if($response eq "shield" && $correctryhm eq "field") { ++$win; } elsif($response ne "shield" && $correctryhm eq "field") { ++$lose; } if($response eq "spear" && $correctryhm eq "tear") { ++$win; } elsif($response ne "spear" && $correctryhm eq "tear") { ++$lose; } if ($win <= 9 && $lose <= 10) { print "<h3>Ryhm the words to win the battle!</h3>"; print "<form method=\"post\" action=\"ryhm.cgi\">"; print "<input type=\"hidden\" name=\"win\" value=\"$win\">"; print "<input type=\"hidden\" name=\"lose\" value=\"$lose\">"; print "<input type=\"hidden\" name=\"response\" value=\"$picselect +\">"; print "<input type=\"hidden\" name=\"correctryhm\" value=\"$thewor +d\">"; print "<input name=\"submit\" type=\"submit\" value=\"Fight\" /> < +br>"; print "Wins: $win <br>"; print "Losses: $lose <br>"; #goes into var1 from projectTemplate and creates image map my $var1=<<_html_; <html> <body> <IMG src="../../projectTemplate/arrow.jpg\" align="left" /><input name +="picselect" type="radio" value="arrow" /> <input type="hidden" name="response" value="$arrow"> <input type="hidden" name="response" value="$picselect"> </body> </html> _html_ #goes into var2 from projectTemplate and creates image map my $var2=<<_html_; <html> <body> <IMG src="../../projectTemplate/axe.jpg\" /><input name="picselect" ty +pe="radio" value="axe" /> <input type="hidden" name="response" value="$axe"> <input type="hidden" name="response" value="$picselect"> </body> </html> _html_ #goes into var3 and writes the random word in the box my $var3="<h3>$theword</h3> <input type=\"hidden\" name=\"correctryhm\ +" value=\"$theword\">"; #goes into var4 from projectTemplate and creates image map my $var4="<IMG src=\"../../projectTemplate/shield.jpg\" align=\"left\" +> <input name=\"picselect\" type=\"radio\" value=\"shield\" />"; #goes i +nto var5 from projectTemplate print "<input type=\"hidden\" name=\"response\" value=\"$shield\"> <input type=\"hidden\" name=\"response\" value=\"$picselect\">"; #goes into var5 from projectTemplate my $var5="<IMG src=\"../../projectTemplate/spear.jpg\"> <input name=\"picselect\" type=\"radio\" value=\"spear\" />"; print "<input type=\"hidden\" name=\"response\" value=\"$spear\"> <input type=\"hidden\" name=\"response\" value=\"$picselect\">"; #set up another hash with var1, var2, var3, var4, var5 my $vars={ var1=>$var1, var2=>$var2, var3=>$var3, var4=>$var4, var5=>$var5, }; #gets from template file my $inputfile='ryhmgame.tpl'; $template->process($inputfile,$vars) || die print "not done"; print "</form>"; } if ($win == 10) { print "<h2>You won the battle!</h2>"; print "Congradualations you held off the enemy!"; } if ($lose > 10) { print "<h2>You failed to kill enough people</h2>"; print "Your family is dead <br>"; print "Game Over <br>"; $output=<<_html_; <a href="http://esprit.champlain.edu/~ggrillone32001/gamestart.htm">Re +-start game</a> _html_ print $output; } } else{ print "<h1>You are about to enter a battle!</h1>"; print "<form action=\"ryhm.cgi\" method=\"post\">"; print "<input name=\"submit\" type=\"submit\" value=\"Fight\" />"; print "<input type=\"hidden\" name=\"win\" value=\"$startwin\">"; print "<input type=\"hidden\" name=\"lose\" value=\"$startlose\">" +; print"</form>"; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://875444]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (11)
As of 2014-09-18 17:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (120 votes), past polls