��
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