{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?7e02","webpack:///./src/components/GameOptionsView.vue?5c1d","webpack:///./src/components/ScoreView.vue?248c","webpack:///./src/components/TicTacToe.vue?d94e","webpack:///./src/App.vue?b79a","webpack:///./src/App.vue","webpack:///./src/registerServiceWorker.ts","webpack:///./src/views/Home.vue?4895","webpack:///./src/views/Home.vue","webpack:///./src/views/Home.vue?2d60","webpack:///./src/views/Home.vue?c853","webpack:///./src/views/TicTacToe.vue?0fd5","webpack:///./src/components/TicTacToe.vue?704d","webpack:///./src/components/ScoreView.vue?b7d0","webpack:///./src/components/ScoreView.vue","webpack:///./src/games/tictactoe/domain/models/GameDifficulty.ts","webpack:///./src/components/ScoreView.vue?e3be","webpack:///./src/components/ScoreView.vue?b439","webpack:///./src/components/GameOptionsView.vue?b31a","webpack:///./src/games/tictactoe/domain/models/GameOptions.ts","webpack:///./src/games/tictactoe/domain/models/PlayerType.ts","webpack:///./src/components/GameOptionsView.vue","webpack:///./src/games/tictactoe/domain/models/GameState.ts","webpack:///./src/components/GameOptionsView.vue?9489","webpack:///./src/components/GameOptionsView.vue?2bc3","webpack:///./src/games/tictactoe/domain/models/MoveResultType.ts","webpack:///./src/games/tictactoe/domain/events/EventHandler.ts","webpack:///./src/games/tictactoe/domain/events/MoveCompletedEvent.ts","webpack:///./src/games/tictactoe/domain/models/PlayerSymbol.ts","webpack:///./src/games/tictactoe/domain/events/GameStateChangedEvent.ts","webpack:///./src/games/tictactoe/domain/Player.ts","webpack:///./src/games/tictactoe/domain/Referee.ts","webpack:///./src/games/tictactoe/domain/AIMoves.ts","webpack:///./src/games/tictactoe/domain/AIPlayer.ts","webpack:///./src/games/tictactoe/domain/Score.ts","webpack:///./src/games/tictactoe/domain/Game.ts","webpack:///./src/games/tictactoe/renderers/GameRenderer.ts","webpack:///./src/games/tictactoe/domain/models/Square.ts","webpack:///./src/games/tictactoe/domain/Board.ts","webpack:///./src/games/tictactoe/renderers/LineRenderer.ts","webpack:///./src/games/tictactoe/renderers/SymbolRenderer.ts","webpack:///./src/games/tictactoe/renderers/BoardRenderer.ts","webpack:///./src/components/TicTacToe.vue","webpack:///./src/components/TicTacToe.vue?fad5","webpack:///./src/components/TicTacToe.vue?7815","webpack:///./src/views/TicTacToe.vue","webpack:///./src/views/TicTacToe.vue?20f9","webpack:///./src/views/TicTacToe.vue?c4c5","webpack:///./src/router/index.ts","webpack:///./src/store/index.ts","webpack:///./src/main.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","attrs","staticRenderFns","script","component","ready","console","log","registered","cached","updatefound","updated","offline","error","staticClass","_v","components","ref","musicSrc","autdioWinSrc","audioErrorSrc","activePlayer","player1Score","player2Score","gameState","on","newGameClicked","_m","_e","screenHeight","screenWidth","staticStyle","_s","rounds","gridSize","player2Type","difficulty","onOptionsChanged","class","GameDifficulty","directives","rawName","expression","$event","$$selectedVal","Array","filter","target","options","selected","map","val","_value","selectedPlayer2Type","multiple","player2TypChanged","_l","option","domProps","selectedDifficulty","difficultyChanged","selectedGridSize","increaseSize","decreaseSize","gameDifficulty","playerOneType","playerTwoType","computerResponseDelayMilliSeconds","Math","random","PlayerType","ICanWin","difficulties","BringItOn","Nightmare","Computer","player2Types","Human","old","raiseChanged","$emit","GameState","MoveResultType","type","eventDate","Date","callback","eventClassName","handlersMap","event","typeName","handlers","handler","PlayerSymbol","row","col","winType","State","playerName","playerSymbol","board","getNextMoveSymbol","symbol","WinType","center","floor","centerSquare","None","getCenterSquare","ro","f","square","getWinningHorizontalSquare","found","rowIndex","columnIndex","column","intRow","getWinningVerticalSquare","columns","bi","item","mis","ii","jj","lastFound","getWinningBottomLeftToTopRightSquare","ti","getWinningTopLeftToBottomRightSquare","opponnentSymbol","canPlayCenter","sqaure","getNightMareMode","getBringItOn","getICanWinMode","aiMoves","getSquares","X","O","canWinHorizontal","canWinVertical","canWinTopLeftToBottomRight","nextMove","canWinBottomLeftToTopRight","arr","getSquare","player","isHorizontalWin","HorizontalWin","isVerticalWin","VerticalWin","isTopLeftToBottomRightWin","TopLeftToBottomRight","isBottomLeftToTopRight","BottomLeftToTopRight","stateToFind","nextMoveCanWin","array","player1","player2","draw","winningSymbol","NotStarted","rules","lastWinner","score","currentUser","playerOne","getPlayer1Score","playerTwo","getPlayer2Score","register","createPlayer","getPlayerOneType","getGameDifficulty","getPlayerTwoType","lastStartPlayer","setGameState","InProgress","initialisePlayers","incrementRounds","getGridSize","restart","nextAIMove","moveIsValid","setSquare","hasWon","setLastWinnerSymbol","incrementScore","Won","isFull","setDraw","Draw","setNextPlayer","trigger","Success","Invalid","aiMove","getComputerResponseDelayMilliSeconds","setTimeout","move","state","playerType","setGameDifficulty","boardRenderer","onMoveCompletedEvent","e","getGameState","drawWinningLine","onBoardClicked","onMoveCompleted","destroy","clearAllHandlers","rowNo","columnNo","lastPlayerSymbol","nextPlayerSymbol","createbord","currentSymbol","setSymbol","setNextMoveSymbol","start","end","drawContext","lineType","vertices","color","stop","startX","startY","endY","endX","id","animate","step","cancelAnimationFrame","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","verticaLine","horizontalLine","requestAnimationFrame","x","y","fps","beginPath","lineCap","lineWidth","strokeStyle","moveTo","lineTo","stroke","closePath","height","width","squareHeight","squareWidth","drawX","drawO","clear","uiSquare","roNo","padding","vx","area","setShadow","fillStyle","fillRect","clearShadow","offset","halfSectionSize","centerX","centerY","radius","startAngle","PI","endAngle","arc","boardHeight","boardWidth","cols","rows","canvas","boardLines","squares","onBoardClickedLocal","rect","getBoundingClientRect","pos","clientX","left","clientY","top","getSelectedUISquare","getContext","symbolRenderer","addEventListener","drawBoard","createSquares","removeEventListener","forEach","clearBoard","clearRect","context","tt","startAnimation","drawSymbol","render","foundSquare","every","boardSquare","computerDelay","draws","backgroundColor","innerWidth","innerHeight","tictactoeApp","gameOptions","initialiseCanvas","initialiseGame","parseInt","toString","newcanvas","onMoveCommandCompleted","onGameStateChanged","getActivePlayerSymbol","refreshGameScore","newGame","ed","getScore","getRound","getDraws","playWinSound","playSound","playErrorSound","$refs","audioError","play","pause","currentTime","audio","audioWin","gridnew","ScoreView","GameOptionsView","TicTacToe","use","routes","path","router","Store","mutations","actions","config","productionTip","store","h","App","$mount"],"mappings":"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","file":"js/app.64f2654e.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameOptionsView.vue?vue&type=style&index=0&id=312b5719&scoped=true&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ScoreView.vue?vue&type=style&index=0&id=7001cd8c&scoped=true&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TicTacToe.vue?vue&type=style&index=0&id=140086b2&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=0ed5677c&\"\nvar script = {}\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready () {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n )\n },\n registered () {\n console.log('Service worker has been registered.')\n },\n cached () {\n console.log('Content has been cached for offline use.')\n },\n updatefound () {\n console.log('New content is downloading.')\n },\n updated () {\n console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error (error) {\n console.error('Error during service worker registration:', error)\n }\n })\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home\"},[_c('router-link',{attrs:{\"to\":\"/TicTacToe\",\"tag\":\"div\"}},[_vm._v(\"Play Tic Tac Toe \")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\nimport { Component, Vue } from 'vue-property-decorator';\n\n\n\n@Component({\n components: {\n \n },\n})\nexport default class Home extends Vue {}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=5b06d98e&\"\nimport script from \"./Home.vue?vue&type=script&lang=ts&\"\nexport * from \"./Home.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"tictactoe\"},[_c('TicTacToe')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"main-container\"},[_c('audio',{ref:\"audio\",attrs:{\"src\":_vm.musicSrc,\"preload\":\"none\"}}),_c('audio',{ref:\"audioWin\",attrs:{\"src\":_vm.autdioWinSrc,\"preload\":\"none\"}}),_c('audio',{ref:\"audioError\",attrs:{\"src\":_vm.audioErrorSrc,\"preload\":\"none\"}}),_c('ScoreView',{attrs:{\"activePlayer\":_vm.activePlayer,\"player1Score\":_vm.player1Score,\"player2Score\":_vm.player2Score}}),_c('div',{staticClass:\"board-background\"},[(_vm.gameState !== 'InProgress')?_c('div',{staticClass:\"new-game \",on:{\"click\":_vm.newGameClicked}},[_vm._m(0)]):_vm._e(),_c('canvas',{ref:\"gridnew\",staticClass:\"board-canvass\",attrs:{\"id\":\"grid\",\"height\":_vm.screenHeight,\"width\":_vm.screenWidth}})]),_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('div',{staticClass:\"round-info\"},[_c('div',[_vm._v(\" Round \"+_vm._s(_vm.rounds)+\" \")])])]),_c('GameOptionsView',{attrs:{\"gridSize\":_vm.gridSize,\"player2Type\":_vm.player2Type,\"difficulty\":_vm.difficulty},on:{\"change\":_vm.onOptionsChanged}})],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"glow\"},[_c('div',[_vm._v(\" Start Game \")])])}]\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"header\"},[_c('div',{staticClass:\"score-card\"},[_c('div',{class:'player-score glow ' + (_vm.activePlayer == 'X' ? 'active' : ''),attrs:{\"id\":\"player1Name\"}},[_c('div',[_vm._v(\"X\")]),_c('div')]),_c('div',{staticClass:\"score\"},[_c('span',{attrs:{\"id\":\"player1Score\"}},[_vm._v(\" \"+_vm._s(_vm.player1Score)+\" \")]),_vm._v(\" | \"),_c('span',{attrs:{\"id\":\"player2Score\"}},[_vm._v(\" \"+_vm._s(_vm.player2Score)+\" \")])]),_c('div',{class:'player-score glow ' + (_vm.activePlayer == 'O' ? 'active' : ''),attrs:{\"id\":\"player2Name\"}},[_c('div',[_vm._v(\"O\")]),_c('div')])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { Component, Prop, Vue } from \"vue-property-decorator\";\n\n@Component({\n components: {},\n})\nexport default class ScoreView extends Vue {\n @Prop() player1Score!: number;\n @Prop() player2Score!: number;\n @Prop() activePlayer!: string;\n}\n","export enum GameDifficulty{\n ICanWin = \"I Can Win\",\n BringItOn = \"Bring It On\",\n Nightmare = \"Nightmare\"\n}","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ScoreView.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ScoreView.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ScoreView.vue?vue&type=template&id=7001cd8c&scoped=true&\"\nimport script from \"./ScoreView.vue?vue&type=script&lang=ts&\"\nexport * from \"./ScoreView.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ScoreView.vue?vue&type=style&index=0&id=7001cd8c&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7001cd8c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container\"},[_c('div',[_vm._v(\" Player 2 : \"),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedPlayer2Type),expression:\"selectedPlayer2Type\"}],staticClass:\"dropdown\",attrs:{\"id\":\"player2Type\"},on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedPlayer2Type=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.player2TypChanged]}},_vm._l((_vm.player2Types),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0)]),(_vm.selectedPlayer2Type == 'Computer')?_c('div',[_vm._v(\" Difficulty : \"),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedDifficulty),expression:\"selectedDifficulty\"}],staticClass:\"dropdown\",attrs:{\"id\":\"difficulty\"},on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedDifficulty=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.difficultyChanged]}},_vm._l((_vm.difficulties),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0)]):_vm._e(),_c('div',[_c('div',{staticClass:\"grid-buttons\",attrs:{\"id\":\"gridSize\"}},[_vm._v(\" Size : \"+_vm._s(_vm.selectedGridSize)+\"x\"+_vm._s(_vm.selectedGridSize)+\" \"),_c('button',{staticClass:\"grid-button\",attrs:{\"id\":\"gridSizeIncrease\"},on:{\"click\":_vm.increaseSize}},[_vm._v(\"↑\")]),_c('button',{staticClass:\"grid-button\",attrs:{\"id\":\"gridSizeDecrease\"},on:{\"click\":_vm.decreaseSize}},[_vm._v(\"↓\")])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { GameDifficulty } from \"./GameDifficulty\";\nimport { PlayerType } from \"./PlayerType\";\n\nexport class GameOptions{\n \n constructor(private gridSize:number,private gameDifficulty:GameDifficulty,private playerOneType:PlayerType,private playerTwoType:PlayerType,private computerResponseDelayMilliSeconds:number = 0){\n\n }\n\n getComputerResponseDelayMilliSeconds():number{\n if(this.computerResponseDelayMilliSeconds > 0){\n return this.computerResponseDelayMilliSeconds + (Math.random() * 100)\n }\n return this.computerResponseDelayMilliSeconds;\n }\n\n getGridSize():number{\n return this.gridSize;\n }\n\n getGameDifficulty():GameDifficulty{\n return this.gameDifficulty;\n }\n\n getPlayerTwoType():PlayerType{\n return this.playerTwoType;\n }\n\n getPlayerOneType():PlayerType{\n return this.playerOneType;\n }\n}","\nexport enum PlayerType {\n Human = \"Human\",\n Computer = \"Computer\"\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { GameDifficulty } from '@/games/tictactoe/domain/models/GameDifficulty';\nimport { GameOptions } from '@/games/tictactoe/domain/models/GameOptions';\nimport { PlayerType } from '@/games/tictactoe/domain/models/PlayerType';\nimport { Component, Prop, Vue, Watch } from 'vue-property-decorator';\n\n@Component({\n components: {\n \n },\n})\nexport default class GameOptionsView extends Vue {\n\n @Prop() difficulty!:GameDifficulty;\n @Prop() player2Type!:PlayerType;\n @Prop() gridSize!:number;\n\n @Watch(\"difficulty\")\n onDifficultyChanged(val: GameDifficulty,old: GameDifficulty): void{\n if(val !== old)\n this.selectedDifficulty = val;\n }\n\n @Watch(\"player2Type\")\n onPlayer2TypeChanged(val: PlayerType,old: PlayerType): void{\n if(val !== old)\n this.selectedPlayer2Type = val;\n }\n\n \n @Watch(\"gridSize\")\n onGridSizeChanged(val: number,old: number): void{\n if(val !== old)\n this.selectedGridSize = val;\n }\n\n selectedDifficulty = GameDifficulty.ICanWin;\n difficulties = [GameDifficulty.ICanWin,GameDifficulty.BringItOn,GameDifficulty.Nightmare];\n\n selectedPlayer2Type = PlayerType.Computer;\n player2Types = [PlayerType.Human,PlayerType.Computer];\n\n selectedGridSize = 3;\n\n beforeMount(): void{\n this.selectedDifficulty = this.difficulty;\n this.selectedPlayer2Type = this.player2Type;\n this.selectedGridSize = this.gridSize;\n }\n\n difficultyChanged(): void{\n this.raiseChanged();\n }\n\n player2TypChanged(): void{\n this.raiseChanged();\n }\n\n decreaseSize(): void{\n if(this.selectedGridSize > 2){\n this.selectedGridSize = this.selectedGridSize -1; \n }\n this.raiseChanged();\n }\n \n increaseSize(): void{\n this.selectedGridSize = this.selectedGridSize + 1; \n this.raiseChanged();\n }\n\n raiseChanged(): void{\n this.$emit(\"change\",new GameOptions(this.selectedGridSize,this.selectedDifficulty,PlayerType.Human,this.selectedPlayer2Type,250));\n }\n}\n","export enum GameState{\n Won = \"Won\",\n Draw = \"Draw\",\n Lost = \"Stopped\",\n NotStarted = \"Not Started\",\n InProgress = \"InProgress\"\n}","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameOptionsView.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameOptionsView.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./GameOptionsView.vue?vue&type=template&id=312b5719&scoped=true&\"\nimport script from \"./GameOptionsView.vue?vue&type=script&lang=ts&\"\nexport * from \"./GameOptionsView.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./GameOptionsView.vue?vue&type=style&index=0&id=312b5719&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"312b5719\",\n null\n \n)\n\nexport default component.exports","\nexport enum MoveResultType {\n Success,\n Invalid\n}\n","export class DomainEvent{\n\n private eventDate!:Date\n constructor(private type : string) { \n this.eventDate = new Date();\n }\n\n get date() : Date{\n return this.eventDate;\n }\n\n get typeName():string{\n return this.type;\n }\n\n}\n\nexport default class EventHandler{\n\n private static handlersMap:any = {};\n\n public static register(\n callback: (event: T) => void, \n eventClassName: string\n ): void {\n \n if (!Object.prototype.hasOwnProperty.call(this.handlersMap,eventClassName)) {\n this.handlersMap[eventClassName] = [];\n }\n this.handlersMap[eventClassName].push(callback);\n }\n\n public static trigger(event:T): void{\n \n const eventClassName: string = event.typeName;\n\n if (Object.prototype.hasOwnProperty.call(this.handlersMap,eventClassName)) {\n const handlers: any[] = this.handlersMap[eventClassName];\n for (const handler of handlers) {\n handler(event);\n }\n }\n }\n\n static clearAllHandlers():void{\n this.handlersMap = {};\n }\n}","import {MoveResultType} from '../models/MoveResultType'\nimport { WinType } from '../Referee';\nimport { DomainEvent } from './EventHandler';\n\nexport class MoveCompletedEvent extends DomainEvent {\n \n constructor(public MoveResultType:MoveResultType,public row:number,public col:number,public winType:WinType){\n super(\"MoveCompletedEvent\");\n }\n}\n","export enum PlayerSymbol {\n X = \"X\",\n O = \"O\",\n None = \"\"\n}\n","import { GameState } from '../models/GameState';\nimport { DomainEvent } from './EventHandler';\n\nexport class GameStateChangedEvent extends DomainEvent {\n \n constructor(public State:GameState){\n super(\"GameStateChangedEvent\");\n }\n\n}\n","import Board from './Board';\nimport { PlayerSymbol } from './models/PlayerSymbol';\nimport { PlayerType } from './models/PlayerType';\n\n\n//https://www.cs.odu.edu/~tkennedy/cs330/f19/Public/designDiscussion/index.html\nexport default class Player\n{\n constructor(private playerName: string,public PlayerType :PlayerType,private playerSymbol: PlayerSymbol){\n\n }\n\n get name():string{\n return this.playerName;\n }\n\n get symbol():PlayerSymbol{\n return this.playerSymbol;\n }\n \n isMyTurn(board:Board):boolean{\n return board.getNextMoveSymbol() == this.symbol;\n }\n}\n\n\n","import Board from './Board'\nimport Player from './Player'\nimport { PlayerSymbol } from './models/PlayerSymbol';\n\nexport enum WinType {\n HorizontalWin = \"Horizontal\",\n VerticalWin = \"Vertical\",\n TopLeftToBottomRight = \"TopLeftToBottomRight\",\n BottomLeftToTopRight = \"BottomLeftToTopRight\",\n None = \"None\"\n}\n\n\n\nexport default class Referee {\n\n\n public moveIsValid(board:Board,row:number,col:number):boolean{\n const arr = board.getSquare(row,col);\n return arr.symbol == PlayerSymbol.None;\n }\n\n public hasWon(board:Board,player:Player): WinType\n {\n const symbol = player.symbol;\n\n if(this.isHorizontalWin(board,symbol)){\n return WinType.HorizontalWin;\n }\n\n if(this.isVerticalWin(board,symbol)){\n return WinType.VerticalWin;\n }\n\n if(this.isTopLeftToBottomRightWin(board,symbol)){\n return WinType.TopLeftToBottomRight;\n }\n\n if(this.isBottomLeftToTopRight(board,symbol)){\n return WinType.BottomLeftToTopRight;\n }\n\n return WinType.None;\n }\n\n public isHorizontalWin(board:Board,stateToFind :PlayerSymbol,nextMoveCanWin = false):boolean{\n const array = board.getSquares();\n for(let i = 0;i < array.length;i++){\n const ro = array[i];\n\n //Check Vertical\n if(ro.length == ro.filter(f => f.symbol == stateToFind).length){\n return true;\n }\n\n if(nextMoveCanWin){\n if(ro.length - 1 == ro.filter(f => f.symbol == stateToFind).length){\n return true;\n }\n }\n }\n return false;\n }\n\n \n public isVerticalWin(board:Board,stateToFind :PlayerSymbol):boolean {\n const array = board.getSquares();\n let found =[];\n for(let rowIndex = 0;rowIndex < array.length;rowIndex++){\n\n for(let columnIndex = 0;columnIndex <= array.length -1;columnIndex++){\n if(array[columnIndex][rowIndex].symbol == stateToFind){\n found.push(array[columnIndex][rowIndex]);\n }\n }\n\n if(found.length == array.length){\n return true;\n }\n \n found = [];\n }\n\n return false;\n }\n\n private isTopLeftToBottomRightWin(board:Board,symbol :PlayerSymbol):boolean{\n const array = board.getSquares();\n const columns = array.length - 1;\n const found = [];\n for(let i = 0;i <= columns;i++){\n \n if(array[i][i].symbol == symbol ){\n found.push(array[i][i]);\n }\n }\n\n if(found.length == array.length){\n return true;\n }\n\n return false;\n }\n\n\n private isBottomLeftToTopRight(board:Board,symbol :PlayerSymbol):boolean{\n const array = board.getSquares();\n const columns = array.length - 1;\n const found = [];\n for(let i = 0;i <= columns;i++){\n \n if(array[i][columns - i].symbol == symbol ){\n found.push(array[i][columns - i]);\n }\n }\n\n if(found.length == array.length){\n return true;\n }\n\n return false;\n }\n\n \n}","import { PlayerSymbol } from './models/PlayerSymbol';\nimport { Square } from './models/Square';//should remove this and just use board\nimport { GameDifficulty } from './models/GameDifficulty';\n\n\nexport class AIMoves {\n\n constructor(private board: Square[][]) {\n }\n\n getCenterSquare(): Square | null {\n\n const center = Math.floor(this.board.length / 2);\n const centerSquare = this.board[center][center];\n\n if (centerSquare.symbol == PlayerSymbol.None) {\n return centerSquare;\n }\n\n return null;\n }\n\n canPlayCenter(): boolean {\n //play Center\n const centerSquare = this.getCenterSquare();\n if (centerSquare) {\n if (centerSquare.symbol == PlayerSymbol.None) {\n return true;\n }\n }\n return false;\n }\n\n\n getWinningHorizontalSquare(playerSymbol: PlayerSymbol): Square | null {\n for (let i = 0; i < this.board.length; i++) {\n const ro = this.board[i];\n\n if (ro.length - 1 == ro.filter(f => f.symbol == playerSymbol).length) {\n const result = ro.filter(f => f.symbol === PlayerSymbol.None);\n if (result.length > 0) {\n return result[0];\n }\n }\n }\n\n return null;\n }\n\n canWinHorizontal(playerSymbol: PlayerSymbol): boolean {\n const square = this.getWinningHorizontalSquare(playerSymbol);\n if (square) {\n return true;\n }\n\n return false;\n }\n\n getWinningVerticalSquare(playerSymbol: PlayerSymbol): Square | null {\n let found: Square[] = [];\n\n for (let rowIndex = 0; rowIndex < this.board.length; rowIndex++) {\n\n for (let columnIndex = 0; columnIndex <= this.board.length - 1; columnIndex++) {\n if (this.board[columnIndex][rowIndex].symbol == playerSymbol) {\n found.push(this.board[columnIndex][rowIndex]);\n }\n }\n\n if (found.length == this.board.length - 1) {\n const col = found[0].column;\n\n for (let intRow = 0; intRow <= this.board.length - 1; intRow++) {\n if (this.board[intRow][col].symbol == PlayerSymbol.None) {\n return this.board[intRow][col];\n }\n }\n }\n\n found = [];\n }\n\n return null;\n }\n\n canWinVertical(playerSymbol: PlayerSymbol): boolean {\n const square = this.getWinningVerticalSquare(playerSymbol);\n if (square) {\n return true;\n }\n\n return false;\n }\n\n\n\n getWinningBottomLeftToTopRightSquare(playerSymbol: PlayerSymbol): Square | null {\n const found = [];\n const columns = this.board.length - 1;\n for (let bi = 0; bi <= columns; bi++) {\n const item = this.board[bi][columns - bi];\n if (item.symbol == playerSymbol) {\n found.push(item);\n }\n\n if (found.length == this.board.length - 1) {\n\n for (let mis = 0; mis <= this.board.length; mis++) {\n const ii = found.filter(jj => jj.row == mis);\n\n if (ii.length == 0) {\n if (mis == 0) {\n if (this.board[mis][this.board.length - 1].symbol == PlayerSymbol.None) {\n return this.board[mis][this.board.length - 1];\n }\n }\n else {\n if (mis - 1 < found.length) {\n const lastFound = found[mis - 1];\n\n if (this.board[lastFound.row + 1][lastFound.column - 1].symbol == PlayerSymbol.None) {\n return this.board[lastFound.row + 1][lastFound.column - 1];\n }\n }\n }\n }\n }\n }\n }\n\n\n return null;\n }\n\n canWinBottomLeftToTopRight(playerSymbol: PlayerSymbol): boolean {\n const square = this.getWinningBottomLeftToTopRightSquare(playerSymbol);\n if (square) {\n\n return true;\n }\n\n return false;\n }\n\n\n\n\n\n getWinningTopLeftToBottomRightSquare(playerSymbol: PlayerSymbol): Square | null {\n let found: Square[] = [];\n //TopRightToBottomLeft\n found = [];\n for (let ti = 0; ti <= this.board.length - 1; ti++) {\n\n if (this.board[ti][ti].symbol == playerSymbol) {\n found.push(this.board[ti][ti]);\n }\n }\n\n if (found.length == this.board.length - 1) {\n\n //Find Missing one\n for (let mis = 0; mis <= this.board.length; mis++) {\n const ii = found.filter(jj => jj.row == mis);\n\n if (ii.length == 0) {\n if (mis == 0) {\n if (this.board[mis][this.board.length - 1].symbol == PlayerSymbol.None) {\n return this.board[mis][this.board.length - 1];\n }\n }\n else {\n if (mis - 1 < found.length) {\n const lastFound = found[mis - 1];\n\n if (this.board[lastFound.row + 1][lastFound.column + 1].symbol == PlayerSymbol.None) {\n return this.board[lastFound.row + 1][lastFound.column + 1];\n }\n }\n }\n }\n }\n\n\n }\n\n return null;\n }\n\n canWinTopLeftToBottomRight(playerSymbol: PlayerSymbol): boolean {\n const square = this.getWinningTopLeftToBottomRightSquare(playerSymbol);\n if (square) {\n return true;\n }\n return false;\n }\n\n\n\n nextMove(opponnentSymbol: PlayerSymbol, difficulty: GameDifficulty): Square | null {\n\n if (this.canPlayCenter()) {\n return this.getCenterSquare();\n }\n\n if (difficulty == GameDifficulty.Nightmare) {\n\n //Top left and bottom right are marked\n if (this.board[this.board.length - 1][0].symbol == opponnentSymbol && this.board[0][this.board.length - 1].symbol == opponnentSymbol) {\n if (this.board[0][this.board.length - 2].symbol == PlayerSymbol.None) {\n return this.board[0][this.board.length - 2];\n }\n }\n\n\n //Top left and bottom right are marked\n if (this.board[0][0].symbol == opponnentSymbol && this.board[this.board.length - 1][this.board.length - 1].symbol == opponnentSymbol) {\n if (this.board[0][1].symbol == PlayerSymbol.None) {\n return this.board[0][1];\n }\n }\n\n //Top left and bottom right are marked\n if (this.board[0][0].symbol == opponnentSymbol && this.board[this.board.length - 1][this.board.length - 1].symbol == opponnentSymbol) {\n if (this.board[this.board.length - 1][0].symbol == PlayerSymbol.None) {\n return this.board[this.board.length - 1][0];\n }\n }\n\n //Top left and bottom right are marked\n if (this.board[0][0].symbol == opponnentSymbol) {\n if (this.board[this.board.length - 1][this.board.length - 1].symbol == PlayerSymbol.None) {\n return this.board[this.board.length - 1][this.board.length - 1];\n }\n }\n\n\n if (this.board[0][0].symbol == opponnentSymbol && this.board[0][this.board.length - 1].symbol == opponnentSymbol) {\n if (this.board[this.board.length - 1][0].symbol == PlayerSymbol.None) {\n return this.board[this.board.length - 1][0];\n }\n }\n\n //Top Left Corner\n if (this.board[0][0].symbol == PlayerSymbol.None) {\n return this.board[0][0];\n }\n\n //Top Right Corner\n if (this.board[0][this.board.length - 1].symbol == PlayerSymbol.None) {\n return this.board[0][this.board.length - 1];\n }\n\n\n //Bottm Left Corner\n if (this.board[this.board.length - 1][0].symbol == PlayerSymbol.None) {\n return this.board[this.board.length - 1][0];\n }\n\n //Bottm Right Corner\n if (this.board[this.board.length - 1][this.board.length - 1].symbol == PlayerSymbol.None) {\n return this.board[this.board.length - 1][this.board.length - 1];\n }\n }\n\n //Simple left to right through all squares\n for (let row = 0; row <= this.board.length - 1; row++) {\n for (let col = 0; col <= this.board.length - 1; col++) {\n const sqaure = this.board[row][col];\n\n if (sqaure.symbol == PlayerSymbol.None) {\n return sqaure;\n }\n }\n }\n\n return null;\n }\n}\n","import Board from './Board';\nimport { PlayerSymbol } from './models/PlayerSymbol';\nimport { PlayerType } from './models/PlayerType';\nimport { GameDifficulty } from './models/GameDifficulty';\nimport { AIMoves } from './AIMoves';\nimport Player from './Player';\nimport { UISquare } from '../renderers/BoardRenderer';\n\n\nexport class AIPlayer extends Player {\n private gameDifficulty = GameDifficulty.ICanWin;\n constructor(name: string, PlayerType: PlayerType, Symbol: PlayerSymbol) {\n super(name, PlayerType, Symbol);\n\n }\n\n getGameDifficulty(): GameDifficulty {\n return this.gameDifficulty;\n }\n\n setGameDifficulty(gameDifficulty: GameDifficulty): void {\n this.gameDifficulty = gameDifficulty;\n }\n\n getSquare(board: Board) : UISquare | any{\n\n if (this.gameDifficulty == GameDifficulty.Nightmare) {\n return this.getNightMareMode(board);\n }\n\n if (this.gameDifficulty == GameDifficulty.BringItOn) {\n return this.getBringItOn(board);\n }\n\n return this.getICanWinMode(board);\n }\n\n getBringItOn(board: Board):UISquare | any {\n const aiMoves = new AIMoves(board.getSquares());\n const playerSymbol = this.symbol == PlayerSymbol.X ? PlayerSymbol.O : PlayerSymbol.X;\n\n //Horizontal - Can bot win\n if (aiMoves.canWinHorizontal(this.symbol)) {\n return aiMoves.getWinningHorizontalSquare(this.symbol);\n }\n //Horizontal - Can Opponent Win\n if (aiMoves.canWinHorizontal(playerSymbol)) {\n return aiMoves.getWinningHorizontalSquare(playerSymbol);\n }\n\n //Vertical - Can bot win\n if (aiMoves.canWinVertical(this.symbol)) {\n return aiMoves.getWinningVerticalSquare(this.symbol);\n }\n //Vertical - Can Opponent Win\n if (aiMoves.canWinVertical(playerSymbol)) {\n return aiMoves.getWinningVerticalSquare(playerSymbol);\n }\n\n //BottomLeftToTopRight - Can bot win\n // if(aiMoves.canWinBottomLeftToTopRight(this.Symbol)){\n // return aiMoves.getWinningBottomLeftToTopRightSquare(this.Symbol);\n // }\n //BottomLeftToTopRight - Can Opponent Win\n // if(aiMoves.canWinBottomLeftToTopRight(playerSymbol)){\n // return aiMoves.getWinningBottomLeftToTopRightSquare(playerSymbol);\n // }\n //TopLeftToBottomRight - Can bot win\n if (aiMoves.canWinTopLeftToBottomRight(this.symbol)) {\n return aiMoves.getWinningTopLeftToBottomRightSquare(this.symbol);\n }\n\n //TopLeftToBottomRight - Can Opponent Win\n if (aiMoves.canWinTopLeftToBottomRight(playerSymbol)) {\n return aiMoves.getWinningTopLeftToBottomRightSquare(playerSymbol);\n }\n\n if (aiMoves.nextMove(playerSymbol, this.gameDifficulty)) {\n return aiMoves.nextMove(playerSymbol, this.gameDifficulty);\n }\n\n\n\n }\n\n getICanWinMode(board: Board):UISquare | any {\n const aiMoves = new AIMoves(board.getSquares());\n const playerSymbol = this.symbol == PlayerSymbol.X ? PlayerSymbol.O : PlayerSymbol.X;\n\n //Horizontal - Can bot win\n if (aiMoves.canWinHorizontal(this.symbol)) {\n return aiMoves.getWinningHorizontalSquare(this.symbol);\n }\n //Horizontal - Can Opponent Win\n if (aiMoves.canWinHorizontal(playerSymbol)) {\n return aiMoves.getWinningHorizontalSquare(playerSymbol);\n }\n\n //Horizontal - Can bot win\n if (aiMoves.canWinVertical(this.symbol)) {\n return aiMoves.getWinningVerticalSquare(this.symbol);\n }\n\n if (aiMoves.nextMove(playerSymbol, this.gameDifficulty)) {\n return aiMoves.nextMove(playerSymbol, this.gameDifficulty);\n }\n }\n\n getNightMareMode(board: Board) {\n const aiMoves = new AIMoves(board.getSquares());\n const playerSymbol = this.symbol == PlayerSymbol.X ? PlayerSymbol.O : PlayerSymbol.X;\n\n //Horizontal - Can bot win\n if (aiMoves.canWinHorizontal(this.symbol)) {\n return aiMoves.getWinningHorizontalSquare(this.symbol);\n }\n //Horizontal - Can Opponent Win\n if (aiMoves.canWinHorizontal(playerSymbol)) {\n return aiMoves.getWinningHorizontalSquare(playerSymbol);\n }\n\n //Vertical - Can bot win\n if (aiMoves.canWinVertical(this.symbol)) {\n return aiMoves.getWinningVerticalSquare(this.symbol);\n }\n //Vertical - Can Opponent Win\n if (aiMoves.canWinVertical(playerSymbol)) {\n return aiMoves.getWinningVerticalSquare(playerSymbol);\n }\n\n //BottomLeftToTopRight - Can bot win\n if (aiMoves.canWinBottomLeftToTopRight(this.symbol)) {\n return aiMoves.getWinningBottomLeftToTopRightSquare(this.symbol);\n }\n\n //BottomLeftToTopRight - Can Opponent Win\n if (aiMoves.canWinBottomLeftToTopRight(playerSymbol)) {\n return aiMoves.getWinningBottomLeftToTopRightSquare(playerSymbol);\n }\n\n //TopLeftToBottomRight - Can bot win\n if (aiMoves.canWinTopLeftToBottomRight(this.symbol)) {\n return aiMoves.getWinningTopLeftToBottomRightSquare(this.symbol);\n }\n\n //TopLeftToBottomRight - Can Opponent Win\n if (aiMoves.canWinTopLeftToBottomRight(playerSymbol)) {\n return aiMoves.getWinningTopLeftToBottomRightSquare(playerSymbol);\n }\n\n if (aiMoves.nextMove(playerSymbol, this.gameDifficulty)) {\n return aiMoves.nextMove(playerSymbol, this.gameDifficulty);\n }\n\n\n return { row: 0, column: 0 };\n }\n}\n","import { PlayerSymbol } from \"./models/PlayerSymbol\";\n\nexport class Score{\n\n private player1Score = 0;\n private player2Score = 0;\n private rounds = 0;\n private draw = 0;\n constructor(private player1:PlayerSymbol,private player2:PlayerSymbol){\n\n }\n\n getDraws():number{\n return this.draw;\n }\n\n getRound():number{\n return this.rounds;\n }\n\n incrementRounds():void{\n this.rounds = this.rounds+1;\n }\n\n getPlayer1Score():number{\n return this.player1Score;\n }\n\n getPlayer2Score():number{\n return this.player2Score;\n }\n\n incrementScore(winningSymbol:PlayerSymbol):void{\n if(this.player1 == winningSymbol){\n this.player1Score = this.player1Score + 1;\n }else{\n this.player2Score = this.player2Score + 1;\n }\n }\n\n setDraw():void{\n // this.player1.incrementScore();\n // this.player2.incrementScore();\n \n this.draw = this.draw + 1;\n }\n}","import { MoveCompletedEvent } from './events/MoveCompletedEvent';\nimport { GameStateChangedEvent } from './events/GameStateChangedEvent';\nimport Player from './Player';\nimport { AIPlayer } from \"./AIPlayer\";\nimport { PlayerSymbol } from './models/PlayerSymbol';\nimport { PlayerType } from './models/PlayerType';\nimport Referee, { WinType } from './Referee';\nimport { MoveResultType } from './models/MoveResultType';\nimport { Score } from './Score';\nimport { GameOptions } from './models/GameOptions';\nimport { GameDifficulty } from './models/GameDifficulty';\nimport { GameState } from './models/GameState';\nimport Board from './Board';\nimport EventHandler from './events/EventHandler';\n\n\nexport default class Game\n{\n private gameState = GameState.NotStarted;\n private rules: Referee = new Referee();\n private board:Board;\n private playerOne!:Player;\n private playerTwo!:Player;\n private currentUser!:Player;\n private lastStartPlayer!:Player;\n private score!:Score;\n private lastWinner:PlayerSymbol = PlayerSymbol.None;\n private options!:GameOptions;\n constructor(board: Board){\n \n this.board = board;\n this.score = new Score(PlayerSymbol.None,PlayerSymbol.None);\n }\n\n\n getLastWinnerSymbol():PlayerSymbol{\n return this.lastWinner;\n }\n \n setLastWinnerSymbol(symbol:PlayerSymbol):void{\n this.lastWinner = symbol;\n }\n\n getActivePlayerSymbol(): PlayerSymbol{\n return this.currentUser? this.currentUser.symbol:PlayerSymbol.None;\n }\n\n getGameState():GameState{\n return this.gameState;\n }\n\n getPlayer1Score(): number{\n if(!this.playerOne) return 0;\n return this.score.getPlayer1Score();\n }\n\n getScore(): Score{\n return this.score;\n }\n\n getPlayer2Score(): number{\n if(!this.playerTwo) return 0;\n return this.score.getPlayer2Score();\n }\n\n onGameStateChanged(callback: (a: GameStateChangedEvent) => void):void{\n EventHandler.register(callback, \"GameStateChangedEvent\");\n }\n\n onMoveCompleted(callback: (a: MoveCompletedEvent) => void):void{\n EventHandler.register(callback, \"MoveCompletedEvent\");\n }\n\n private initialisePlayers(options:GameOptions): void{\n\n this.playerOne = this.createPlayer(options.getPlayerOneType(),PlayerSymbol.X,options.getGameDifficulty());\n this.playerTwo = this.createPlayer(options.getPlayerTwoType(),PlayerSymbol.O,options.getGameDifficulty());\n\n if(!this.lastStartPlayer){\n this.currentUser = this.playerOne;\n this.lastStartPlayer = this.currentUser;\n this.score = new Score(this.playerOne.symbol,this.playerTwo.symbol);\n }else{\n \n this.currentUser = this.lastStartPlayer.symbol == this.playerOne.symbol ?this.playerTwo:this.playerOne;\n this.lastStartPlayer = this.currentUser;\n }\n }\n\n newGame(options:GameOptions):void{\n this.options = options;\n this.setGameState(GameState.InProgress);\n\n this.initialisePlayers(options);\n this.score.incrementRounds();\n this.board.gridSize = options.getGridSize();\n this.board.restart();\n\n this.nextAIMove();\n }\n\n\n private setNextPlayer(): void{\n this.currentUser = this.currentUser.symbol == this.playerOne.symbol?this.playerTwo:this.playerOne;\n }\n\n move(row:number,col:number):void{\n \n const moveIsValid = this.moveIsValid(row,col);\n\n if(moveIsValid){\n\n this.board.setSquare(row,col,this.currentUser.symbol);\n\n const winType = this.rules.hasWon(this.board,this.currentUser);\n\n if(winType !== WinType.None){\n this.setLastWinnerSymbol(this.currentUser.symbol);\n this.score.incrementScore(this.currentUser.symbol);\n this.setGameState(GameState.Won);\n\n }\n else if(this.board.isFull() && this.gameState !== (GameState.Won as GameState)){\n this.score.setDraw();\n this.setGameState(GameState.Draw);\n }\n\n this.setNextPlayer();\n EventHandler.trigger(new MoveCompletedEvent(MoveResultType.Success,row,col,winType));\n this.nextAIMove();\n }else{\n EventHandler.trigger(new MoveCompletedEvent(MoveResultType.Invalid,row,col,WinType.None));\n }\n }\n\n private moveIsValid(row:number,column:number){\n return this.gameState === GameState.InProgress && this.rules.moveIsValid(this.board,row,column);\n }\n\n private nextAIMove(){\n if(this.currentUser.PlayerType == PlayerType.Computer){\n const aiMove = (this.currentUser as AIPlayer).getSquare(this.board);\n if(aiMove){\n if(this.options && this.options.getComputerResponseDelayMilliSeconds() > 0){\n setTimeout(() => {\n this.move(aiMove.row,aiMove.column);\n }, this.options.getComputerResponseDelayMilliSeconds());// Math.random() * 1100);\n }else{\n this.move(aiMove.row,aiMove.column);\n }\n \n }\n }\n }\n\n setGameState(state: GameState):void{\n this.gameState = state;\n EventHandler.trigger(new GameStateChangedEvent(state));\n }\n\n restart():void{\n this.board.restart();\n }\n\n private createPlayer(playerType:PlayerType,playerSymbol:PlayerSymbol,gameDifficulty:GameDifficulty = GameDifficulty.ICanWin): Player{\n \n switch(playerType){\n case PlayerType.Computer:{\n const player = new AIPlayer(playerType,playerType,playerSymbol);\n player.setGameDifficulty(gameDifficulty);\n return player;\n }\n break;\n case PlayerType.Human:\n return new Player(playerType,playerType,playerSymbol);\n break;\n }\n\n return new Player(playerType,playerType,playerSymbol);\n }\n}","import BoardRenderer2d, { BoardClickedEvent } from \"./BoardRenderer\";\nimport { GameState } from \"../domain/models/GameState\";\nimport { MoveCompletedEvent } from \"../domain/events/MoveCompletedEvent\";\nimport { MoveResultType } from \"../domain/models/MoveResultType\";\nimport Game from \"../domain/Game\";\nimport EventHandler from \"../domain/events/EventHandler\";\n\n\n\nexport default class GameRenderer extends Game\n{\n constructor(private boardRenderer:BoardRenderer2d){\n super(boardRenderer);\n boardRenderer.onBoardClicked(this.onBoardClicked);\n this.onMoveCompleted(this.onMoveCompletedEvent);\n }\n\n destroy():void{\n \n this.boardRenderer.destroy();\n EventHandler.clearAllHandlers();\n }\n\n onMoveCompletedEvent= (e:MoveCompletedEvent) :void =>{\n if(e.MoveResultType == MoveResultType.Success){\n if(this.getGameState() == GameState.Won){\n this.boardRenderer.drawWinningLine(e.winType,e.row,e.col);\n }\n }\n }\n\n private onBoardClicked=(e:BoardClickedEvent)=>\n {\n super.move(e.row,e.col);\n }\n}","import { PlayerSymbol } from \"./PlayerSymbol\";\n\nexport class Square {\n\n private state: PlayerSymbol = PlayerSymbol.None;\n\n constructor(private rowNo: number, private columnNo: number) {\n }\n\n get row():number {\n return this.rowNo;\n }\n\n get column() :number{\n return this.columnNo;\n }\n\n get symbol() : PlayerSymbol{\n return this.state;\n }\n\n setSymbol(state: PlayerSymbol) : void{\n this.state = state;\n }\n}\n","import { Square } from './models/Square';\nimport { PlayerSymbol } from './models/PlayerSymbol';\n\nexport default class Board \n{\n\n private board:Square[][] = [];\n private lastPlayerSymbol:PlayerSymbol = PlayerSymbol.None;\n private nextPlayerSymbol:PlayerSymbol = PlayerSymbol.None;\n \n\n constructor(public gridSize:number){\n \n this.createbord(gridSize);\n }\n\n private createbord(gridSize:number) {\n\n for(let row = 0;row <= gridSize -1;row++){\n this.board[row] = [];\n\n for(let column = 0;column <= gridSize - 1;column++){\n this.board[row][column] = new Square(row,column);\n }\n }\n }\n\n private setNextMoveSymbol(currentSymbol:PlayerSymbol){\n if(currentSymbol == PlayerSymbol.None){\n this.nextPlayerSymbol = PlayerSymbol.X;\n }else if(currentSymbol == PlayerSymbol.X){\n this.nextPlayerSymbol = PlayerSymbol.O;\n }else if(currentSymbol == PlayerSymbol.O){\n this.nextPlayerSymbol = PlayerSymbol.X;\n }else{\n this.nextPlayerSymbol = PlayerSymbol.None;\n }\n }\n\n\n setSquare(row:number,col:number,symbol:PlayerSymbol): void{\n this.board[row][col].setSymbol(symbol);\n\n this.lastPlayerSymbol = symbol;\n this.setNextMoveSymbol(symbol);\n }\n\n getSquare(row:number,col:number) : Square{\n return this.board[row][col];\n }\n\n getSquares():Square[][]{\n return this.board;\n }\n\n restart() : void{\n this.board.splice(0);\n this.createbord(this.gridSize);\n \n this.lastPlayerSymbol = PlayerSymbol.None;\n this.nextPlayerSymbol = PlayerSymbol.None;\n }\n\n getLastMoveSymbol():PlayerSymbol{\n return this.lastPlayerSymbol;\n }\n\n getNextMoveSymbol():PlayerSymbol{\n return this.nextPlayerSymbol;\n }\n\n isFull():boolean{\n \n for(let i=0;i <= this.gridSize -1;i++){\n const row = this.board[i];\n for(let c=0;c <= this.gridSize -1;c++){\n if(row[c].symbol == PlayerSymbol.None){\n return false;\n }\n }\n }\n\n return true;\n }\n}","export default class LineRenderer{\n vertices:{x:number,y:number}[] = [];\n color = \"green\";\n private stop = false;\n \n startX = 0;\n startY = 0;\n endY = 0;\n endX = 0;\n \n constructor(private start:{x:number,y:number},private end:{x:number,y:number},private drawContext:CanvasRenderingContext2D,private lineType: string | \"vertical\" | \"Horizontal\"){\n this.startX = start.x;\n this.startY = start.y;\n this.endY = end.y;\n this.endX = end.x;\n }\n \n destroy():void{\n this.stop = true;\n cancelAnimationFrame(this.id);\n }\n\n startAnimation(fps:number):void{\n \n this.animate(0);\n }\n id =0;\n animate = (step:number) : void=>{\n \n if(this.stop){\n cancelAnimationFrame(this.id);\n return;\n }\n \n this.drawContext.shadowColor = \"red\"; // string\n //Color of the shadow; RGB, RGBA, HSL, HEX, and other inputs are valid.\n this.drawContext.shadowOffsetX = 0; // integer\n //Horizontal distance of the shadow, in relation to the text.\n this.drawContext.shadowOffsetY = 0; // integer\n //Vertical distance of the shadow, in relation to the text.\n this.drawContext.shadowBlur = 5; // integer\n\n switch(this.lineType){\n case \"vertical\":\n this.verticaLine();\n break;\n case \"horizontal\":\n this.horizontalLine();\n break;\n }\n \n \n this.drawContext.shadowBlur = 0; // integer\n\n this.id = requestAnimationFrame(this.animate);\n }\n \n horizontalLine():void{\n if(this.startX < this.end.x){\n this.drawContext.beginPath();\n this.drawContext.lineCap = 'round';\n this.drawContext.lineWidth = 1;\n this.drawContext.strokeStyle = this.color;\n this.startX = (this.startX + 20) <= this.end.x?(this.startX + 20):(this.end.x - this.startX);\n this.drawContext.moveTo(this.start.x, this.startY);\n this.drawContext.lineTo(this.startX,this.startY);\n this.drawContext.stroke();\n\n this.drawContext.closePath(); \n }\n else\n {\n this.stop = true;\n }\n }\n \n verticaLine():void{\n if(this.startY < this.end.y){\n this.drawContext.beginPath();\n this.drawContext.lineCap = 'round';\n this.drawContext.strokeStyle = this.color;\n this.drawContext.lineWidth = 1;\n this.startY = (this.startY+ 20) <= this.end.y?(this.startY+ 20):this.end.y -this.startY;\n \n this.drawContext.moveTo(this.start.x, this.start.y);\n this.drawContext.lineTo(this.startX,this.startY);\n this.drawContext.stroke();\n this.drawContext.closePath(); \n \n }else{\n this.stop = true;\n }\n }\n }","import { Area, UISquare } from \"./BoardRenderer\";\nimport { WinType } from \"../domain/Referee\";\nimport { PlayerSymbol } from \"../domain/models/PlayerSymbol\";\n\nexport default class SymbolRenderer {\n\n constructor(private drawContext:CanvasRenderingContext2D,){\n }\n\n render(row:number,column:number,symbol: PlayerSymbol,height:number,width:number,gridSize:number):void{\n const squareHeight = height / gridSize;\n const squareWidth =width / gridSize;\n const startX = column* squareHeight;\n const startY = row * squareWidth;\n \n switch(symbol){\n case PlayerSymbol.X:\n this.drawX(new Area(startX,startY,squareWidth,squareHeight));\n break;\n case PlayerSymbol.O:\n this.drawO(new Area(startX,startY,squareWidth,squareHeight));\n break;\n case PlayerSymbol.None:\n this.clear(new Area(startX,startY,squareWidth,squareHeight));\n break;\n }\n }\n\n drawWinningLine(uiSquare: UISquare,winType:WinType,width:number,height:number):void{\n let startX = 0,startY = 0,endX = 0,endY = 0;\n const columnNo = uiSquare.column + 1;\n const roNo = uiSquare.row +1;\n const padding = (width * 0.05);\n switch(winType){\n \n case WinType.VerticalWin:{\n const vx = (uiSquare.area.width * columnNo) - (uiSquare.area.width * 0.5);\n startX = vx;\n startY = padding;\n endX = vx;\n endY =height - padding;\n }\n break;\n case WinType.HorizontalWin:\n { \n const x = (uiSquare.area.height * roNo) - (uiSquare.area.height * 0.5);\n startX = 0 + 20;\n startY = x;\n endX = width - 20;\n endY =x ;\n }\n break;\n case WinType.BottomLeftToTopRight:\n startX = padding;\n startY =width- padding;\n endX = width- padding;\n endY =padding;\n break;\n case WinType.TopLeftToBottomRight:\n startX = padding;\n startY =padding;\n endX = width - padding;\n endY =width- padding;\n break;\n }\n this.drawContext.beginPath();\n \n \n \n // const grd=this.drawContext.createLinearGradient(0, 0, 200, 0);\n // grd.addColorStop(0, \"red\");\n // grd.addColorStop(0, \"blue\");\n // grd.addColorStop(1, \"black\");\n \n // // Fill with gradient\n this.drawContext.strokeStyle = \"orange\";\n this.setShadow(\"red\");\n \n this.drawContext.lineWidth = (uiSquare.area.width * 0.1);\n this.drawContext.moveTo(startX, startY);\n this.drawContext.lineTo(endX, endY);\n \n this.drawContext.stroke();\n this.drawContext.stroke();\n this.drawContext.stroke();\n this.drawContext.closePath();\n \n }\n\n\n private clear(area: Area) {\n this.drawContext.fillStyle = \"black\";\n this.drawContext.fillRect(\n area.x + 1,\n area.y + 1,\n area.width - 2,\n area.height - 2\n );\n this.drawContext.closePath(); // close\n }\n \n\n private clearShadow(){\n \n this.drawContext.shadowBlur = 0; // integer\n }\n\n private setShadow(color:string){\n this.drawContext.shadowColor = color; // string\n //Color of the shadow; RGB, RGBA, HSL, HEX, and other inputs are valid.\n this.drawContext.shadowOffsetX = 0; // integer\n //Horizontal distance of the shadow, in relation to the text.\n this.drawContext.shadowOffsetY = 1; // integer\n //Vertical distance of the shadow, in relation to the text.\n this.drawContext.shadowBlur = 30; // integer\n }\n\n private drawX(area:Area) {\n \n \n // const a = new AnimatedShape(area,this.drawContext,PlayerSymbol.X);\n // a.animate(0);\n \n this.drawContext.beginPath();\n this.clearShadow();\n this.setShadow(\"red\");\n this.drawContext.strokeStyle = \"red\";\n this.drawContext.lineCap = 'round';\n const offset = (0.15 * area.width);\n //this.drawContext.lineWidth = 15;\n this.drawContext.lineWidth = (area.width * 0.1);\n this.drawContext.moveTo(area.x + offset, area.y + offset);\n this.drawContext.lineTo(area.x + area.width - offset, area.y + area.width - offset);\n \n this.drawContext.moveTo(area.x + offset, area.y + area.width - offset);\n this.drawContext.lineTo(area.x + area.width - offset, area.y + offset);\n \n this.drawContext.stroke();\n this.drawContext.stroke();\n this.drawContext.closePath();\n this.clearShadow();\n }\n \n private drawO(area: Area) {\n \n this.clearShadow();\n \n \n const halfSectionSize = (0.5 * area.width);\n const padding = (0.2 * area.width);\n const centerX = area.x + halfSectionSize;\n const centerY = area.y + halfSectionSize;\n const radius = ( area.width -padding ) / 2;\n const startAngle = 0 * Math.PI; \n const endAngle = 2 * Math.PI;\n \n this.drawContext.lineWidth = (area.width * 0.1);\n \n this.drawContext.beginPath();\n this.drawContext.lineCap = 'round';\n this.setShadow(\"blue\");\n // this.drawContext.shadowBlur = 40;\n this.drawContext.strokeStyle = \"blue\";\n this.drawContext.arc(centerX, centerY, radius, startAngle, endAngle);\n this.drawContext.stroke();\n this.drawContext.stroke();\n this.clearShadow();\n this.drawContext.closePath();\n }\n\n\n}","\nimport Board from \"../domain/Board\";\nimport EventHandler, { DomainEvent } from \"../domain/events/EventHandler\";\nimport { PlayerSymbol } from \"../domain/models/PlayerSymbol\";\nimport { WinType } from \"../domain/Referee\";\nimport LineRenderer from \"./LineRenderer\";\nimport SymbolRenderer from \"./SymbolRenderer\";\n\nexport class Area {\n\n constructor(public x: number, public y: number, public width: number, public height: number){\n\n }\n}\n\n\nexport class UISquare {\n\n public area:Area;\n constructor(boardHeight:number,boardWidth:number,cols:number,rows:number, public row:number,public column:number,private symbol:PlayerSymbol){\n \n const squareHeight = boardHeight / rows;\n const squareWidth = boardWidth / cols;\n const startX = column* squareHeight;\n const startY = row * squareWidth;\n \n this.area = new Area(startX,startY,squareWidth,squareHeight);\n }\n \n getSymbol() : PlayerSymbol{\n return this.symbol;\n }\n }\n\nexport class BoardClickedEvent extends DomainEvent{\n constructor(public row:number,public col:number){\n super(\"BoardClickedEvent\");\n }\n}\n\nexport default class BoardRenderer2d extends Board{\n\n private boardLines:LineRenderer[] = [];\n private squares:UISquare[][] = [];\n private drawContext!: CanvasRenderingContext2D;\n private height = 0;\n private width = 0;\n private symbolRenderer;\n constructor(gridSize:number,private canvas:HTMLCanvasElement){\n super(gridSize);\n \n this.height = canvas.height;\n this.width = canvas.width;\n\n this.drawContext = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n this.symbolRenderer = new SymbolRenderer(this.drawContext);\n canvas.addEventListener(\"mouseup\", this.onBoardClickedLocal);\n \n this.drawBoard();\n this.createSquares();\n }\n\n onBoardClicked(callback: (a: BoardClickedEvent) => void):void{\n EventHandler.register(callback, \"BoardClickedEvent\");\n }\n\n private onBoardClickedLocal = (event: MouseEvent) : void => {\n const rect = this.canvas.getBoundingClientRect();\n const pos = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n \n const square = this.getSelectedUISquare(pos) as UISquare;\n if(square){\n EventHandler.trigger(new BoardClickedEvent(square.row,square.column));\n }\n }\n\n destroy():void{\n this.canvas.removeEventListener(\"mouseup\", this.onBoardClickedLocal);\n }\n \n restart():void{\n \n this.boardLines.forEach(i=>{\n i.destroy();\n })\n\n this.boardLines.splice(0);\n this.squares.splice(0);\n super.restart()\n this.clearBoard();\n this.drawBoard();\n this.createSquares();\n }\n\n private clearBoard() :void{\n this.drawContext.clearRect(0,0,this.canvas.width,this.canvas.height);\n }\n\n private drawBoard():void {\n \n const context = this.drawContext;\n context.beginPath();\n\n context.strokeStyle = \"black\";\n \n \n //Draw Border\n // context.strokeStyle = \"black\";\n // context.lineWidth = 10;\n // context.strokeRect(0, 0, this.width, this.height);\n // this.drawContext.closePath();\n \n\n for(let row = 1;row < this.gridSize ;row++ )\n {\n this.drawContext.beginPath();\n context.strokeStyle = \"green\";\n \n context.lineWidth = 3;\n const startX = 0 ;\n const startY = row * this.height / this.gridSize;\n const tt = row + (startY);\n\n const t= new LineRenderer({x:startX,y:startY},{x:this.width,y:tt},this.drawContext,\"horizontal\");\n this.boardLines.push(t);\n t.startAnimation(1000);\n\n this.drawContext.closePath();\n }\n\n for(let row = 1;row < this.gridSize ;row++ )\n {\n this.drawContext.beginPath();\n context.strokeStyle = \"green\";\n \n context.lineWidth = 3;\n const startX = 0 ;\n const startY = row * this.height / this.gridSize;\n const tt = row + (startY);\n\n const width = (this.width / this.gridSize) * row;\n\n\n const t= new LineRenderer({x:width,y:0},{x:width,y:this.height},this.drawContext,\"vertical\");\n this.boardLines.push(t);\n t.startAnimation(2000);\n\n this.drawContext.closePath();\n }\n \n this.drawContext.closePath();\n }\n\n\n private createSquares():void{\n\n for(let row = 0;row <= this.gridSize -1;row++){\n\n //const rowArray = sqaures[row];\n const cols:UISquare[] = [];\n for(let column = 0;column <= this.gridSize - 1;column++){\n \n cols.push(new UISquare(this.height,this.width,this.gridSize,this.gridSize,row,column,PlayerSymbol.None));\n }\n\n this.squares.push(cols);\n }\n }\n\n setSquare(row:number,col:number,symbol:PlayerSymbol):void{\n super.setSquare(row,col,symbol);\n this.drawSymbol(row,col,symbol);\n }\n\n private drawSymbol(row:number,column:number,symbol:PlayerSymbol):void{\n this.symbolRenderer.render(row,column,symbol,this.height,this.width,this.gridSize);\n }\n\n \n drawWinningLine(winType:WinType,row:number,col:number):void{\n const uiSquare = this.squares[row][col];\n this.symbolRenderer.drawWinningLine(uiSquare,winType,this.width,this.height);\n }\n \n\n private getSelectedUISquare(pos:{x:number,y:number}) : UISquare | unknown{\n let foundSquare:UISquare | unknown;\n this.squares.every(row =>{\n \n row.every(boardSquare =>{\n\n if (\n pos.x >= boardSquare.area.x && pos.x <= boardSquare.area.x + boardSquare.area.height &&\n pos.y >= boardSquare.area.y && pos.y <= boardSquare.area.y + boardSquare.area.width\n ) {\n foundSquare = boardSquare;\n return false;\n }\n\n return true;\n });\n\n return true;\n });\n return foundSquare;\n } \n\n}","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { Component, Vue } from 'vue-property-decorator';\n\nimport ScoreView from './ScoreView.vue';\nimport GameOptionsView from './GameOptionsView.vue';\nimport { GameDifficulty } from '@/games/tictactoe/domain/models/GameDifficulty';\nimport { PlayerType } from '@/games/tictactoe/domain/models/PlayerType';\nimport { GameState } from '@/games/tictactoe/domain/models/GameState';\nimport GameRenderer from '@/games/tictactoe/renderers/GameRenderer';\nimport { PlayerSymbol } from '@/games/tictactoe/domain/models/PlayerSymbol';\nimport { GameOptions } from '@/games/tictactoe/domain/models/GameOptions';\nimport { MoveResultType } from '@/games/tictactoe/domain/models/MoveResultType';\nimport BoardRenderer2d from '@/games/tictactoe/renderers/BoardRenderer';\nimport { GameStateChangedEvent } from '@/games/tictactoe/domain/events/GameStateChangedEvent';\nimport { MoveCompletedEvent } from '@/games/tictactoe/domain/events/MoveCompletedEvent';\nimport { WinType } from '@/games/tictactoe/domain/Referee';\n\n@Component({\n components: {\n ScoreView,\n GameOptionsView\n },\n})\nexport default class TicTacToeView extends Vue {\n\n difficulty = GameDifficulty.Nightmare;\n computerDelay = 650;\n player1Score = 0;\n player2Score = 0;\n player2Type = PlayerType.Computer;\n draws = 0;\n rounds = 0;\n\n activePlayer = PlayerSymbol.None;\n\n gridSize = 3 ;\n backgroundColor = \"white\";\n width = 600;\n height= 600;\n gameState = GameState.NotStarted;\n tictactoeApp!:GameRenderer\n winType = \"\";\n musicSrc = \"/sounds/click.wav\"\n autdioWinSrc = \"/sounds/winsound.mp3\"\n audioErrorSrc= \"/sounds/error.mp3\";\n\n screenWidth= 0;\n screenHeight= 0;\n\n beforeMount(): void{\n const start = window.innerWidth > window.innerHeight?window.innerHeight:window.innerWidth;\n this.screenWidth = start -(start * 0.30);\n this.screenHeight = start -(start * 0.30);\n }\n \n gameOptions!:GameOptions;\n\n private newcanvas!: HTMLCanvasElement;\n\n beforeDestroy(): void{\n this.tictactoeApp.destroy();\n }\n\n mounted(): void{\n this.gameOptions = new GameOptions(this.gridSize,this.difficulty,PlayerType.Human, this.player2Type,this.computerDelay);\n\n this.initialiseCanvas();\n this.initialiseGame(); \n }\n\n initialiseGame(): void{\n\n const board = new BoardRenderer2d(parseInt(this.gridSize.toString()),this.newcanvas);\n this.tictactoeApp = new GameRenderer(board);\n this.tictactoeApp.onMoveCompleted(this.onMoveCommandCompleted);\n this.tictactoeApp.onGameStateChanged(this.onGameStateChanged);\n \n this.activePlayer = this.tictactoeApp.getActivePlayerSymbol();\n this.gameState = this.tictactoeApp.getGameState();\n this.refreshGameScore();\n this.newGame(this.gameOptions);\n\n\n }\n\n newGameClicked() : void{\n this.newGame(this.gameOptions);\n }\n\n newGame(options:GameOptions): void{\n \n this.tictactoeApp.newGame(options);\n this.activePlayer = this.tictactoeApp.getActivePlayerSymbol();\n this.gameState = this.tictactoeApp.getGameState();\n this.refreshGameScore();\n }\n\n onOptionsChanged(e:GameOptions) : void{\n this.gameOptions = new GameOptions(e.getGridSize(),e.getGameDifficulty(),e.getPlayerOneType(),e.getPlayerTwoType(),this.computerDelay);\n this.newGame(this.gameOptions);\n }\n\n onGameStateChanged(ed: GameStateChangedEvent): void{\n \n \n switch(ed.State){\n case GameState.NotStarted:\n //this.clearBoard();\n break;\n case GameState.InProgress:\n if(this.gameState !== GameState.NotStarted){\n // this.clearBoard();\n // this.drawGrid(this.ctx);\n }\n break;\n }\n\n this.refreshGameScore();\n\n this.gameState = ed.State;\n }\n\n refreshGameScore(): void{\n \n this.player2Score = this.tictactoeApp.getPlayer2Score();\n this.player1Score = this.tictactoeApp.getPlayer1Score();\n this.rounds = this.tictactoeApp.getScore().getRound();\n this.draws = this.tictactoeApp.getScore().getDraws();\n }\n\n onMoveCommandCompleted(ed: MoveCompletedEvent): void{\n \n switch(ed.MoveResultType){\n case MoveResultType.Success:\n {\n this.winType = ed.winType;\n if(ed.winType !== WinType.None){\n this.playWinSound();\n }\n this.playSound();\n }\n break;\n case MoveResultType.Invalid:\n this.playErrorSound();\n break;\n }\n this.activePlayer = this.tictactoeApp.getActivePlayerSymbol();\n }\n\n playErrorSound(): void{\n (this.$refs.audioError as HTMLAudioElement).play();\n\n setTimeout(() => {\n (this.$refs.audioError as HTMLAudioElement).pause();\n (this.$refs.audioError as HTMLAudioElement).currentTime = 0;\n }, 500);\n }\n\n playSound(): void{\n (this.$refs.audio as HTMLAudioElement).play();\n }\n\n playWinSound(): void{\n (this.$refs.audioWin as HTMLAudioElement).play();\n }\n\n initialiseCanvas(): void{\n \n this.newcanvas = this.$refs.gridnew as HTMLCanvasElement;\n this.height = this.newcanvas.height;\n this.width = this.newcanvas.width;\n }\n\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TicTacToe.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TicTacToe.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TicTacToe.vue?vue&type=template&id=140086b2&scoped=true&\"\nimport script from \"./TicTacToe.vue?vue&type=script&lang=ts&\"\nexport * from \"./TicTacToe.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./TicTacToe.vue?vue&type=style&index=0&id=140086b2&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"140086b2\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\nimport { Component, Vue } from 'vue-property-decorator';\n\nimport TicTacToe from '@/components/TicTacToe.vue'\n\n@Component({\n components: {\n TicTacToe\n },\n})\nexport default class TicTacToeView extends Vue {}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TicTacToe.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TicTacToe.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TicTacToe.vue?vue&type=template&id=67c6b63e&\"\nimport script from \"./TicTacToe.vue?vue&type=script&lang=ts&\"\nexport * from \"./TicTacToe.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter, { RouteConfig } from 'vue-router'\nimport Home from '../views/Home.vue'\nimport TicTacToeView from '../views/TicTacToe.vue'\n\n\nVue.use(VueRouter)\n\nconst routes: Array = [\n {\n path: '/',\n name: 'Home',\n component: Home\n },\n {\n path: '/TicTacToe',\n name: 'TicTacToe',\n component: TicTacToeView\n }\n \n // {\n // path: '/about',\n // name: 'About',\n // // route level code-splitting\n // // this generates a separate chunk (about.[hash].js) for this route\n // // which is lazy-loaded when the route is visited.\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/About.vue')\n // }\n]\n\nconst router = new VueRouter({\n routes\n})\n\nexport default router\n","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n state: {\n },\n mutations: {\n },\n actions: {\n },\n modules: {\n }\n})\n","import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\nimport store from './store'\n\nVue.config.productionTip = false\n\nnew Vue({\n router,\n store,\n render: h => h(App)\n}).$mount('#app')\n"],"sourceRoot":""}