обновление массива состояний отложено / не полностью функционирует React Native - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь написать карточную игру, но пытаюсь «выбросить» использованные карты из колоды. Первоначально игра начнется с предоставления игрокам по две карты (используя функцию handleDeal), по какой-то причине, когда это происходит, все карты все еще присутствуют (показано через console.log). После раздачи своих начальных карт они могут запросить больше карт (используя функцию playerNewCard), когда они нажимают на эту функцию (скажем, у них есть король червей), ничего не показывается, чтобы отбрасываться, но когда они снова нажимают на эту функцию (скажем, у них туз червей) на нем показана первая сбрасываемая карта (теперь король червей сбрасывается), но не та карта, которую они только что получили. Оригинальные карты, которые им сдали, никогда не «сбрасываются».

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

Я уже пару дней обдумывал это, пробуя разные порядки, разные способы удаления из массивов состояний и многое другое. Боюсь, мне не хватает чего-то простого, просто потому, что я так долго на это смотрел. Надеюсь, кто-то сможет понять / решить мою проблему!

Ниже приведены функции, с которыми я работаю (сокращено до основных деталей)

вот код начальной сделки:

const handleDeal = () => {
        playerNewCard()
        dealerNewCard()
        playerNewCard()
        dealerNewCard()
    }

Вот функция playerNewCard ( Функция dealerNewCard имеет тот же формат):

const playerNewCard = () => {
        if (PlayerCard1.type === '') {
            setPlayerCard1(randomCard())
        } else if (PlayerCard2.type === '') {
            setPlayerCard2(randomCard())
        } 
    }

Вот функция randomCard:

const randomCard = () => {
        let randomNum2 = Math.ceil(Math.random() * 52)

        let newCard = {}

        newCard = Deck1[randomNum2]
        setDeck1(Deck1.filter(card => card !== newCard))
        console.log(Deck1)

        return newCard
    }

1 Ответ

0 голосов
/ 26 марта 2020

На вашем месте я бы go использовал другой подход к колоде:

  1. Как и в реальной жизни, вы сначала начинаете упорядоченную колоду (массив из 0..51 целых чисел в ваш вариант использования).
  2. Затем вы перетасовываете свою колоду. Самый простой способ - использовать функцию loda sh shaffle: https://lodash.com/docs/4.17.15#shuffle
  3. Теперь у вас есть массив из 0..51 целых чисел, но в случайном порядке
  4. Теперь, когда вы хотите получить карту из колоды, просто используйте Array.pop (): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop

Не уверен, что это решит вашу проблему, но я думаю, что это лучший подход и гораздо ближе к реальным карточным колодам.

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

...