-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
base: master
Are you sure you want to change the base?
Solution #18
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- В іграх ніхто не опирається на дані в DOM дереві, це небезпечно і ненадійно. Користувач не має мати можливості якось повпливати на результат через html
- Багато однакових функцій які роблять одне і теж, moveUp, moveDown, moveLeft і combineRow, combineColumn, багато коду дублюється, десь -1, десь +1, цього в ідеалі треба уникати.
- Не всі назви змінних відповідають дійсності.
- Діли логіку великих функцій на менші функції, код має виглядати декларативно, колеги не мають догадуматися що значить той чи інших цикл.
- В даному випадку для гри краще використовувати масив як поле і працювати з ним.
[
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
]
- Маючи поле в JS отримати доступ до нього вже важче (але все ще можливо). За те це набагато безпечніше і ти вже не віриш даним в DOM
- Створюєш метод render, який відмальовує дані з масиву на ігровому полі після всіх операцій з матрицею
- Створюєш метод rotateMatrix, розвертаєш матрицю в правильну сторону і тоді можеш завжди moveUp тільки робити і працювати в одну сторону. Тобто ти розвертаєш матрицю в правильну сторону, мерджиш клітинки - розвертаєш матрицю в початкове положення, вуаля -3 зайвих функції
- Для гри краще використовувати клас Game з статичними полями та методами.
- Не варто запускати цикли які намагаються попасти в пусту клітинку, є імовірність що вони її ніколи не знайдуть, хоч і мізерна. Шукай координати всіх пустих клітинок спершу і тоді серед масиву пустих кілитинок вибирай випадкову, кількість операцій буде в сотні разів меншою.
А так реалізація хороша і робоча, прекрасна робота.
src/scripts/main.js
Outdated
// write your code here | ||
const arrowButtons = [`ArrowUp`, `ArrowDown`, | ||
`ArrowLeft`, `ArrowRight`]; | ||
const tr = document.querySelectorAll(`tr`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Це велике завдання і назви змінних тут дуже важливі. Я не розумію що це за tr
src/scripts/main.js
Outdated
const startMessage = document.querySelector(`.message-start`); | ||
const loseMessage = document.querySelector(`.message-lose`); | ||
const gameScore = document.querySelector(`.game-score`); | ||
let mergingHappened; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
чому це тут і що це означає?
src/scripts/main.js
Outdated
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); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
є підозра що це може тривати безкінечно. Може так бути, що ти ніколи не попадеш в пусту клітинку?
src/scripts/main.js
Outdated
activeCells.forEach(cell => { | ||
cell.classList.remove(`field-cell--${cell.textContent}`, `active`); | ||
cell.textContent = ``; | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
окрема функція clearField
src/scripts/main.js
Outdated
break; | ||
} | ||
|
||
if (column[i].textContent !== column[i + 1].textContent) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src/scripts/main.js
Outdated
} | ||
}; | ||
|
||
const winGameMessage = () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const winGameMessage = () => { | |
const showWinGameMessage = () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ідеально! Додаш собі в портфоліо
Game
with propertygameField
.createGameField
that creates array matrix 4x4 and store matrix ingameField
property.startGame
that runs click handler forstart
button. Method also invokesclearField
,createCell
,render
methods.randomValue
that generate random value 2 or 4.createCell
that searches empty cell in matrix and select random empty cell and assign to selected empty cell random value generated byrandomValue
method.movesHandler
that invokesmoveUp
androtateMatrix
methods certain times based on the pressed arrow buttons and also invokes methodsrender
andcheckForLose
moveUp
that performs movement and merge of cells.recordOfScore
that takesvalue
parameter passed frommerge
method and record the score of the game.winGameMessage
andloseGameMessage
that show win or lose messages.clearField
that clears matrix values (make all matrix value as 0 )rotateMatrix
that rotates matrix in clockwise direction for 90 degrees per movementrender
that performs rendering cell values from the matrix (gameField
property) to the DOM elements.checkForLose
that checks if the game is lost after each movement of the cells.