Обновление данных в базе данных Firebase с помощью кода JS возвращает неожиданный цикл - PullRequest
0 голосов
/ 31 декабря 2018

Несколько недель назад я начал создавать свою собственную игру, используя javascript и firebase, и у меня были некоторые проблемы с обновлением данных.Когда я создавал боевую систему для этой игры, я пытался дать игрокам некоторую выгоду от побед в боях.Когда игрок выиграл битву, я хотел обновить его (например) опыт, добавив опыт, и это сработало, но когда я добавил еще одно обновление данных (когда игрок выиграл бой, система обновляла данные о победах в боях и расположение данных о статистикебыли в другом месте в базе данных), он возвращает цикл.Код JS здесь

// battle_system.js

var opponent = nextBattle.getAttribute('mon-name');
var hp = 0;

 var getPlayer = firebase.database().ref().child('accounts/' + uid + '/character/char');
 var getEnemy = firebase.database().ref().child('Monsters/' + opponent);

                    getPlayer.on('value', (snapshot) => {
                       var getSnapshot = snapshot.val();


                         getEnemy.on('value', (snap) => {
                              var getSnap = snap.val();

                              var enemyHp = getSnap.hp;
                              var playerHp = getSnapshot.hp;

                              var enemy = {
                                  name: getSnap.name,
                                  hp: enemyHp,
                                  damage: getSnap.dmg,
                                  armor: getSnap.armor,
                                  lvl: getSnap.lvl
                              } 
                              var player = {
                                  name: getSnapshot.nick,
                                  hp: playerHp,
                                  damage: getSnapshot.dmg,
                                  armor: getSnapshot.armor,
                                  lvl: getSnapshot.lvl
                              }
                              var starCountRef = firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent);

                              btl_section.innerHTML = '';
                              starCountRef.on('value', (snapStat) => {

                                  var x = (snapStat.val().wins)+1;
                                  var y = (snapStat.val().loses)+1;

                                  while(player.hp > 0 && enemy.hp > 0){
                                      var MathPlayer = Math.random(),
                                          MathEnemy = Math.random();

                                      enemy.hp -= player.damage * MathPlayer;
                                      player.hp -= enemy.damage * MathEnemy;
                                      btl_section.innerHTML = btl_section.innerHTML + 'Enemy: ' + enemy.hp + '<br> Player: ' + player.hp + '<br>';

                                     if(player.hp < 0){
                                          firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent).update({
                                              loses : y
                                          });
                                      }else if(enemy.hp < 0) {
                                          console.log('win');
                                          firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent).update({
                                              wins : x
                                          });
                                          firebase.database().ref('accounts/' + uid + '/character/char').update({
                                              exp : (30 * (Math.random()*100))
                                          });
                                      }

                                 }

                            });
                         });

                    });
  //firebase structure
Monsters: {
  Freder : {
    armor: 0,
    dmg: 10,
    lvl: 1,
    hp: 100,
    name: 'Freder'
 }
},
accounts:{
   uid:{
    character:{
       battles:{
          stats: {
             wins: 0,
            loses: 0
          }
        },
        char:{
          exp: 0,
          lvl: 0,
          dmg: 12,
          hp: 100,
          armor: 0,
          nick: 'Nickname'
       }
    }

   }
 }

И теперь, за исключением того, что, когда игрок выигрывает битву, опыт и статистика выигрышей будут добавляться без проблем, но битвазацикливаетсяКогда я вижу в консоли браузера файл consol.log о выигрышной игре, я вижу сотни результатов из результата, и через несколько секунд игра возвращает ошибку «Uncaught RangeError: Превышен максимальный размер стека вызовов».И теперь мне нужна помощь по этому поводу.Как я могу это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...