// This script lets the bot play Connect 4 // It uses the games-sdk.js for the UI. // It can play with random moves, or be connected to a deep learning network. state Connect4 { pattern "connect 4" template start(); pattern "connect four" template start(); pattern "[quit stop q]" topic "connect 4" template endgame(); pattern "*" topic "connect 4" template play(); pattern "[yes yep yeah y ok okay]" topic "endgame" answer start(); pattern "*" topic "endgame" answer end(); function start() { conversation.topic = "connect 4"; conversation.drop = 1; conversation.currentMove="X"; var x=7; var y=6; conversation.xval=7; conversation.yval=6; var a=[0, 1]; var board=""; var b=a.random(); for (var count = 0; count < x*y; count++) { board=board+"_"; } conversation.board=board; if (b==0) { conversation.player="X"; conversation.bot="O"; Avatar.setCommand({ type: "game", start:"Connect4", board: board }); return "Your Move"; } else { conversation.player="O"; conversation.bot="X"; randomMove(); //deepLearningMove(); Avatar.setCommand({ type: "game", start:"Connect4", board: conversation.board }); return "Your Move"; } return "fish"; } function play() { var board=conversation.board; var boo=false; var playedmove= star; var p=0; //Debug(playedmove); //Debug("start of for"); //Debug("x="); //Debug(conversation.xval); //Debug("y="); //Debug(y); for (var count = 1; count <= conversation.xval; count++) { if (count.toString() == playedmove){ p=count; boo=true; break; } } //Debug(p); if (!boo) { Avatar.setCommand({ type: "game", board: conversation.board }); return "InvalidMove"; } if (p<=0 || p> conversation.xval) { Avatar.setCommand({ type: "game", board: conversation.board }); return "InvalidMove"; } conversation.drop = p; var count=0; var s=move(); var full=true; if (s=="valid") { if (checkend()) { Avatar.setCommand({ type: "game", board: conversation.board }); return "You've won! "+ endgame(); } for (count=0;count<42;count++) { var sub=conversation.board.substring(count, count+1); if (sub== "_") { full=false; break; } } if (full) { Avatar.setCommand({ type: "game", board: conversation.board }); return "this is a draw"+endgame(); } randomMove(); //deepLearningMove(); if (checkend()) { Avatar.setCommand({ type: "game", board: conversation.board }); return "I have won! "+ endgame(); } full=true; for (count=0;count<42;count++) { var sub=conversation.board.substring(count, count+1); if (sub== "_") { full=false; break; } } if (full) { Avatar.setCommand({ type: "game", board: conversation.board }); return "this is a draw"+endgame(); } Avatar.setCommand({ type: "game", board: conversation.board }); return "Your move"; } return s; } function checkend() { var newB=conversation.board; //Debug(newB); var coord=0; var sub=""; //Debug("Horizontal"); var i=0; var j=0; for (j=0; j=0; tile= tile - conversation.xval) { var character= conversation.board.substring(tile, tile+1); if (character == "_"){ dropped= tile; boo=true; break; } } if (!boo) { Avatar.setCommand({ type: "game", board: conversation.board }); return "The column is full"; } //Debug(conversation.board); conversation.board=conversation.board.substring(0, dropped) + conversation.currentMove+ conversation.board.substring(dropped+1, conversation.xval*conversation.yval); if (conversation.currentMove == "X") { conversation.currentMove ="O"; } else { conversation.currentMove = "X"; } return "valid"; } function endgame() { conversation.topic="endgame"; return "Play again?"; } function end() { conversation.topic=null; return "GG well played"; } function deepLearningMove() { var data = " "; for (var count = 0; count < 42; count++) { var piece=conversation.board.substring(count, count+1); var input = "0"; if (piece == "_") { input = "0"; } else if (piece== conversation.bot) { input = "1"; } data = data + input; data = data + ", "; } for (var count = 0; count < 42; count++) { var piece=conversation.board.substring(count, count+1); var input = "0"; if (piece == "_") { input = "0"; } else if (piece== conversation.player) { input = "1"; } data = data + input; if (count!=41) { data = data + ", "; } } data = data + " "; //Debug("" + data + ""); var result = Http.postXML("https://www.botlibre.com/rest/api/test-data-analytic", data); var outputs = result.output; //Debug(outputs); //Debug("outputs"); // convert the output to an array var position = 0; var output = "0"; var outputArray = new Array(); while(outputs.indexOf(",") != -1) { position = outputs.indexOf(","); output = outputs.substring(0,position); output.toNumber(); outputArray.add(output); outputs = outputs.substring(position + 1,outputs.length()); } outputArray.add(outputs); //Debug(outputArray); //Debug("output"); // Determine from list of legal moves which output has highest score. var best = "-1"; var bestmove=0; var validMove=[]; for (var i=1; i<=conversation.xval; i++) { //Debug(conversation.board.substring(i - 1, i)); if (conversation.board.substring(i - 1, i) == "_") { validMove.add(i); } } //Debug("Valid"); //Debug(validMove); for (var j = 0; j < validMove.length(); j++) { var moveTo = validMove[j]; var index=moveTo; //Debug(outputArray[index - 1].toNumber()); //Debug("outputarr"); //Debug(best.toNumber()); if (outputArray[index - 1].toNumber()> best.toNumber()) { best = outputArray[index - 1]; bestmove=index; } } conversation.drop=bestmove; return move(); } }