Two player Tic-Tac-Toe

By Olliegod on Aug 11, 2007

This is a two player tic tac toe dialog which works through ctcp's. I haven't done extensive testing on it, but as far as I know it works fine.

To start type /tictactoe and the main dialog will come up. To invite a person to play, first ensure that they have the script and then go to the Game menu and click New Game. It's really pretty self explanatory and theres also a help dialog if you're still lost.

In order for this to work you and the person you wish to play with must have nothing interfereing with ctcps. This means you must have listening for ctcps turned on (/ctcps on) you must not have the usermode +T enabled, and you must not have another script that will interfere with the passing of ctcps.

Updated so if a player changes nicks you won't need to restart the game.

alias tictactoe dialog $iif($dialog(TicTac),-v,-md) TicTac TicTac
dialog TicTac {
  title "Two Player Tic Tac Toe"
  size -1 -1 120 110
  option dbu
  button "", 1, 29 25 20 20
  button "", 2, 50 25 20 20
  button "", 3, 71 25 20 20
  button "", 4, 29 46 20 20
  button "", 5, 50 46 20 20
  button "", 6, 71 46 20 20
  button "", 7, 29 67 20 20
  button "", 8, 50 67 20 20
  button "", 9, 71 67 20 20
  text "Tic Tac Toe by Olliegod", 10, 32 1 56 8, disable
  text "", 15, 2 10 116 14, center multi
  text "", 16, 2 90 116 14, center multi
  button "", 17, 1 1 1 1, hide ok
  menu "Game", 11
  item "New game", 12, 11
  item "End Game", 13, 11
  item "Reset", 14, 11
  menu "Help", 18
  item "Help", 19, 18
}
dialog TicTacHelp {
  title "Tic Tac Toe Help"
  size -1 -1 110 105
  option dbu
  text "To begin a new game, make sure the other player has this script and then select New Game from the Game menu. After you have started a game, to make a move you simply click the button of the box you want you make your move in. To end the game select End Game from the Games menu. After the game has ended, press Reset to play another round, or press End game to stop playing. For more help/support, contact either Poop or Buttsecks in #olliegod on irc.swiftirc.net.", 1, 4 8 104 78
  box "Tic Tac Toe Help", 2, 1 1 108 89
  button "Close", 3, 40 91 30 12, ok
}
dialog TicTacAcceptDecline {
  title "I like pie"
  size -1 -1 90 65
  option dbu
  button "Accept", 1, 13 51 30 12, ok
  button "Decline", 2, 47 51 30 12, cancel
  text "", 3, 1 1 86 47, multi
}
on *:DIALOG:TicTacAcceptDecline:sclick:1: {
  if (requesting isin $did($dname,3)) {
    set %ttt.nick $gettok($did($dname,3),1,32)
    set %ttt.mynick $me
    set %ttt.squares -10 -10 -10 -10 -10 -10 -10 -10 -10
    set %ttt.turn 2
    set %ttt.firstmove 1
    .ctcp %ttt.nick tictactoe acceptgame
    dialog -x TicTacAcceptDecline TicTacAcceptDecline
    dialog $iif($dialog(TicTac),-v,-md) TicTac TicTac
    did -ra TicTac 15 Current player: %ttt.nick
    did -ra TicTac 16 Waiting for %ttt.nick to make their move...
  }
  elseif (Are you sure you want isin $did($dname,3)) {
    .ctcp %ttt.nick tictactoe endgame 
    unset %ttt.*
    dialog -x TicTac TicTac
  }
}
on *:DIALOG:TicTacAcceptDecline:sclick:2: if (requesting isin $did($dname,3)) .ctcp $gettok($did($dname,3),1,32) tictactoe declinegame
on *:DIALOG:TicTac:menu:12: { .ctcp $$?="Enter nick of player to invite here $crlf $+ Note: Other player must have this script also" tictactoe newgame | did -ra $dname 15 Awaiting response from $! }
on *:DIALOG:TicTac:menu:13: if (%ttt.nick) { dialog $iif($dialog(TicTacAcceptDecline),-v,-md) TicTacAcceptDecline TicTacAcceptDecline | did -ra TicTacAcceptDecline 3 Are you sure you want to end the current game with %ttt.nick $+ ? | did -ra TicTacAcceptDecline 1 Yes | did -ra TicTacAcceptDecline 2 No }
on *:DIALOG:TicTac:menu:14: {
  if (%ttt.nick) {
    inc %ttt.firstmove
    did -re TicTac 1-9
    did -ra TicTac 15 Current player: %ttt.nick
    did -ra TicTac 16 $iif(2 // %ttt.firstmove,It is your turn to make a move.,Waiting for %ttt.nick to make their move...)
    set %ttt.moves 0
    set %ttt.squares -10 -10 -10 -10 -10 -10 -10 -10 -10
    set %ttt.turn $iif(2 // %ttt.firstmove,1,2)
    .ctcp %ttt.nick tictactoe reset
  }
}
on *:DIALOG:TicTac:menu:19: dialog $iif($dialog(TicTacHelp),-v,-m) TicTacHelp TicTacHelp
on *:DIALOG:TicTac:close:0: if (%ttt.nick) { .ctcp %ttt.nick tictactoe endgame | unset %ttt.* }
on *:DIALOG:TicTac:sclick:*: {
  if ($did isnum 1-9) && (%ttt.nick) && (%ttt.turn == 1) {
    set %ttt.squares $puttok(%ttt.squares,1,$did,32)
    set %ttt.turn 2
    inc %ttt.moves 
    did -rab $dname $did X
    did -ra TicTac 15 Current player: %ttt.nick
    did -ra $dname 16 Waiting for %ttt.nick to make their move...
    if (%ttt.moves >= 5) tictac.checkwinner
    .ctcp %ttt.nick tictactoe move $did
  }
}
on *:NICK: if ($nick == %ttt.mynick) { .ctcp %ttt.nick tictactoe newnick $nick | set %ttt.mynick $newnick }
ctcp *:tictactoe*:?: {
  if ($2 == newgame) {
    if (!%ttt.nick) {
      dialog $iif($dialog(TicTacAcceptDecline),-v,-md) TicTacAcceptDecline TicTacAcceptDecline
      did -ra TicTacAcceptDecline 3 $nick is requesting a game of Tic Tac Toe with you. Do you accept or decline?
    }
    else .ctcp $nick tictactoe declinegame alreadyplaying
    haltdef
  }
  elseif ($2 == acceptgame) && ($dialog(TicTac)) && ($nick == $gettok($did(TicTac,15),4,32)) {
    set %ttt.nick $nick
    set %ttt.mynick $me
    set %ttt.turn 1
    set %ttt.squares -10 -10 -10 -10 -10 -10 -10 -10 -10
    set %ttt.firstmove 2
    did -ra TicTac 15 Current player: %ttt.nick
    did -ra TicTac 16 It is your turn to make a move.
    haltdef
  }
  elseif ($2 == declinegame) && ($dialog(TicTac)) && ($nick == $gettok($did(TicTac,15),4,32)) {
    if ($3 == alreadyplaying) did -ra TicTac 15 $nick is already playing a game of Tic Tac Toe.
    else did -ra TicTac 15 $nick has declined your request to play Tic Tac Toe.
    haltdef
  }
  elseif ($2 == move) && ($dialog(TicTac)) && ($nick == %ttt.nick) {
    set %ttt.squares $puttok(%ttt.squares,2,$3,32)
    set %ttt.turn 1
    inc %ttt.moves
    did -rab TicTac $3 O
    did -ra TicTac 15 Current player: %ttt.nick
    did -ra TicTac 16 It is your turn to make a move.
    if (%ttt.moves >= 5) tictac.checkwinner
    haltdef
  }
  elseif ($2 == endgame) && ($dialog(TicTac)) && ($nick == %ttt.nick) {
    did -re TicTac 1-9,16
    did -ra TicTac 15 %ttt.nick has ended the current game of Tic Tac Toe
    unset %ttt.*
    haltdef
  }
  elseif ($2 == reset) && ($dialog(TicTac)) && ($nick == %ttt.nick) {
    inc %ttt.firstmove
    did -re TicTac 1-9
    did -ra TicTac 15 %ttt.nick has reset the game
    did -ra TicTac 16 $iif(2 // %ttt.firstmove,It is your turn to make a move.,Waiting for %ttt.nick to make their move...)
    set %ttt.moves 0
    set %ttt.squares -10 -10 -10 -10 -10 -10 -10 -10 -10
    set %ttt.turn $iif(2 // %ttt.firstmove,1,2)
    haltdef
  }
  elseif ($2 == newnick) && ($dialog(TicTac)) && ($3 == %ttt.nick) { set %ttt.nick $nick | haltdef }
}
alias tictac.addsquares return $calc($gettok(%ttt.squares,$1,32) + $gettok(%ttt.squares,$2,32) + $gettok(%ttt.squares,$3,32))
alias tictac.checkwinner {
  var %possiblewins = 1.2.3 4.5.6 7.8.9 1.4.7 2.5.8 3.6.9 1.5.9 3.5.7, %x = 1
  while (%x <= 8) {
    tokenize 46 $gettok(%possiblewins,%x,32)
    if (3 // $tictac.addsquares($1,$2,$3)) && ($tictac.addsquares($1,$2,$3) > 0) {
      did -ra TicTac 16 $iif($tictac.addsquares($1,$2,$3) == 3,You win!,You lose!) Press Reset to play again!
      set %ttt.turn 0
      return
    }
    inc %x
  }
  if (-10 !isin %ttt.squares) did -ra TicTac 16 Its a draw! Press Reset to play again!
}

Comments

Sign in to comment.
Dragon1-9-8-4   -  Nov 29, 2008

needs an on text command instead of /tictactoe so other ppl will see when you start it.something like on *:text:!tictactoe:#:{ or something like that i would like to see that.

 Respond  
guest598594   -  Sep 24, 2007

its pretty annoying that whenever u open something/click cancel or w/e that the thing closes on you

 Respond  
Olliegod   -  Aug 13, 2007

Thanks, glad you found the problem.

 Respond  
Ghost-lit Warder   -  Aug 12, 2007

Nice work on this snippet.

 Respond  
Ghost-lit Warder   -  Aug 12, 2007

Ah, I tried it out on a clean mIRC. Works fine. Sorry for the confusion lol.

 Respond  
Olliegod   -  Aug 12, 2007

It certainly should, most likely the problem is that the person on the other side either has listening for ctcps turned off, has mode +T on, or has some other type of interference with the ctcp that it sends them when you press reset on your side. If you could provide me with a little more information it would be great.

 Respond  
Ghost-lit Warder   -  Aug 12, 2007

When you press reset on one end of the game, the other side doesn\'t clear.

 Respond  
Olliegod   -  Aug 12, 2007

If anyone has some feedback of any kind it would be much appreciated.

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.