ASP Shopping Cart
,
Forum
&
BBS
- all for $20 from
CodeToad Plus!
Home
||
ASP
|
ASP.Net
|
C++/C#
|
DHTML
|
HTML
|
Java
|
Javascript
|
Perl
|
VB
|
XML
||
CodeToad Plus!
||
RAM
Search Site:
Perl Tic Tac Toe
Article by:
Premshree Pillai (9/22/2003)
Add to Favourites
Tell a friend
Summary:
The classic Tic Tac Toe game written in Perl!
Viewed:
95657
times
Rating (194 votes):
4.9
out of 5
Rate this Article
Read Comments
Post Comments
Perl Tic Tac Toe
View Online Demo
Here's a great and fun way for you to get to grips with a bit of perl - Premshree Pillai has put together of the classic game 'Tic Tac Toe' in a Perl script, specially for you.
Select All Code
#!/usr/bin/perl -T ############################################################################# # # Script: tic-tac-toe.pl # Author: Premshree Pillai # Description: Tic-Tac-Toe game in Perl # Web: http://www.qiksearch.com # E-mail: qiksearch@rediffmail.com # Created: 29/11/02 (dd/mm/yy) # # © 2002 Premshree Pillai. All rights reserved. # ############################################################################ use warnings; use CGI; $game = new CGI; $bsize=3; $playerToken="X"; $myToken="0"; $gameOver=0; @winArr; # Arrays for testing for($x=0; $x<$bsize*$bsize; $x++) { $rowArr[$x]=0; $colArr[$x]=0; $digArr[$x]=0; } print "Content-type: text/html\n\n"; print '<html>'; print '<head>'; print '<title>Tic Tac Toe in Perl</title>'; print '<style type="text/css">'; print '.main{border:#666666 solid 2px; width:350px}'; print '.btn{font-family:comic sans ms,verdana,arial,helvetica; font-size:20pt; font-weight:bold; background:#CCCCCC; width:50px; height:50px; border:#999999 solid 1px; cursor:hand}'; print '.btn_over{font-family:comic sans ms,verdana,arial,helvetica; font-size:20pt; font-weight:bold; background:#FFFFFF; width:50px; height:50px; border:#999999 solid 1px; cursor:hand}'; print '.btn_down{font-family:comic sans ms,verdana,arial,helvetica; font-size:20pt; font-weight:bold; background:#999999; width:50px; height:50px; border:#999999 solid 1px; cursor:hand}'; print '.footer{font-family:verdana,arial,helvetica; font-size:8pt; color:#FFFFFF}'; print '.link{font-family:verdana,arial,helvetica; font-size:8pt; color:#FFFFFF}'; print '.link:hover{font-family:verdana,arial,helvetica; font-size:8pt; color:#FFCC00}'; print '</style>',"\n"; print '<script language="JavaScript">',"\n"; print 'var doneFlag=false;',"\n"; print 'function toggleVal(who)',"\n"; print '{',"\n"; print 'var check;'; print 'eval(\'check=document.ttt.\'+who+\'_btn.value;\');',"\n"; print 'if(check=="")'; print '{'; print 'if(!doneFlag)'; print '{'; print 'eval(\'document.ttt.\'+who+\'_btn.value="'.$playerToken.'";\');',"\n"; print 'eval(\'document.ttt.\'+who+\'_btn.disabled="true";\');',"\n"; print 'eval(\'document.ttt.\'+who+\'.value="'.$playerToken.'";\');',"\n"; print 'document.ttt.submit();'; print 'doneFlag=true;'; print 'document.getElementById(\'process\').innerHTML="Processing.........";'; print '}'; print '}'; print 'else'; print '{'; print 'alert(\'Invalid Move!\');'; print '}'; print '}',"\n"; print '</script>',"\n"; print '</head>'; print '<body>',"\n"; print '<table width="100%" height="100%"><tr><td align="center">'; print '<table width="346" align="center" bgcolor="#666666" cellspacing="0" cellpadding="0"><tr><td></td></tr></table>'; print '<table width="348" align="center" bgcolor="#666666" cellspacing="0" cellpadding="0"><tr><td></td></tr></table>'; print '<table align="center" cellspacing="0" cellpadding="0" class="main"><tr><td align="center">'; print '<table width="100%" bgcolor="#666666" cellspacing="0" cellpadding="0"><tr><td align="center"><a href="tic-tac-toe.pl"><img src="../ttt_perl.gif" border="0" alt="Tic Tac Toe (in Perl)"></a></td></tr></table>'; print '<table width="100%" bgcolor="#999999" cellspacing="0" cellpadding="0"><tr><td align="center"><a href="http://www.qiksearch.com"><img src="../qiksearch_ttt_perl.gif" border="0" alt="www.qiksearch.com"></a></td></tr></table>'; sub genBox { ($size)=@_; my $count=0; $retVal='<form name="ttt" method="post" action="tic-tac-toe.pl">'; for($i=0; $i<$size; $i++) { for($j=0; $j<$size; $j++) { $count++; $retVal.='<input type="button" name="s'.$count.'_btn" value="" class="btn" onClick="toggleVal(\'s'.$count.'\')" onMouseover="this.className=\'btn_over\'" onMouseout="this.className=\'btn\'" onMousedown="this.className=\'btn_down\'"><input type="hidden" name="s'.$count.'" value="">'; } $retVal.='<br>'; } $retVal.='</form>'; print $retVal; } sub genBox2 { ($size,@arr)=@_; my $count=0; $retVal='<form name="ttt" method="post" action="tic-tac-toe.pl">'; for($i=0; $i<$size; $i++) { for($j=0; $j<$size; $j++) { $count++; $retVal.='<input type="button" name="s'.$count.'_btn" value="'.$arr[$count-1].'" class="btn" onClick="toggleVal(\'s'.$count.'\')" onMouseover="this.className=\'btn_over\'" onMouseout="this.className=\'btn\'" onMousedown="this.className=\'btn_down\'"><input type="hidden" name="s'.$count.'" value="'.$arr[$count-1].'">'; } $retVal.='<br>'; } $retVal.='</form>'; print $retVal; } sub isEmpty { ($who)=@_; if($who eq "") { return 1; } else { return 0; } } sub move { my ($bsize,@arr)=@_; $count=0; $maxCount=0; # Build Row Array for($i=0; $i<$bsize; $i++) { $maxCount=0; $fullCounter=0; for($j=0; $j<$bsize; $j++) { $count++; $who=$arr[$count-1]; if($who eq $playerToken) { $maxCount++; $fullCounter++; } if($who eq $myToken) { $fullCounter++; } } $rowArr[$i]=$maxCount; if($fullCounter==$bsize) { $rowArr[$i]=-1; } } # Building Column Array for($i=0; $i<$bsize; $i++) { $count=$i+1; $maxCount=0; $fullCounter=0; for($j=0; $j<$bsize; $j++) { $who=$arr[$count-1]; if($who eq $playerToken) { $maxCount++; $fullCounter++; } if($who eq $myToken) { $fullCounter++; } $count+=$bsize; } $colArr[$i]=$maxCount; if($fullCounter==$bsize) { $colArr[$i]=-1; } } # Building Diagonal Array for($i=0; $i<2; $i++) { if($i==0) { $count=$i+1; } else { $count=$bsize; } $maxCount=0; $fullCounter=0; for($j=0; $j<$bsize; $j++) { $who=$arr[$count-1]; if($who eq $playerToken) { $maxCount++; $fullCounter++; } if($who eq $myToken) { $fullCounter++; } if($i==0) { $count+=$bsize+1; } else { $count+=$bsize-1; } } $digArr[$i]=$maxCount; if($fullCounter==$bsize) { $digArr[$i]=-1; } } # Finding Max Values $maxRow=max(0,$bsize,"row",@rowArr); $maxCol=max(0,$bsize,"col",@colArr); $maxDig=max(0,$bsize,"dig",@digArr); @maxArrs=(max(1,$bsize,"row",@rowArr),max(1,$bsize,"col",@colArr),max(1,$bsize,"dig",@digArr)); if(max(0,$bsize,"x",@maxArrs)==0) { $pos=$bsize*($maxRow+1)-$bsize; } if(max(0,$bsize,"x",@maxArrs)==1) { $pos=$maxCol; } if(max(0,$bsize,"x",@maxArrs)==2) { if($maxDig==0) { $pos=$maxDig; } else { $pos=$bsize-1; } } $retFlag=0; for($y=0; $y<$bsize; $y++) { if(!$retFlag) { if($arr[$pos] eq "") { $retVal=$pos; $retFlag=1; } if(max(0,$bsize,"x",@maxArrs)==0) { $pos++; } if(max(0,$bsize,"x",@maxArrs)==1) { $pos+=$bsize; } if(max(0,$bsize,"x",@maxArrs)==2) { if($maxDig==0) { $pos+=$bsize+1; } else { $pos+=$bsize-1; } } } } return $retVal; } sub max { ($what,$bsize,$type,@arr)=@_; my $max=-1,my $maxIndex=-1; if(type ne "dig") { for($i=0; $i<$bsize; $i++) { if($arr[$i]>$max) { $max=$arr[$i]; $maxIndex=$i; } } } if(type eq "dig") { for($i=0; $i<2; $i++) { if($arr[$i]>$max) { $max=$arr[$i]; $maxIndex=$i; } } } if($what==0) { return $maxIndex; } else { return $max; } } sub playerWin() { $who=$playerToken; if(($s1 eq $who && $s2 eq $s1 && $s3 eq $s1) || ($s4 eq $who && $s5 eq $s4 && $s6 eq $s4)||($s7 eq $who && $s8 eq $s7 && $s9 eq $s7) ||($s1 eq $who && $s4 eq $s1 && $s7 eq $s1) ||($s2 eq $who && $s5 eq $s2 && $s8 eq $s2) ||($s3 eq $who && $s6 eq $s3 && $s9 eq $s3) ||($s1 eq $who && $s5 eq $s1 && $s9 eq $s1) ||($s3 eq $who && $s5 eq $s3 && $s7 eq $s3)) { return 1; } else { return 0; } } sub iWin() { $who=$myToken; if(($s1 eq $who && $s2 eq $s1 && $s3 eq $s1) || ($s4 eq $who && $s5 eq $s4 && $s6 eq $s4)||($s7 eq $who && $s8 eq $s7 && $s9 eq $s7) ||($s1 eq $who && $s4 eq $s1 && $s7 eq $s1) ||($s2 eq $who && $s5 eq $s2 && $s8 eq $s2) ||($s3 eq $who && $s6 eq $s3 && $s9 eq $s3) ||($s1 eq $who && $s5 eq $s1 && $s9 eq $s1) ||($s3 eq $who && $s5 eq $s3 && $s7 eq $s3)) { return 1; } else { return 0; } } sub whereWinComp() { $who=$myToken; if(($s1 eq $who && $s2 eq $s1 && $s3 eq $s1)) { @winArr=('s1','s2','s3'); } if(($s4 eq $who && $s5 eq $s4 && $s6 eq $s4)) { @winArr=('s4','s5','s6'); } if(($s7 eq $who && $s8 eq $s7 && $s9 eq $s7)) { @winArr=('s7','s8','s9'); } if(($s1 eq $who && $s4 eq $s1 && $s7 eq $s1)) { @winArr=('s1','s4','s7'); } if(($s2 eq $who && $s5 eq $s2 && $s8 eq $s2)) { @winArr=('s2','s5','s8'); } if(($s3 eq $who && $s6 eq $s3 && $s9 eq $s3)) { @winArr=('s3','s6','s9'); } if(($s1 eq $who && $s5 eq $s1 && $s9 eq $s1)) { @winArr=('s1','s5','s9'); } if(($s3 eq $who && $s5 eq $s3 && $s7 eq $s3)) { @winArr=('s3','s5','s7'); } } sub whereWinPlayer() { $who=$playerToken; if(($s1 eq $who && $s2 eq $s1 && $s3 eq $s1)) { @winArr=('s1','s2','s3'); } if(($s4 eq $who && $s5 eq $s4 && $s6 eq $s4)) { @winArr=('s4','s5','s6'); } if(($s7 eq $who && $s8 eq $s7 && $s9 eq $s7)) { @winArr=('s7','s8','s9'); } if(($s1 eq $who && $s4 eq $s1 && $s7 eq $s1)) { @winArr=('s1','s4','s7'); } if(($s2 eq $who && $s5 eq $s2 && $s8 eq $s2)) { @winArr=('s2','s5','s8'); } if(($s3 eq $who && $s6 eq $s3 && $s9 eq $s3)) { @winArr=('s3','s6','s9'); } if(($s1 eq $who && $s5 eq $s1 && $s9 eq $s1)) { @winArr=('s1','s5','s9'); } if(($s3 eq $who && $s5 eq $s3 && $s7 eq $s3)) { @winArr=('s3','s5','s7'); } } sub draw { my $drawCounter=0; foreach(@vals) { if($_ ne "") { $drawCounter++; } } if($drawCounter==$bsize*$bsize) { return 1; } else { return 0; } } if($game->param() && $ENV{'REQUEST_METHOD'} eq "POST") { $s1=$game->param('s1'); $s2=$game->param('s2'); $s3=$game->param('s3'); $s4=$game->param('s4'); $s5=$game->param('s5'); $s6=$game->param('s6'); $s7=$game->param('s7'); $s8=$game->param('s8'); $s9=$game->param('s9'); @vals=($s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9); if(draw() || playerWin()) { $gameOver=1; } # Computer's Move! $movIndex=move($bsize,@vals); if(!$gameOver) { $vals[$movIndex]=$myToken; } # Update S's if(!$gameOver) { if($movIndex==0) { $s1=$myToken; } if($movIndex==1) { $s2=$myToken; } if($movIndex==2) { $s3=$myToken; } if($movIndex==3) { $s4=$myToken; } if($movIndex==4) { $s5=$myToken; } if($movIndex==5) { $s6=$myToken; } if($movIndex==6) { $s7=$myToken; } if($movIndex==7) { $s8=$myToken; } if($movIndex==8) { $s9=$myToken; } } genBox2($bsize,@vals); if (playerWin()) { print '<font face="verdana,arial,helvetica" color="#009900" size="4"><b>Wow! You Won!</b></font><br><br>'; print '<input type="button" onClick="location.href=\'tic-tac-toe.pl\'" value="Play Again!" style="background:#CCCCCC; font-weight:bold; cursor:hand"><br><br>'; whereWinPlayer(); print '<script language="JavaScript">'; foreach(@winArr) { print 'document.ttt.',$_,'_btn.style.color=\'#009900\';'; } for($w=0; $w<$bsize*$bsize; $w++) { if($vals[$w] eq "") { print 'document.ttt.s',$w+1,'_btn.disabled=true;'; } } print '</script>'; $gameOver=1; } if (iWin() && !$gameOver) { print '<font face="verdana,arial,helvetica" color="#FF0000" size="4"><b>Oops! You Lost!</b></font><br><br>'; print '<input type="button" onClick="location.href=\'tic-tac-toe.pl\'" value="Play Again!" style="background:#CCCCCC; font-weight:bold; cursor:hand"><br><br>'; whereWinComp(); print '<script language="JavaScript">'; foreach(@winArr) { print 'document.ttt.',$_,'_btn.style.color=\'#FF0000\';'; } for($w=0; $w<$bsize*$bsize; $w++) { if($vals[$w] eq "") { print 'document.ttt.s',$w+1,'_btn.disabled=true;'; } } print '</script>'; $gameOver=1; } if(draw() && !playerWin() && !iWin()) { print '<font face="verdana,arial,helvetica" color="#000000" size="4"><b>It\'s a Draw!</b></font><br><br>'; print '<input type="button" onClick="location.href=\'tic-tac-toe.pl\'" value="Play Again!" style="background:#CCCCCC; font-weight:bold; cursor:hand"><br><br>'; print '<script language="JavaScript">'; for($w=0; $w<$bsize*$bsize; $w++) { if($vals[$w] eq "") { print 'document.ttt.s',$w+1,'_btn.disabled=true;'; } } print '</script>'; } } else { genBox($bsize); } # Processing Div print '<div style="font-family:verdana,arial,helvetica; font-weight:bold; font-size:10pt; color:#CC0000; background:#CCCCCC; width:100%; padding:3px" id="process"></div>'; print '<table width="100%" bgcolor="#666666"><tr><td><span class="footer">© 2002 <a href="http://www.qiksearch.com" class="link">Premshree Pillai</a> | <a href="http://www.guestbookdepot.com/cgi-bin/guestbook.cgi?book_id=374186" class="link">Sign my Guestbook</a>.</span></td></tr></table>'; print '</td></tr></table>'; print '<table width="348" align="center" bgcolor="#666666" cellspacing="0" cellpadding="0"><tr><td></td></tr></table>'; print '<table width="346" align="center" bgcolor="#666666" cellspacing="0" cellpadding="0"><tr><td></td></tr></table>'; print '</td></tr></table>'; print '</body></html>';
Useful Links
CodeToad Experts
Can't find the answer?
Our
Site experts
are answering questions for free in the
CodeToad forums
Rate this article:
Poor
Excellent
View highlighted Comments
User Comments on 'Perl Tic Tac Toe '
Recent Forum Threads
Run a program both on windows and linux
VERO.SurfCAM.v2014
Schlumberger.Petrel.V2013.2
Petrel.V2013.2
Altair.HyperWorks.v12
VoluMill.v6.1
VoluMill.NEXION.6
VERO.SurfCAM.v2014
Schlumberger.Petrel.V2013.2
Recent Articles
ASP GetTempName
Decode and Encode UTF-8
ASP GetFile
ASP FolderExists
ASP FileExists
ASP OpenTextFile
ASP FilesystemObject
ASP CreateFolder
ASP CreateTextFile
Javascript Get Selected Text
privacy
-
contact
-
advertise
-
hot links
-
link to us
-
submit your article
© Copyright codetoad.com 2001-2015