Skip to content

React game#1

Open
abdullokhmusaev wants to merge 28 commits intomasterfrom
react-game
Open

React game#1
abdullokhmusaev wants to merge 28 commits intomasterfrom
react-game

Conversation

@abdullokhmusaev
Copy link
Copy Markdown
Owner

@abdullokhmusaev abdullokhmusaev commented Mar 7, 2021

  1. Task: https://github.com/rolling-scopes-school/tasks/blob/master/tasks/react/react-game.md
  2. Screenshot:
    minesweeper-game
  3. Deploy: https://abdulloh76-react-game.netlify.app/
  4. Done 07.03.2021 / deadline 03.03.2021
  5. Score: ( 46/100) просрочен дедлайн (-10) (36/100)

Basic scope (28/30)

  • вёрстка, дизайн, UI. Выполняются требования к оформлению приложения (8/10) (нет футера)
  • эффекты анимации. Анимация ходов, перемещения фигур, допустимых и недопустимых ходов, начала и окончания игры, победы и поражения и т.д (10)
  • механика игры. Ходы, перемещения фигур, набранные баллы, окончание игры и т.д. подчиняются определённым свойственным игре правилам (10)

Advanced scope (18/50)

  • звуки и музыка. В игре есть звуки и музыка, и есть настройки звуков и музыки: возможность вкл/откл звуки, вкл/откл музыку, регулировать громкость звуков, регулировать громкость музыки (0/10)
  • настройки игры. Есть не меньше трёх настроек разных опций игры, например, внешний вид игрового поля и фигур, сложность игры, определение порядка ходов. Речь не про настройки звуков и музыки, которые проверялись и оценивались в предыдущем пункте. Это должны быть настройки разных опций, а не три параметра одной опции, например, размера игрового поля (0/10)
  • статистика. Пользователь информируется о состоянии игры, ведётся запись ходов, побед и поражений, времени игры, либо отображается другая статистика игры. Есть таблица рекордов, в которой сохраняются результаты предыдущих 10 игр (8/10) (нет таблицы рекордов)
  • сохранение состояния игры при перезагрузке страницы. Сохраняются все опции игры: ходы, набранные очки, положение фигур и т д. Состояние игры сохраняется без необходимости кликать по кнопке save. Есть кнопка new game для запуска новой игры (10)
  • возможность управления игрой с клавиатуры или не меньше пяти hot keys. Есть список горячих клавиш для управления игрой с клавиатуры (0/10)

Hacker scope (0/20)

  • автопроигрывание игры. Есть кнопка Autoplay запускающая игру в автоматическом режиме. Это может быть отдельная партия игры (крестики-нолики, шашки, шахматы, морской бой, судоку и т.д.). Для бесконечных игр (тетрис, Flappy Bird и т.д), игра зацикливается не раньше чем через 30 ходов. Речь не про автозавершение начатой игры, автопроигрывание игры начинает игру с пустого поля или стандартной раскладки и показывает как эта игра сама играет без пользователя (0/10)
  • дополнительная функциональность. Реализована достаточно сложная в реализации дополнительная функциональность, которая улучшает качество игры. В качестве дополнительной функциональности рекомендуется создать и использовать бекенд, например, для хранения счёта игры. Также может быть и другая дополнительная функциональность, например, 3d игра, написана логика для компьютерного противника, есть сетевой режим игры, и т.д (0/10)

Comment thread src/componenets/Board.tsx
export const BoardContext = React.createContext<BoardContextType | null>(null);

export default function Board() {
const { changeGameStatus, trackingArray, changeTrackArr, board } = useContext(
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

context не стоит использовать в приложении так широко, для этих целей гораздо лучше подходит redux и react-redux, хотя react-redux и использует под капотом context, но это более распространённый вариант.
Ну или можно было обойтись только пропсами

Comment thread src/componenets/Board.tsx
);
}

// useEffect -> didMount, didUpdate, willUnmount
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Зачем этот комментарий?

Comment thread src/componenets/Board.tsx
) as GlobalState;

const boardArray: number[][] =
JSON.parse(sessionStorage.getItem('boardArray') as string) || board.arr;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Не совсем понятно, зачем здесь использовать sessionStorage

Comment thread src/componenets/Board.tsx
useEffect(() => {
sessionStorage.setItem('boardArray', JSON.stringify(boardArray));
sessionStorage.setItem('minesPositions', JSON.stringify(minesPositions));
// eslint-disable-next-line react-hooks/exhaustive-deps
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Стоит избегать отключения eslint для определенных строк - надо или разобраться, в чем ошибка, или отключить правило глобально если оно не подходит для твоего code-style

Comment thread src/componenets/Cell.tsx
trackingArray[x][y] = flag ? 0 : -1;
if (trackingArray[x][y] === 0) setRemainingMines(remainingMines + 1);
else if (trackingArray[x][y] === -1) setRemainingMines(remainingMines - 1);
sessionStorage.setItem('trackingArray', JSON.stringify(trackingArray));
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Не могу понять смысл использования sessionStorage - если оно используется для хранения данных приложения - то для этих целей более подходит redux или state основного компонента. Если данные необходимо сохранить для следующей сессии - то лучше использовать localStorage.

children: JSX.Element[];
}

export default function GlobalProvider({ children }: Props) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Не вижу смысла изобретать велосипед для хранения данных приложения - лучше выбрать один из распространённых паттернов (flux / redux)

changeTrackArr(true);
newBoard();
setRemainingMines(0);
// sessionStorage.setItem('trackingArray', )
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Закомменченего кода быть не должно

return <LoseIcon />;
case 'waiting':
case 'paused':
case 'playing':
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Все эти строки лучше вынести в константы

Comment thread src/utils/checkForWon.ts
@@ -0,0 +1,12 @@
export default function checkForWon(
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Лучше использовать обычный экспорт вместо export default, к компонентам это тоже относится

minesPositions.push({ x, y });

if (x + 1 < width) {
if (y + 1 < height && arr[x + 1][y + 1] !== -1) arr[x + 1][y + 1] += 1;
Copy link
Copy Markdown

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