### 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,

```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\$..\$/

Replies are listed 'Best First'.
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
<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
<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\">
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 "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>";

}

Create A New User
Node Status?
node history
Node Type: note [id://875444]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (8)
As of 2017-06-26 11:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
How many monitors do you use while coding?

Results (577 votes). Check out past polls.