Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solution #18

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open

Solution #18

wants to merge 3 commits into from

Conversation

oleksandrorel
Copy link

@oleksandrorel oleksandrorel commented Jan 23, 2021

  • DEMO LINK
  • Created class Game with property gameField.
  • Created method createGameField that creates array matrix 4x4 and store matrix in gameField property.
  • Created method startGame that runs click handler for start button. Method also invokes clearField, createCell, render methods.
  • Created method randomValue that generate random value 2 or 4.
  • Created method createCell that searches empty cell in matrix and select random empty cell and assign to selected empty cell random value generated by randomValue method.
  • Created method movesHandler that invokes moveUp and rotateMatrix methods certain times based on the pressed arrow buttons and also invokes methods render and checkForLose
  • Created method moveUp that performs movement and merge of cells.
  • Created method recordOfScore that takes value parameter passed from merge method and record the score of the game.
  • Created methods winGameMessage and loseGameMessage that show win or lose messages.
  • Created method clearField that clears matrix values (make all matrix value as 0 )
  • Created method rotateMatrix that rotates matrix in clockwise direction for 90 degrees per movement
  • Created method render that performs rendering cell values from the matrix (gameField property) to the DOM elements.
  • Created method checkForLose that checks if the game is lost after each movement of the cells.

Copy link
Contributor

@vpolets vpolets left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. В іграх ніхто не опирається на дані в DOM дереві, це небезпечно і ненадійно. Користувач не має мати можливості якось повпливати на результат через html
  2. Багато однакових функцій які роблять одне і теж, moveUp, moveDown, moveLeft і combineRow, combineColumn, багато коду дублюється, десь -1, десь +1, цього в ідеалі треба уникати.
  3. Не всі назви змінних відповідають дійсності.
  4. Діли логіку великих функцій на менші функції, код має виглядати декларативно, колеги не мають догадуматися що значить той чи інших цикл.
  5. В даному випадку для гри краще використовувати масив як поле і працювати з ним.
[
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0],
]
  1. Маючи поле в JS отримати доступ до нього вже важче (але все ще можливо). За те це набагато безпечніше і ти вже не віриш даним в DOM
  2. Створюєш метод render, який відмальовує дані з масиву на ігровому полі після всіх операцій з матрицею
  3. Створюєш метод rotateMatrix, розвертаєш матрицю в правильну сторону і тоді можеш завжди moveUp тільки робити і працювати в одну сторону. Тобто ти розвертаєш матрицю в правильну сторону, мерджиш клітинки - розвертаєш матрицю в початкове положення, вуаля -3 зайвих функції
  4. Для гри краще використовувати клас Game з статичними полями та методами.
  5. Не варто запускати цикли які намагаються попасти в пусту клітинку, є імовірність що вони її ніколи не знайдуть, хоч і мізерна. Шукай координати всіх пустих клітинок спершу і тоді серед масиву пустих кілитинок вибирай випадкову, кількість операцій буде в сотні разів меншою.

А так реалізація хороша і робоча, прекрасна робота.

// write your code here
const arrowButtons = [`ArrowUp`, `ArrowDown`,
`ArrowLeft`, `ArrowRight`];
const tr = document.querySelectorAll(`tr`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Це велике завдання і назви змінних тут дуже важливі. Я не розумію що це за tr

const startMessage = document.querySelector(`.message-start`);
const loseMessage = document.querySelector(`.message-lose`);
const gameScore = document.querySelector(`.game-score`);
let mergingHappened;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

чому це тут і що це означає?

Comment on lines 13 to 26
for (let i = 0; i < 1; i++) {
const randomRawIndex = Math.floor(Math.random() * 4);
const randomCellIndex = Math.floor(Math.random() * 4);
const randomCell = tr[randomRawIndex].children[randomCellIndex];

randomCell.dataset.rawIndex = randomRawIndex;
randomCell.dataset.cellIndex = randomCellIndex;

if (randomCell.classList.contains(`active`)) {
i--;
continue;
}
appearedCellValue(randomCell);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

є підозра що це може тривати безкінечно. Може так бути, що ти ніколи не попадеш в пусту клітинку?

Comment on lines 46 to 49
activeCells.forEach(cell => {
cell.classList.remove(`field-cell--${cell.textContent}`, `active`);
cell.textContent = ``;
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

окрема функція clearField

break;
}

if (column[i].textContent !== column[i + 1].textContent) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

це супер ненадійно. Я зайду через інспектор і виграю цю гру ще до її початку
image
просто оновив значення клітинки.

}
};

const winGameMessage = () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const winGameMessage = () => {
const showWinGameMessage = () => {

Copy link
Contributor

@vpolets vpolets left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ідеально! Додаш собі в портфоліо

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants