2017-08-13 6 views
0

Donc j'essaye d'utiliser une boucle while pour que mon programme trouve un chemin à travers un tableau 8x8. Cependant, au lancement, Unity cesse de répondre et doit être fermé. Quelqu'un peut-il aider à expliquer pourquoi mon code ne fonctionne pas, car je ne vois rien de mal à le faire lorsque la condition de fin de la boucle est modifiée. Voici le code source:Pendant que la boucle provoque le blocage d'Unity

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class LevelGenerator : MonoBehaviour { 

public int counter = 0; 
int LevelX = 0; 
int LevelY = 0; 

int[,] LevelData = new int[8,8]{ 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0}, 
    {0,0,0,0,0,0,0,0} 
}; 

void Start() { 
    Generate(); 
} 

void RandomPath(){ 
    int NewDirection = Random.Range(0,3); 
    if(NewDirection==0){ 
     if(LevelX!=0){ 
      if(LevelData[LevelX-1,LevelY]==0){ 
       counter++; 
       LevelData[LevelX-1,LevelY]=counter; 
       LevelX=LevelX-1; 
      } 
     } 
    }else if(NewDirection==1){ 
     if(LevelX!=7){ 
      if(LevelData[LevelX+1,LevelY]==0){ 
       counter++; 
       LevelData[LevelX+1,LevelY]=counter; 
       LevelX=LevelX+1; 
      } 
     } 
    } 
    else if(NewDirection==2){ 
     if(LevelY!=7){ 
      if(LevelY!=0){ 
       if(LevelData[LevelX,LevelY-1]==0){ 
        counter++; 
        LevelData[LevelX,LevelY+1]=counter; 
        LevelY=LevelY+1; 
       } 
      }else{ 
       counter++; 
       LevelData[LevelX,LevelY+1]=counter; 
       LevelY=LevelY+1; 
      } 
     } 
    } 
} 

void Generate(){ 
    //picks a random location for the level to start and the second room, then generates a random path to the bottom of the level 
    int LevelStartX = Random.Range(0,8); 
    int LevelStartY = Random.Range(0,5); 
    counter++; 
    LevelData[LevelStartX,LevelStartY] = counter; 
    Debug.Log(LevelStartX); 
    Debug.Log(LevelStartY); 
    int Direction = Random.Range(0,3); 
    if(Direction==0){ 
     if(LevelStartX==0){ 
      counter++; 
      LevelData[LevelStartX+1,LevelStartY]=counter; 
      LevelX = LevelStartX+1; 
      LevelY = LevelStartY; 
     }else{ 
      counter++; 
      LevelData[LevelStartX-1,LevelStartY]=counter; 
      LevelX = LevelStartX-1; 
      LevelY = LevelStartY; 
     } 
    }else if(Direction==1){ 
     if(LevelStartX==7){ 
      counter++; 
      LevelData[LevelStartX-1,LevelStartY]=counter; 
      LevelX = LevelStartX-1; 
      LevelY = LevelStartY; 
     }else{ 
      counter++; 
      LevelData[LevelStartX+1,LevelStartY]=counter; 
      LevelX = LevelStartX+1; 
      LevelY = LevelStartY; 
     } 
    }else{ 
     counter++; 
     LevelData[LevelStartX,LevelStartY+1]=counter; 
     LevelX = LevelStartX; 
     LevelY = LevelStartY+1; 
    } 
    while(LevelY!=7 || counter!=32){ 
     RandomPath(); 
    } 
} 
} 
+1

Cela arrive parce que 'LevelY' est ** jamais ** égal à' 7' et 'counter' est ** jamais ** égal à' 32' donc vous obtenez une boucle infinie. – Programmer

+0

Mais le compteur est incrémenté la plupart des itérations de la boucle et LevelY est augmenté quand NewDirection est égal à 2 et l'espace au-dessus de l'actuel a un zéro dedans. – DoYouEvenFish

+0

@DoYouEvenFish Testing est facile. Mettez un point d'arrêt après votre boucle while et exécutez votre code –

Répondre

0

J'ai vérifié votre code et j'ai découvert que le compteur n'atteint jamais 32 (ou au moins habituellement). C'est probablement parce que vous utilisez des nombres aléatoires, il s'arrête à un nombre différent chaque fois que vous l'exécutez, donc il y a une petite chance que cela fonctionne réellement