// TIC TAC TOE // A server script for ArtyOnline server application // by Arty-fishL // 4 Aug 2012 /* ---------- * SETUP API */ importPackage(Packages.tk.artyfl.artyonline.script); var print = Terminal.outln; /* ---------- * VARIABLES */ var started = false, xPlayer = null, yPlayer = null, mrStage = 0, readyX = false, readyY = false, whosGo = null; // board var line1 = [0, 0, 0], line2 = [0, 0, 0], line3 = [0, 0, 0]; /* ---------- * FUNCTIONS */ function setupGame() { // randomly choose x and o player if (Math.round( Math.random() ) === 0) { // first player is x xPlayer = Users.getUsers()[0]; yPlayer = Users.getUsers()[1]; } else { // second player is x xPlayer = Users.getUsers()[1]; yPlayer = Users.getUsers()[0]; } // randomly choose who plays first if (Math.round( Math.random() ) === 0) { // x goes first whosGo = xPlayer; } else { // y goes first whosGo = yPlayer; } // inform who is playing what var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("play as"), ["x", (whosGo === xPlayer)]); Messages.sendMessage(message); message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("play as"), ["y", (whosGo === yPlayer)]); Messages.sendMessage(message); // replies will be received in onMessageReceived event mrStage = 1; } function replyWhoXY(message) { // - reply to who is x and y if (message.getMessage() === Messages.MessageBank.get("understood")) { // confirmed player is ready if (message.getUser() === xPlayer) { readyX = true; } else if (message.getUser() === yPlayer) { readyY = true; } // if both players are ready start play if (readyX && readyY) { // let play commence mrStage = 2; } } else { // somebody didnt understand, try sending again var message2 = null; if (message.getUser() === xPlayer) { message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["x"]); } else if (message.getUser() === yPlayer) { message2 = Messages.SimpleMessage(message.getUser(), Messages.MessageBank.get("play as"), ["y"]); } Messages.sendMessage(message2); } } function changePlayer() { // next persons go if (whosGo === xPlayer) { whosGo = yPlayer; } else { whosGo = xPlayer; } } function checkForWin() { // check to see if a plyer has won var sequence = line1.concat(line2, line3), winningSequences = [ ["tl", "tm", "tr"] , ["ml", "mm", "mr"] , ["bl", "bm", "br"] , ["tl", "ml", "bl"] , ["tm", "mm", "bm"] , ["tr", "mr", "br"] , ["tl", "mm", "br"] , ["tr", "mm", "bl"] ], playingPiece = 0; if (whosGo === xPlayer) { playingPiece = 1; } else { playingPiece = 2; } var placeMap = { 0: "tl", 1: "tm", 2: "tr", 3: "ml", 4: "mm", 5: "mr", 6: "bl", 7: "bm", 8: "br" }, playedPlaces = []; for (i=0; i<9; i++) { if (sequence[i] === playingPiece) { playedPlaces.push(placeMap[i]); } } for (i=0; i < winningSequences.length; i++) { if (playedPlaces.contains(winningSequences[i][0]) && playedPlaces.contains(winningSequences[i][1]) && playedPlaces.contains(winningSequences[i][2])) { // matched a winning sequence return true; } } // no winning matches return false; } function informCurrentMove(line, box) { var mp = null; if (whosGo === xPlayer) { mp = yPlayer; } else { mp = xPlayer; } var message = Messages.SimpleMessage(mp, Messages.MessageBank.get("other player moved"), [line, box]); Messages.sendMessage(message); } function informNextMove() { var message = Messages.SimpleMessage(whosGo, Messages.MessageBank.get("your go"), []); Messages.sendMessage(message); } function informWinner() { var winner = ""; if (whosGo === xPlayer) { winner = "x"; } else { winner = "y"; } var message = Messages.SimpleMessage(xPlayer, Messages.MessageBank.get("winner"), [winner]); Messages.sendMessage(message); message = Messages.SimpleMessage(yPlayer, Messages.MessageBank.get("winner"), [winner]); Messages.sendMessage(message); } function makeMove(message) { // current player chose position var line = message.getVars[0], box = message.getVars[1], xo = 0; if (whosGo === xPlayer) { xo = 1; } else { xo = 2; } if(line === 1) { // play in line 1 line1[box] = xo; } else if(line === 2) { // play in line 2 line2[box] = xo; } else if(line === 3) { // play in line 3 line3[box] = xo; } // use move data informCurrentMove(line, box); if (checkForWin() === false) { // next move changePlayer(); informNextMove(); } else { // somebody won informWinner(); } } /* --------- * EVENTS */ Events.onLoad = function(vars) { // SETUP // limit players to 2 Users.setMaxUsers(2); // add messages to message bank Messages.MessageBank.add( ["wait other player", "make move", "other player moved", "winner", "play as", "understood", "your go"] ); }; Events.onJoin = function(vars){ // wait for 2 players to join if (Users.getUsers().length === 2) { // start game started = true; setupGame(); } else { // still waiting for players to join print("Waiting for other player to join"); // inform user who just joined var message = Messages.SimpleMessage(vars[0], Messages.MessageBank.get("wait other player"), []); Messages.sendMessage(message); } }; Events.onMessageReceive = function(vars) { // get message var message = vars[0]; // check for various functions if (mrStage === 1) { // reply to who is x and y replyWhoXY(message); } else if (mrStage === 2 && message.getMessage() === Messages.MessageBank.get("make move") && message.getUser() === whosGo) { // telling where player will move makeMove(message); } }; Events.onCommand = function(vars) { // print understood var command = vars[0]; print(command.getCommand()); };