Проблема со стиранием регистра в текущей игровой доске после того, как веб-специалист выполнил вычисления - PullRequest
0 голосов
/ 30 декабря 2018

У меня проблема с двумя версиями фрагмента кода, которые, как ожидается, будут делать то же самое: одна с классическим подходом (без веб-разработчика) и вторая с веб-разработчиком.Игра работает нормально с версией без веб-работы:

Ссылка игры 5 : игра без веб-разработчиков

И источник javascript: 8 : скрипт без веб-работников

Я хотел бы заставить работать версию для веб-работников.К сожалению, после того, как компьютер готов, рисование новых дел становится проблематичным: дело (2,3) = (столбец, строка) стирается, и я не могу знать, почему.

Следующая ссылка - веб-работникверсия:

Ссылка на игру 6 : игра с веб-мастерами

И источник javascript: 9 : скрипт с веб-мастерами

Я думаю, что существуют конфликты между областью локальных и глобальных переменных, так как случай (2,3) удаляется при первом обращении к компьютеру.

Относительно версии веб-рабочегоЯ думаю, что соответствующая часть здесь:

   else if (mode == 'computer') {
        // Local variable as copy of current game board, i.e copy of HitCurrent
        let HitTemp = JSON.parse(JSON.stringify(HitCurrent));

        // Promise
        new Promise( resolve => {
        // Creation of webworker
        let firstWorker = new Worker(workerScript);
        firstWorker.onmessage = function (event) {
          resolve(event.data);
        }
   // Post current copy of HitCurrent, i.e HitTemp
    firstWorker.postMessage([HitTemp, HitTemp.playerCurrent, maxNodes]);
    }).then(({result}) => {

    // Get back game board of webworker
    HitTemp = result.HitResult;

    // Get back suggested hit computed by webworker
    [a,b] = HitTemp.coordPlayable;

    // Drawing all lines from suggested hit (in 8 directions)
    for (k = 0; k < 8; k++) {
       exploreHitLine(HitTemp, a, b, k, 'drawing');
    }
    // Update the global current game board (HitCurrent) from local game board (HitTemp)
    HitCurrent = HitTemp;

    // Remove playable hits
    cleanHits('playable', HitCurrent);

    // Display current game
    displayCurrentHit(HitCurrent);

    // Up to there, first computer hit is good 
    // and game board is well drawn
    alert('Stop just after displayCurrentHit');
    // After this above alert, the case (2,3) is deleted
    // from the game board : Is "HitCurrent" modified  
    // once promise is done, i.e outside the promise ??   
  });`
    // Prove asynchronous of new promise call
    alert('Here : after new promise call - prove asynchronous call into block "mode = computer"');
    }

Для первого попадания в компьютер я ожидаю иметь линию из 3 черных корпусов (от (2,3) до (4,3)случаи (см. рисунок ниже), но, как я уже сказал, случай (2,3) удаляется, когда я отображаю объект currentHit (описывающий текущее состояние игры и играбельные хиты).

1) Исходное состояние игры для воспроизведения ошибки: вам нужно взять глубина = 1 и нажать на компuter black перед нажатием запустите игру

initial state

2) Ожидается игровая доска:

gameboard expected:

3) Дело (2,3) удалено после alert

case removed:

ОБНОВЛЕНИЕ 1: Я думаю, что у меня есть первые элементы ответа.

Функция (названная "computeHit"), которая содержит блок кода, который я дал выше, вызывается из другой функции, подобной этой:

computeHit(Hit, 'computer');
alert('here after call of computeHit');

, и при выполнении я получаюэто alert после вызова computeHit, подтверждающее, что вызов обещания является асинхронным.

Так что я не знаю, чтобы заблокировать часть кода (else if (mode == 'computer') { ...}).

МожетЯ делаю кодовую блокировку (с promise) до тех пор, пока веб-работник выполнил свои вычисления (чтобы рассчитать наилучшее рекомендуемое попадание компьютера)?

Я немного растерялся и путаюсь междуОбещание, веб-работник и блокировка части кода, любая помощь или советы были бы хорошими.

...