Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var directions = [
- [0, 1],
- [1, 1],
- [1, 0],
- [1, -1]
- ];
- /* Mind reader */
- function MindReader() {
- this.combo = 5;
- this.myIdx = 0;
- this.enemyIdx = 1;
- this.size = 0;
- this.gamefield = null;
- this.setIdx = function (idx) {
- this.myIdx = idx;
- this.enemyIdx = Math.abs(idx - 1);
- };
- this.setCombo = function (combo) {
- this.combo = combo;
- };
- this.play = function (gamefield) {
- this.gamefield = gamefield;
- this.size = gamefield.length;
- var alerting = false; // for debugging
- var move;
- move = this.win();
- if (move !== null) {
- if (alerting) {
- alert("Win");
- }
- return move;
- }
- move = this.fixEnemyWin();
- if (move !== null) {
- if (alerting) {
- alert("Fix enemy win");
- }
- return move;
- }
- move = this.winInTwoMoves();
- if (move !== null) {
- if (alerting) {
- alert("Win in two moves");
- }
- return move;
- }
- move = this.fixEnemyWinInTwoMoves();
- if (move !== null) {
- if (alerting) {
- alert("Fix enemy win in two moves");
- }
- return move;
- }
- move = this.winInThreeMoves();
- if (move !== null) {
- if (alerting) {
- alert("Win in three moves");
- }
- return move;
- }
- move = this.fixEnemyWinInThreeMoves();
- if (move !== null) {
- if (alerting) {
- alert("Fix enemy win in three moves");
- }
- return move;
- }
- move = this.findBestMove();
- if (move !== null) {
- if (alerting) {
- alert("Best move");
- }
- return move;
- }
- var a = Math.floor(this.size / 2);
- if (this.gamefield[a][a] === -1) {
- return [a, a];
- } else {
- return this.getRandomPossible();
- }
- };
- this.win = function () {
- var defdx, defdy, dx, dy, n, next;
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- }
- }
- if (n >= this.combo - 1) {
- return [x, y];
- }
- }
- }
- }
- }
- return null;
- };
- this.fixEnemyWin = function () {
- var defdx, defdy, dx, dy, n, next;
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- }
- }
- if (n >= this.combo - 1) {
- return [x, y];
- }
- }
- }
- }
- }
- return null;
- };
- this.winInTwoMoves = function () {
- var openA, openB, stepA, stepB, defdx, defdy, dx, dy, n, next;
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- openA = false;
- openB = false;
- stepA = false;
- stepB = false;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openA = true;
- dx += defdx;
- dy += defdy;
- if ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >=
- 0)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- stepA = true;
- }
- }
- }
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openB = true;
- dx -= defdx;
- dy -= defdy;
- if ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >=
- 0)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- stepB = true;
- }
- }
- }
- }
- }
- if ((n >= this.combo - 2 && openA && openB) || (stepA && stepB && n >= (this.combo - 3))) {
- return [x, y];
- }
- }
- }
- }
- }
- return null;
- };
- this.fixEnemyWinInTwoMoves = function () {
- var openA, openB, stepA, stepB, defdx, defdy, dx, dy, n, next, h = 0;
- var value, bestValue = 0;
- var posMoves = new Array();
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- openA = false;
- openB = false;
- stepA = false;
- stepB = false;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openA = true;
- dx += defdx;
- dy += defdy;
- if ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >=
- 0)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- stepA = true;
- }
- }
- }
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openB = true;
- dx -= defdx;
- dy -= defdy;
- if ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >=
- 0)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- stepB = true;
- }
- }
- }
- }
- }
- if ((n >= this.combo - 2 && openA && openB) || (stepA && stepB && n >= (this.combo - 3))) {
- value = this.getValue(x, y);
- if (value > bestValue){
- bestValue = value;
- }
- posMoves[h++] = [value, [x, y]];
- }
- }
- }
- }
- }
- if (h > 0){
- for (var k = 0; k < h; k++){
- if (posMoves[k][0] === bestValue){
- return posMoves[k][1];
- }
- }
- }
- return null;
- };
- this.winInThreeMoves = function () {
- var openA, openB, stepA, stepB, defdx, defdy, dx, dy, n, next, k;
- var value, bestValue = 0, h = 0, posMoves = new Array();
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- k = 0;
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- openA = false;
- openB = false;
- stepA = false;
- stepB = false;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openA = true;
- }
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openB = true;
- }
- }
- }
- if (n >= this.combo - 3 && openA && openB) {
- k += 1;
- }
- }
- if (k >= 2) {
- value = this.getValue(x, y);
- if (value > bestValue){
- bestValue = value;
- }
- posMoves[h++] = [value, [x, y]];
- }
- }
- }
- }
- if (h > 0){
- for (var k = 0; k < h; k++){
- if (posMoves[k][0] === bestValue){
- return posMoves[k][1];
- }
- }
- }
- return null;
- };
- this.fixEnemyWinInThreeMoves = function () {
- var openA, openB, stepA, stepB, defdx, defdy, dx, dy, n, next, k;
- var value, bestValue = 0, h = 0, posMoves = new Array();
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- k = 0;
- for (var i = 0; i < directions.length; i++) {
- defdx = directions[i][0];
- defdy = directions[i][1];
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- openA = false;
- openB = false;
- stepA = false;
- stepB = false;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openA = true;
- }
- }
- }
- dx = -defdx;
- dy = -defdy;
- next = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (
- next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- next = false;
- if (this.gamefield[x + dx][y + dy] === -1) {
- openB = true;
- }
- }
- }
- if (n >= this.combo - 3 && openA && openB) {
- k += 1;
- }
- }
- if (k >= 2) {
- value = this.getValue(x, y);
- if (value > bestValue){
- bestValue = value;
- }
- posMoves[h++] = [value, [x, y]];
- }
- }
- }
- }
- if (h > 0){
- for (var k = 0; k < h; k++){
- if (posMoves[k][0] === bestValue){
- return posMoves[k][1];
- }
- }
- }
- return null;
- };
- this.findBestMove = function () {
- var value, bestValue = 0, i = 0, j = 0;
- var allValues = new Array();
- var posMoves = new Array();
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- value = this.getValue(x, y);
- allValues[i++] = [value, [x, y]];
- if (value > bestValue) {
- bestValue = value;
- }
- }
- }
- }
- if (bestValue > 0) {
- for (var z = 0; z < i; z++) {
- if (allValues[z][0] === bestValue) {
- posMoves[j++] = allValues[z][1];
- }
- }
- return posMoves[Math.floor(Math.random() * j)];
- } else {
- return null;
- }
- };
- this.getValue = function (x, y) {
- var value = 0, dx, dy;
- for (var i = 0; i < directions.length; i++) {
- dx = directions[i][0];
- dy = directions[i][1];
- value += this.getValueDirection(x, y, dx, dy);
- }
- return value;
- };
- this.getValueDirection = function (x, y, defdx, defdy) {
- var value = 0;
- var dx = defdx, dy = defdy;
- var n = 0;
- var next = true;
- var skip = true;
- var minus = false;
- var valuePlus = false;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- skip = false;
- valuePlus = true;
- n += 1;
- dx += defdx;
- dy += defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && skip) {
- skip = false;
- minus = true;
- dx += defdx;
- dy += defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && (skip === false)) {
- if (valuePlus) {
- n += 0.5;
- }
- next = false;
- } else {
- next = false;
- }
- }
- if ((minus) && (valuePlus)) {
- value -= 0.25;
- }
- minus = false;
- valuePlus = false;
- dx = -defdx;
- dy = -defdy;
- next = true;
- skip = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (next)) {
- if (this.gamefield[x + dx][y + dy] === this.myIdx) {
- skip = false;
- valuePlus = true;
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && skip) {
- skip = false;
- minus = true;
- dx -= defdx;
- dy -= defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && (skip === false)) {
- if (valuePlus) {
- n += 0.5;
- }
- next = false;
- } else {
- next = false;
- }
- }
- if ((minus) && (valuePlus)) {
- value -= 0.25;
- }
- minus = false;
- valuePlus = false;
- if (n > 0) {
- if (this.comboPossibleAt(x, y, defdx, defdy, this.myIdx)) {
- value = value + Math.pow(2, (n + 0.25));
- }
- }
- dx = defdx;
- dy = defdy;
- n = 0;
- next = true;
- skip = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- skip = false;
- valuePlus = true;
- n += 1;
- dx += defdx;
- dy += defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && skip) {
- skip = false;
- minus = true;
- dx += defdx;
- dy += defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && (skip === false)) {
- if (valuePlus) {
- n += 0.5;
- }
- next = false;
- } else {
- next = false;
- }
- }
- if ((minus) && (valuePlus)) {
- value -= 0.25;
- }
- minus = false;
- valuePlus = false;
- dx = -defdx;
- dy = -defdy;
- next = true;
- skip = true;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0) && (next)) {
- if (this.gamefield[x + dx][y + dy] === this.enemyIdx) {
- skip = false;
- valuePlus = true;
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && skip) {
- skip = false;
- minus = true;
- dx -= defdx;
- dy -= defdy;
- } else if ((this.gamefield[x + dx][y + dy] === -1) && (skip === false)) {
- if (valuePlus) {
- n += 0.5;
- }
- next = false;
- } else {
- next = false;
- }
- }
- if ((minus) && (valuePlus)) {
- value -= 0.25;
- }
- if (n > 0) {
- if (this.comboPossibleAt(x, y, defdx, defdy, this.myIdx)) {
- value = value + Math.pow(2, n);
- }
- }
- return value;
- };
- this.comboPossibleAt = function (x, y, defdx, defdy, index) {
- var n = 1,
- dx = defdx,
- dy = defdy;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0)) {
- if ((this.gamefield[x + dx][y + dy] === index) || (this.gamefield[x + dx][y + dy] === -1)) {
- n += 1;
- dx += defdx;
- dy += defdy;
- } else {
- break;
- }
- }
- dx = -defdx;
- dy = -defdy;
- while ((x + dx < this.size) && (x + dx >= 0) && (y + dy < this.size) && (y + dy >= 0)) {
- if ((this.gamefield[x + dx][y + dy] === index) || (this.gamefield[x + dx][y + dy] === -1)) {
- n += 1;
- dx -= defdx;
- dy -= defdy;
- } else {
- break;
- }
- }
- return n >= this.combo;
- };
- this.getRandomPossible = function () {
- var possMoves = new Array();
- var n = 0;
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- if (this.gamefield[x][y] === -1) {
- possMoves[n++] = [x, y];
- }
- }
- }
- return possMoves[Math.floor(Math.random() * n)];
- };
- }
- /* ------------------ */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement