Loading...
simon.kan1 avatar simon.kan1 9 Точки

10. Tic-Tac-Toe

Здравейте, тази зад. ми дава 90/100 и единия тест не знам как да го оправя:

https://pastebin.com/Aw36uzhH

https://judge.softuni.bg/Contests/Compete/Index/2753#9

 

Тагове:
0
JavaScript Advanced
MartinBG avatar MartinBG 4803 Точки

Проблемът е, че не прекъсвате играта ако всички полета са заети, а само когато свършат входните данни или някой от играчите спечели.

Това се вижда и от 3-ти нулев тест, при който програмата изписва "This place is already taken. Please choose another!" заради последната получена команда, вместо да приключи играта преди нея, защото всички игрови полета са вече заети.

["0 1",
 "0 0",
 "0 2",
 "2 0",
 "1 0",
 "1 2",
 "1 1",
 "2 1",
 "2 2",
 "0 0"]


This place is already taken. Please choose another!
The game ended! Nobody wins :(
O	X	X
X	X	O
O	O	X


Пишете, ако не се сещате как може да се справите с този проблем (функция, която да проверява дали има свободни полета или пък брояч на заетите такива... варианти - много).

0
simon.kan1 avatar simon.kan1 9 Точки

Да, с дебъгера и аз стигнах до това заключение, и пробвах с find, includes, every, с if проверки, и пак не успях да го измъдря, сигурен съм че е нещо простичко. Също се опасявам че този console.log  This place is already taken. Please choose another! , може би не е добре да е сложен в else -a

Ако може да ми покажете как да проверя дали масивът не съдържа false, или ако има по добре решение, ще съм благодарен

0
MartinBG avatar MartinBG 4803 Точки

Ето примерен вариант с минимални промени по кода, колкото да мине в Judge:

function ticTacToe(input) {

  // ...

  const hasFreeFields = (matrix) => matrix.some((arr) => arr.some(value => value === false));

  for (let i = 0; i < input.length && hasFreeFields(dashboard); i++) { // без други промени по кода
  // ...
}


 

0
simon.kan1 avatar simon.kan1 9 Точки

Сложих ги тези 2 реда , но не се получи, опитах и с този some да направя иф проверка при console.loga на This place is already taken. Please choose another! , но пак не успях

Мога ли да ви помоля да сложите целия работещ код, да видя къде ги слагате?

 

let dashboard = [[false, false, false],

    [false, false, false],

    [false, false, false]];

 

    let win = false;

    let player = 'X';

 

    const hasFreeFields = (matrix) => matrix.some((arr) => arr.some(value => value === false));

    for (let i = 0; i < input.length && hasFreeFields(dashboard); i++) {

        let [row, col] = input[i].split(' ').map(num => Number(num));

 

        if (!dashboard[row][col]) {

            dashboard[row][col] = player;

 

            if (checkForWinner(dashboard, player)) {

                win = true;

                break;

            }

 

            player = player === 'X' ? 'O' : 'X';

 

        } else {

            console.log("This place is already taken. Please choose another!");

        }

 

    }

 

    if (win) {

        console.log(`Player ${player} wins!`);

    } else {

        console.log("The game ended! Nobody wins :(");

    }

    dashboard.forEach(line => {

        console.log(line.join('\t'));

    });

0
MartinBG avatar MartinBG 4803 Точки

Това е модифицираното решение:

function ticTacToe(input) {

  let dashboard = [[false, false, false],
    [false, false, false],
    [false, false, false]];

  let hasFreeFields = (matrix) => matrix.some((arr) => arr.some(value => value === false))
  let win = false;
  let player = 'X';
  for (let i = 0; i < input.length && hasFreeFields(dashboard); i++) {
    let [row, col] = input[i].split(' ').map(num => Number(num));

    if (!dashboard[row][col]) {
      dashboard[row][col] = player;

      if (checkForWinner(dashboard, player)) {
        win = true;
        break;
      }

      player = player === 'X' ? 'O' : 'X';
    } else {
      console.log("This place is already taken. Please choose another!");
    }

  }

  if (win) {
    console.log(`Player ${player} wins!`);
  } else {
    console.log("The game ended! Nobody wins :(");
  }
  dashboard.forEach(line => {
    console.log(line.join('\t'));
  });

  function checkForWinner(currentBoard, sign) {
    let isWinner = false;
    for (let i = 0; i < 3; i++) {
      if (currentBoard[i][0] === sign && currentBoard[i][1] === sign && currentBoard[i][2] === sign) {
        isWinner = true;
        break;
      }
      if (currentBoard[0][i] === sign && currentBoard[1][i] === sign && currentBoard[2][i] === sign) {
        isWinner = true;
        break;
      }
    }
    if (!isWinner) {
      if ((currentBoard[0][0] === sign && currentBoard[1][1] === sign && currentBoard[2][2] === sign) ||
        (currentBoard[2][0] === sign && currentBoard[1][1] === sign && currentBoard[0][2] === sign)) {
        isWinner = true;
      }
    }
    return isWinner;
  }
}


 

0
simon.kan1 avatar simon.kan1 9 Точки

Благодаря много!

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.