I'll try to break this down a little:

$Z= 'ox' x 5; ## Only ten characters are needed because each ## game has a maximum of nine moves ## The grid, stored as a string: $_='1 2 3\n4 5 6\n7 8 9 "; { ## Start the generic loop $C = chop $Z; ## Strip the last character from $Z ('x' or 'o') ## and store it into $C print "\n$_=>$C"; ## Print the current grid, then the current letter + { ## Begin small inner loop <> =~ /^([\d])$/i && ## Grab input, must be a single digit... s/$1/$C/m ## Try to replace the number the user gave ($1) ## with the current character. or redo; ## If either of the above fails, redo this smal +l ## inner loop. } ## end inner loop m/(^($C.){3})|(($C.{5}){2}$C)|(($C.{7}){2}$C)|(^.(...$C){3})/sm ## The above is a nasty regular expression that checks to see if ## the game has been won. It checks for four ## things, inside the four parenthesis above. If any are true, ## then the expression is true, and the game is won (and over). ## Here they are: /^($C.){3})/ ## Checks for a horizontal match. Basically, it ## looks for the start of a line. Then it looks ## for the current letter followed by anything ## three times. In practice, this means it matches ## a character, a space, a character, a space, ## a character, and a newline /($C.{5}){2}$C/ ## This checks for a vertical match. Since the grid ## is constant, we know that three vertical characters + ## are a set distance apart. In this case, for our ## 3x3 grid, we are looking for the character, ## five anythings, the character, five anythings, ## and the character. /($C.{7}){2}$C/ ## This checks for a diagonal match, starting from ## the upper left-hand corner. Character, 7 anything, ## character, 7 anything, then the character. Only ## this diagonal matches this pattern. (^.(...$C){3}/ ## This checks for the opposite diagonal, starting fro +m ## the upper right-hand corner. It has the pattern ## of three anything, then the character, all three ## times. Since this could match other places, we use ## the anchor to specify only the diagonal we want or ++$T>8) or redo; ## Redo the outer loop *unless* one of the ## regular expressions matched *or* ## we have run 9 rounds. Anything else ## goes to the top of the generic loop } ## end the generic loop s/\d/-/g; print; ## We are done. Replace any numbers left in the ## grid with dashes, and re-display the grid.

Hope that helps. I did change a couple things since it was first posted. The is not so much obfuscated code as it is very very short code. If I were really going for obfuscation, I would not use variables such as $T and $C. :) See Adam's code above for the same thing a bit more obfuscated.

As far as making it a cgi, you could, but why? Nobody would be able to see it, only interact with it - as far as they know, it could be a 10,000 line perl script or a 1/2 Meg executable. Still, it should be possible. It's too late to type any more though. :)


In reply to RE: Tic Tac Chop by turnstep
in thread Tic Tac Chop by turnstep

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.