2016-09-03 3 views
0

Я строю игру Tic-Tac-Toe.Почему не ранжирован стартовый игрок?

Я пытаюсь рандомизировать, какой игрок должен идти первым.

При загрузке платы генерируется случайное число от 1 до 2. Если число равно 1, то игрок 1 идет первым, иначе игрок2 переходит первым. Затем устанавливается currentPlayer.

Затем вызывается функция, currentPlayerFlag. Он установит класс, в котором текущий игрок будет активен. Затем активный игрок будет помечен, запустив свое имя.

По какой-то причине, независимо от того, сколько раз я перезагружаю страницу, стартовый игрок всегда настроен на player1. Почему это?

Ошибок в консоли не обнаружено.

Вот мой код:

var currentPlayer; 
var player1; 
var player2; 

// Grab original HTML and hold it as a variable 
    var originalHTML = document.body.innerHTML; 


// When the page loads, the startup screen should appear. 
    window.onload = function() { 
     document.body.innerHTML = '<div class="screen screen-start" id="start"><header><h1>Tic Tac Toe</h1><a href="#" class="button">Start game</a></header></div>'; 
     document.querySelector('a').addEventListener("click", loadBoard); 
    }; 


// playerObject 
function Player(name) { 
    this.name = name; 
    this.currentPlayer = false; 

}; 


// Add programming, so that when the player clicks the start button the start screen disappears, the board appears, and the game begins. 
    function loadBoard() { 
     document.body.innerHTML = originalHTML; 

     player1 = new Player(player1); 
     player2 = new Player(player2); 

     var startingPlayerNum = Math.floor(Math.random() * 1) + 1 ; 

     if(startingPlayerNum = 1){ 
      player1.currentPlayer = true; 
      currentPlayer = player1; 
     } else { 
      player2.currentPlayer = true; 
      currentPlayer = player2 
     } 

     //Add clickhandlers for boxes 
     var a1 = document.getElementById('a1').addEventListener("click", placePiece); 
     var a2 = document.getElementById('a2').addEventListener("click", placePiece); 
     var a3 = document.getElementById('a3').addEventListener("click", placePiece); 
     var b1 = document.getElementById('b1').addEventListener("click", placePiece); 
     var b2 = document.getElementById('b2').addEventListener("click", placePiece); 
     var b3 = document.getElementById('b3').addEventListener("click", placePiece); 
     var c1 = document.getElementById('c1').addEventListener("click", placePiece); 
     var c2 = document.getElementById('c2').addEventListener("click", placePiece); 
     var c3 = document.getElementById('c3').addEventListener("click", placePiece); 

     currentPlayerFlag() 
    }; 


    // The current player is indicated at the top of the page -- the box with the symbol O or X is highlighted for the current player. 
     // Do this by simply adding the class .active to the proper list item in the HTML. 
    function currentPlayerFlag() { 
     if(currentPlayer === player1){ 
      document.getElementById('player1').classList.add("active"); 
      document.getElementById('player2').className = "players"; 
     } 
     if(currentPlayer === player2){ 
      document.getElementById('player2').classList.add("players active"); 
      document.getElementById('player1').className = "players"; 
     } 
    }; 

Пожалуйста, скажите мне, что я делаю неправильно

+0

'Math.floor (Math.random() * 1) + 1 'всегда будет возвращать 1. – zerkms

ответ

1

алгоритм случайных чисел для JavaScript идет следующим образом:

Math.floor((Math.random() * max)) + min); 

Итак, ваш будет:

Math.floor((Math.random() * 2) + 1); 

Yours всегда возвращается 1, потому что ваш диапазон был не прав, он генерировал [1 , 2), таким образом, всегда возвращающийся 1. Вы должны разрешить ему возвращать [1, 3), меняя то, что вы умножаете на Math.random(), с 1 до 2.

Ваш e-mail:

var startingPlayerNum = Math.floor((Math.random() * 2) + 1); 

Причина Math.floor(Math.random() * 1) + 1 возвращает 1, потому что Math.random() генерирует число из [0, 1). Затем он округляется до пола (вниз) и добавляет его.

В вашем операторе if вы назначаете его одному, поэтому он всегда равен 1. == для сравнения, = предназначен для назначения. Попробуйте это, если:

if(startingPlayerNum == 1){ 
    player1.currentPlayer = true; 
    currentPlayer = player1; 
} else { 
    player2.currentPlayer = true; 
    currentPlayer = player2 
} 
+0

Черт, я включил его:' Math.floor (Math.random () * 2) + 1; ' Это все еще не работает. Нужно ли вместо этого использовать «ceil»? – gloopit

+0

'Math.floor (Math.random() * 2) + 1;' неправильно? Он по-прежнему не работает по какой-то причине – gloopit

+0

Редактировал @gloopit, должен работать – Li357

1

Math.random() возвращает значения в диапазоне [0, 1). Math.floor() всегда округляет значения вниз. Поэтому ваш Math.floor(Math.random() * 1) всегда возвращает 0.

Вместо этого вы можете использовать Math.round или предоставить более широкий диапазон для вашего Math.floor.

1
Math.floor(Math.random() * 1) + 1 ; 

всегда будет возвращать 1

Это происходит потому, что Math.random() возвращает значение в диапазоне [0; 1) (0 включительно, 1 эксклюзивные).

так Math.random() * 1 всегда между 0 и 1.

Так Math.floor(Math.random() * 1) всегда 0

Смежные вопросы