2015-11-28 3 views
-2

Создание игры Tic Tac Toe. Я пытаюсь прочитать столбцы и строки tic tac toe, чтобы проверить, кто победил. Я использую $scope.checkResults(), чтобы захватить столбцы и строки и передать их в функцию allTheSame, чтобы проверить, равны ли значения, которые не работают. Вот ссылка codepen. http://codepen.io/theMugician/pen/ojJrRpTIC TAC TOE javascript

var app = angular.module("ticTacToe", []); 
app.controller("MainCtrl", function($scope){ 
    var cell = $(".square"); 
    $scope.player = ""; 
    $scope.AI = ""; 
    // changed special chars to X and O as the if statement failed. 
    var cross = "✖"; 
    var circle = "◯"; 

    /*** Choose a shape ***/ 
    $scope.choosePlayer = function(e) { 
    $scope.player = $(e.currentTarget).text(); 
     $('.choose').css('top', '-2000px'); 
     $('#wrapper').css('top', '-600px'); 
     $('#wrapper').css('opacity', '1'); 
    //these if statements failed before (AI was always empty) 
    if($scope.player === cross){ 
    $scope.AI = circle; 
    }else if($scope.player === circle){ 
    $scope.AI = cross; 
    } 
} 

    /*** Shape Cells ***/ 
    $scope.cells = [ { value: '' }, { value: '' }, { value: '' }, 
    { value: '' }, { value: '' }, { value: '' } , 
    { value: '' }, { value: '' }, { value: '' } 
    ]; 
    // made a ref to scope cells 
    $scope.emptyCells = $scope.cells; 

    /*** Make a move ***/ 
    $scope.move = function(cell){ 
    cell.value = $scope.player; 
    var round = 0; 
    /*** AI makes a move ***/ 
    while(round < 1){ 
    // filtered to get only available cells (for performance) 
     $scope.emptyCells = $scope.cells.filter(function(cell){ 
     return cell.value === ''; 
     }); 
     // got random cell according to empty cells 
     var randomCell = $scope.emptyCells[Math.floor((Math.random()*($scope.emptyCells.length-1))+1)]; 
     if(randomCell.value === ""){ 
     randomCell.value = $scope.AI; 
     round = 1; 
     }else{ 
     round = 0; 
     } 
    } 
    $scope.checkResults(); 
    }; 

    //checks if values are the same 
    function allthesame(arr){ 
    var L= arr.length-1; 
    while(L){ 
     if(arr[L--]!==arr[L]) return false; 
    } 
    alert(arr[L].value + "is the winner"); 
} 

    //checks Columns and rows 
    $scope.checkResults = function(){ 
    var allCells = $scope.cells; 
    // check rows 
    var cellRows = []; 
    while(allCells > 0){ 
     cellRows.push(allCells.splice(0,3)); 
    } 
     for(var i = 0; i < cellRows.length; i++){ 
     allTheSame(cellRows[i]); 
     } 
    // check columns 
     var cellCols = []; 
     while(allCells > 0){ 
      cellCols.push(allCells.splice(0)); 
      cellCols.push(allCells.splice(3)); 
      cellCols.push(allCells.splice(6)); 
     } 
     while(cellCols > 0){ 
     cellCols.push(cellCols.splice(0,3)); 
    } 
     for(var i = 0; i < cellCols.length; i++){ 
     allTheSame(cellCols[i]); 
     } 
    } 

$scope.reset = function(){ 
    $scope.cells = [ { value: '' }, { value: '' }, { value: '' }, 
    { value: '' }, { value: '' }, { value: '' } , 
    { value: '' }, { value: '' }, { value: '' } 
    ]; 
} 
}); 

ответ

2

Так у вас есть массив из 9 значений и нужно сравнить с 8 возможных механизмов выигрышных, 3 по вертикали, 3 горизонтальных и 2 диагонали .. итерации массива против списка наблюдения из «выигрышных» комбинации могут быть что ты хочешь делать.

{0,1,2} 
{3,4,5} 
{6,7,8} 
{0,3,6} 
{1,4,7} 
{2,5,8} 
{0,4,8} 
{2,4,6} 

Я был просто на моем пути к двери я могу отправить код позже, но я думаю, что сохранение этого списка в качестве элемента сравнения для ваших клеток могут быть более простым способом.

Вот ссылка статью я схватился быстро: это должно быть легко преобразовать в JavaScript: http://www.codeproject.com/Articles/2400/Tic-Tac-Toe-in-C

+0

Я попробую ваше решение и посмотрю, что я могу придумать. –

0

Используя советы Фродо я пришел к решению, которое намного проще, чем то, что я делал раньше.

Я сохранил все выигрышные комбинации в массиве. Затем я проверил каждую выигрышную комбинацию, чтобы узнать, соответствует ли значение каждой ячейки в этом комбо. Просто как тот.

var winningNums = [ 
    [0,1,2], 
    [3,4,5], 
    [6,7,8], 
    [0,3,6], 
    [1,4,7], 
    [2,5,8], 
    [0,4,8], 
    [2,4,6] 
    ]; 


    //checks if values are the same 
    $scope.checkResults = function(){ 
    var allCells = $scope.cells; 
    for(var i = 0; i < winningNums.length; i++){ 
     var a = winningNums[i][0],b=winningNums[i][1],c=winningNums[i][2]; 
     var cell1 = allCells[a].value, cell2 = allCells[b].value, cell3 = allCells[c].value; 
     if(cell1 == "" || cell2 == "" || cell3 == ""){ 
     break; 
     } 
     if(cell1 === cell2 && cell2 === cell3){ 
      var winnerDiv = "<div><h1>" + cell1 + " is the winner</h1></div>"; 
      $(
"#wrapper").append(winnerDiv); 
     } 

     } 

    }