Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. window.onload = function() {
  2.     var oUi = new GameUi();
  3.     var oCtrl = new GameCtrl(oUi);
  4.     oUi.setCtrl(oCtrl);
  5.     oCtrl.startGame();
  6. }
  7.  
  8. /*----------------------------------------*/
  9.  
  10. /*my little tool*/
  11. var Tool = {
  12.     getE: function(/*string*/sName) {
  13.         var sType = sName[0];
  14.         sName = sName.split(sType)[1];
  15.         switch(sType) {
  16.             case '#':
  17.                 return document.getElementById(sName);
  18.             case '.':
  19.                 var aResult = new Array();
  20.                 var aObj = document.getElementsByTagName('*');
  21.                 for(var i = aObj.length - 1; i >= 0; i--) {
  22.                     if(aObj[i].className && aObj[i].className.indexOf(sName) != -1) {
  23.                         aResult.push(aObj[i]);
  24.                     }
  25.                 }
  26.                 return aResult;
  27.             default:
  28.                 return document.getElementsByTagName(sName);
  29.         }
  30.     }
  31. };
  32.  
  33. /*---------------------------------------*/
  34. function GameUi() {
  35.     var oCtrl,
  36.         aBlocks,
  37.         sPlayerStyle,
  38.         sAiStyle;
  39.  
  40.     var init = function() {
  41.             aBlocks = Tool.getE('.block');
  42.         },
  43.         startGame = function() {
  44.             clean();
  45.             startScreen();
  46.         },
  47.         startScreen = function() {
  48.             var oScreen = Tool.getE('#start_screen');
  49.                 selectO = Tool.getE('#selectO'),
  50.                 selectX = Tool.getE('#selectX');
  51.             oScreen.style['display'] = 'block';
  52.             selectX.onmouseover = function() {
  53.                 selectO.className = '';
  54.                 this.className = 'current';
  55.             }
  56.             selectO.onmouseover = function() {
  57.                 selectX.className = '';
  58.                 this.className = 'current';
  59.             }
  60.             selectX.onclick = function() {
  61.                 sPlayerStyle = 'x';
  62.                 sAiStyle = 'o';
  63.                 oScreen.style['display'] = 'none';
  64.                 setupListener();
  65.             }
  66.             selectO.onclick = function() {
  67.                 sPlayerStyle = 'o';
  68.                 sAiStyle = 'x';
  69.                 oScreen.style['display'] = 'none';
  70.                 oCtrl.nextStep();
  71.                 setupListener();
  72.             }
  73.         },
  74.         setupListener = function() {
  75.             for (var i = aBlocks.length - 1; i >= 0; i--) {
  76.                 (function(index) {
  77.                     aBlocks[index].onclick = function() {
  78.                         if (aBlocks[index].innerHTML != '') return;
  79.                         draw('player', index);
  80.                         oCtrl.setChessboard(index, -1);
  81.                         oCtrl.nextStep();
  82.                     }
  83.                 })(i);
  84.             }
  85.         },
  86.         endGame = function() {
  87.             endScreen();
  88.         },
  89.         endScreen = function() {
  90.             var oScreen = Tool.getE('#end_screen');
  91.             var oEndInfo = Tool.getE('#end_info');
  92.             switch(oCtrl.getWinner()) {
  93.                 case 'ai':
  94.                     oEndInfo.innerHTML = 'LOST';
  95.                     break;
  96.                 case 'player':
  97.                     oEndInfo.innerHTML = 'WIN';
  98.                     break;
  99.                 case 'no':
  100.                     oEndInfo.innerHTML = 'ITE';
  101.                     break;
  102.             }
  103.             oScreen.style['display'] = 'block';
  104.             var btnRestart = Tool.getE('#btn_restart');
  105.             btnRestart.onclick = function() {
  106.                 oScreen.style['display'] = 'none';
  107.                 oCtrl.startGame();
  108.             }
  109.         },
  110.         draw = function(/*string*/role, /*num*/index) {
  111.             var obj = aBlocks[index];
  112.             switch (role) {
  113.                 case 'ai':
  114.                     obj.innerHTML = '<div class="' + sAiStyle +'"></div>';
  115.                     break;
  116.                 case 'player':
  117.                     obj.innerHTML = '<div class="' + sPlayerStyle +'"></div>';
  118.                     break;
  119.                 default:
  120.                     break;
  121.             }
  122.         },
  123.         clean = function() {
  124.             for (var i = aBlocks.length - 1; i >= 0; i--) {
  125.                 aBlocks[i].innerHTML = '';
  126.             }
  127.         };
  128.     init();
  129.  
  130.     return {
  131.         setCtrl: function(_oCtrl) {
  132.             oCtrl = _oCtrl;
  133.         },
  134.         startGame: function() {
  135.             startGame();
  136.         },
  137.         endGame: function() {
  138.             endGame();
  139.         },
  140.         draw: function(/*string*/role, /*obj*/obj) {
  141.             draw(/*string*/role, /*obj*/obj);
  142.         }
  143.     }
  144. }
  145.  
  146. /*-----------------------------------*/
  147.  
  148. function GameCtrl(/*obj*/_oUi) {
  149.     var oUi,
  150.         winner,
  151.         aChessboard,
  152.         aWinCondition;
  153.  
  154.     var init = function() {
  155.             oUi = _oUi;
  156.             aChessboard = [0,0,0,0,0,0,0,0,0],
  157.             aWinCondition = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];
  158.         },
  159.         checkOver = function() {
  160.             for (var i = aWinCondition.length - 1; i >= 0; i--) {
  161.                 if (aChessboard[aWinCondition[i][0]] + aChessboard[aWinCondition[i][1]] + aChessboard[aWinCondition[i][2]] == 3) {
  162.                     winner = 'ai';
  163.                     oUi.endGame();
  164.                     return true;
  165.                 }
  166.                 if (aChessboard[aWinCondition[i][0]] + aChessboard[aWinCondition[i][1]] + aChessboard[aWinCondition[i][2]] == -3) {
  167.                     winner = 'player';
  168.                     oUi.endGame();
  169.                     return true;
  170.                 }
  171.             }
  172.             var count = 0;
  173.             for (var i = aWinCondition.length - 1; i >= 0; i--) {
  174.                 if (aChessboard[i] != 0) count++;
  175.             }
  176.             if (count == 8) {
  177.                 winner = 'no';
  178.                 oUi.endGame();
  179.                 return true;
  180.             }
  181.             return false;
  182.         },
  183.         nextStep = function() {
  184.             if (!checkOver()) {
  185.                 var nMax = null, nMaxSub, aChessboards = new Array();
  186.                 for (var i = 8; i >= 0; i--) {
  187.                    
  188.                     for (var i2 = 8; i2 >= 0; i2--) {
  189.                         if (aChessboard[i2] != 0) continue;
  190.                         aChessboard[i2] = 1;
  191.                         for (var k = aWinCondition.length - 1; k >= 0; k--) {
  192.                             if (aChessboard[aWinCondition[k][0]] + aChessboard[aWinCondition[k][1]] +
  193.                                 aChessboard[aWinCondition[k][2]] == 3) {
  194.                                 //aChessboard[i] = 1;//change chessboard
  195.                                 console.log(i2)
  196.                                 oUi.draw('ai', i2);
  197.                                 checkOver();
  198.                                 return;
  199.                             }
  200.                         }
  201.                         aChessboard[i2] = 0;
  202.                     }
  203.  
  204.                     if (aChessboard[i] != 0) continue;
  205.                     aChessboard[i] = 1;
  206.                     /*if(checkSame(aChessboards, aChessboard)) {
  207.                         break;
  208.                     } else {
  209.                         aChessboards.push(aChessboard);
  210.                     }*/
  211.  
  212.                     var aTempCb = aChessboard.concat();
  213.                     var nMin = null;
  214.                     var aTempCbs = new Array();
  215.                     for (var j = 8; j >= 0; j--) {
  216.                         if (aTempCb[j] != 0) continue;
  217.                         aTempCb[j] = -1;//guess
  218.                         for (var k = aWinCondition.length - 1; k >= 0; k--) {
  219.                             if (aTempCb[aWinCondition[k][0]] + aTempCb[aWinCondition[k][1]] +
  220.                                 aTempCb[aWinCondition[k][2]] == -3) {
  221.                                 aChessboard[j] = 1;//change chessboard
  222.                                 aChessboard[i] = 0;
  223.                                 oUi.draw('ai', j);
  224.                                 checkOver();
  225.                                 return;
  226.                             }
  227.                         }
  228.                         /*if(checkSame(aTempCbs, aTempCb)) {
  229.                             break;
  230.                         } else {
  231.                             aTempCbs.push(aTempCb);
  232.                         }*/
  233.  
  234.                         var nMax2 = 0, nMin2 = 0,
  235.                             aTempCbMax = aTempCb.concat(),
  236.                             aTempCbMin = aTempCb.concat();
  237.                         for (var l = 8; l >= 0; l--) {
  238.                             if (aTempCbMax[l] == 0) {
  239.                                 aTempCbMax[l] = 1;
  240.                             }
  241.                             if (aTempCbMin[l] == 0) {
  242.                                 aTempCbMin[l] = -1;
  243.                             }
  244.                         }
  245.                         for (var m = aWinCondition.length - 1; m >= 0; m--) {
  246.                             if (aTempCbMax[aWinCondition[m][0]] + aTempCbMax[aWinCondition[m][1]] + aTempCbMax[aWinCondition[m][2]] == 3)
  247.                                 nMax2++;
  248.                             if (aTempCbMin[aWinCondition[m][0]] + aTempCbMin[aWinCondition[m][1]] + aTempCbMin[aWinCondition[m][2]] == -3) {
  249.                                 nMin2++;
  250.                             }
  251.                         }
  252.                         var nDiff = nMax2 - nMin2;
  253.  
  254.                         if (nMin == null) {
  255.                             nMin = nDiff;
  256.                         } else {
  257.                             nMin = nMin > nDiff ? nDiff : nMin;
  258.                         }
  259.                         aTempCb[j] = 0;
  260.                     }
  261.  
  262.                     if (nMax == null) {
  263.                         nMax = nMin;
  264.                         nMaxSub = i;
  265.                     } else {
  266.                         if (nMax < nMin) {
  267.                             nMax = nMin;
  268.                             nMaxSub = i;
  269.                         }
  270.                     }
  271.                     aChessboard[i] = 0;
  272.                 }
  273.                 aChessboard[nMaxSub] = 1;
  274.                 oUi.draw('ai', nMaxSub);
  275.                 checkOver();
  276.             } else {
  277.                
  278.             }
  279.         }
  280.     init();
  281.  
  282.     return {
  283.         startGame: function() {
  284.             aChessboard = [0,0,0,0,0,0,0,0,0];
  285.             oUi.startGame();
  286.         },
  287.         nextStep: function(/*num*/nPlayerStep) {
  288.             nextStep();
  289.         },
  290.         setChessboard: function(/*num*/index, /*num*/val) {
  291.             aChessboard[index] = val;
  292.         },
  293.         getWinner: function() {
  294.             return winner;
  295.         }
  296.     }
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement