Giter VIP home page Giter VIP logo

memory-game's Introduction

Memory Game (Meduza Test App)

Сделать вот такую игру https://meduza.io/games/naydi-dvuh-odinakovyh-gubernatorov-igra-meduzy

Суть игры:

Игрок видит перед собой сетку карточек 4х4. Карточки лежат рубашкой вверх. По нажатию на карточку она открывается. Задача игрока — открыть две одинаковые карточки. Если открываются две одинаковые — они исчезают. Если открываются две разные — они возвращаются в исходное состояние.

Когда открыты последние две карточки, игра заканчивается и показывается результат (см. макет). Результатом является количество ходов, которое сделал игрок. Ходом считается открытие одной пары карточек.

Опционально:

После открытия двух одинаковых карточек появляется попап с дополнительной информацией (см. макет). Возраст рассчитывается исходя из текущей даты и дня рождения (см. data.json)

Требования:

  • JavaScript ES6
  • React + Redux
  • Максимальная ширина игры 650px
  • При ширине меньше 650px размеры карточек отличаются
  • Поддержка ретина-дисплеев
  • Анимации на свой вкус
  • Слово «раз» в результате должно склоняться в зависимости от значения (1 раз, 2 раза, 5 раз)

memory-game's People

Contributors

fanich37 avatar

Stargazers

 avatar

Watchers

 avatar

Forkers

nlight

memory-game's Issues

Ревью #2

Тут можно просто 2 аргумента передавать, зачем массив?

foundCards: [foundCards[0], foundCards[1]]

Давай попробуем просто задублировать элементы входного массива карт в одном массиве и потом отсортировать этот массив случайным образом

export function getRandomCardsArray(initialArray, numberOfElements) {

Есть библиотечка classnames, которая здорово помогает с управлением классами

const classNames = stage !== 'finished' ? [style.final, style.final_hidden].join(' ') : style.final;

Есть договоренность, что имена классов должны быть в единственном числе. Это так же относится к компонентам. В это случае можно придумать что-то вроде CardsList

import style from './Cards.css';

Если card.id уникальный и не меняется - то можно использовать его вместо индекса. Опять же можно генерировать уникальный id для каждой карты когда ты генерируешь случайный массив.

key={index} // eslint-disable-line react/no-array-index-key

Создание анонимных функций внутри render снижает производительность. Потому что джаваскрипт каждый раз создает новую функцию. Соответственно у компонента постоянно обновляются props и он перерисовывается. Конкретно в этом случае ты замыкаешь index и тут надо еще подумать, как это обойти в этом случае.

onClick={() => clickHandler(index)}

div можно заменить на a, а вложенные div на span и тогда a11y будет счастлив

<div className={cardClasses} onClick={onClick}>

Экспорт

Тут скорее всего будет много констант, поэтому лучше сразу без default экспорта, чтобы потом не менять импорты. Просто export const YEAR = ...

export default YEAR;

Review # 2

Эту сортировку раскритиковали. https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array возможно и правда лучше использовать lodash либо взять одну из реализаций shuffle по ссылке

return array.sort(() => 0.5 - Math.random()).sort(() => 0.5 - Math.random());

Я думаю, что можно просто double = [...input, ...input];

return array.map(item => [item, item]).reduce((prev, curr) => prev.concat(curr), []);

Object.assign можно заменить на destructuring return array.map(item => { ...item, key: shortId.generate() });

return array.map(item => Object.assign({}, item, { key: shortId.generate() }));

Т.е. ты предусматриваешь возможность копирования экземпляров классов? Можно так же заменить cloneObj на функцию из lodash

const newObj = obj.constructor();

Сам редукс советует либо использовать оператор ... либо библиотеку https://redux.js.org/recipes/structuringreducers/immutableupdatepatterns#immutable-update-utility-libraries

const newState = cloneObj(state);

Возможно стоит переименовать. Там ведь не сами карты, там индексы. С foundCards так же.

newState.openCards = [];

Оба стиля включаются на одной и той же стадии. Можно объединить.

[style.bigcard_shown]: stage === STAGES.PAUSED,
[style.bigcard_scaled]: stage === STAGES.PAUSED

[style.bigcard_shown]: stage === STAGES.PAUSED,

Вместо выделения массива можно попробовать конкатенацию строк

<h1 className={`${style.bigcard__title}  ${style.bigcard__title_h1}\`}>

<h1 className={[style.bigcard__title, style.bigcard__title_h1].join(' ')}>

Что если вынести эту функцию в компонент <Card />?

return array.map(item => Object.assign({}, item, { src: require(`./img/small/s_${item.slug}@2x.jpg`) }));

Так же как в <BigCard>

const photo = require(`../../img/large/l_${card.slug}@2x.jpg`);

Ты здесь стараешься подгрузить фотки заранее? Это больше не работает похоже
https://stackoverflow.com/questions/12158540/does-displaynone-prevent-an-image-from-loading

const PicList = ({ pics }) => (

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.