2011-07-22 6 views
2

Je suis en train de construire un jeu de casse-brique. Mon code utilise deux tableaux 2D, l'un contenant des index de couleur (1 - 6) pour représenter les cercles colorés, et un autre indiquant si le cercle a été sélectionné (1 ou 0). Je peux sélectionner avec succès un cercle, la bonne valeur dans le deuxième tableau change et ceci est reflété correctement à l'écran.Sélectionnez toutes les valeurs adjacentes dans un tableau multidimensionnel

C'est la méthode qui sélectionne un cercle et quatre cercles adjacents. Je passe les coordonnées X et Y que l'utilisateur a sélectionnées sur la grille. Je mets cette position choisie (de 0 à 1 dans le tableau SelectedCircles. Vérifiez si l'un des côtés a un cercle avec la même couleur, le cas échéant, changer ce cercle choisi aussi.

private void SelectSurroundingCircles(int xPosition, int yPosition) 
    { 
     SelectedCircles[yPosition, xPosition] = 1; 
     int colorKey = Circles[yPosition, xPosition]; 

     int increment = 1; 
     for (int i = 0; i < Nickles.Length; i++) 
     { 
      if (Circles[yPosition - increment, xPosition] == colorKey) 
       SelectedCircles[yPosition - increment, xPosition] = 1; // TOP 

      if (Circles[yPosition + increment, xPosition] == colorKey) 
       SelectedCircles[yPosition + increment, xPosition] = 1; // BOTTOM 

      if (Circles[yPosition, xPosition + increment] == colorKey) 
       SelectedCircles[yPosition, xPosition + increment] = 1; // RIGHT 

      if (Circles[yPosition, xPosition - increment] == colorKey) 
       SelectedCircles[yPosition, xPosition - increment] = 1; // LEFT 
     } 
    } 

Ce que je veux Pour réaliser, tous les cercles de la même couleur qui sont les uns à côté des autres sont sélectionnés: vous regardez d'abord les cercles adjacents comme ci-dessus, regardez leurs cercles adjacents, et ainsi de suite ... ne pouvait pas comprendre. Espérons que quelqu'un peut me aider, je dois être sur quelque chose.

Merci.

Répondre

1

Je ne sais pas ce fullfills votre logique de sélection exacte, mais est récursion pas la solution:

if (SelectedCircles[yPosition - increment, xPosition] != 1 && Circles[yPosition - increment, xPosition] == colorKey) { 
    SelectSurroundingCircles(xPosition, yPosition - increment) 
} 
//... same for other 3 directions 

Le contrôle supplémentaire si la position n'est pas sélectionné est déjà important pour éviter la récursivité sans fin

+0

Le problème est que je ne vérifie pas seulement les cercles supérieur, gauche, inférieur et droit. Je dois aussi vérifier les cas en haut à gauche, en haut à droite, en bas à gauche et en bas à droite, ce qui me donne des maux de tête. J'ai essayé tant de choses sans chance -_- – Nick

+0

Donc vous avez besoin de 8 contrôles au total (NW, N, NE, E, SE, S, SW, W) N'est-ce pas 4 ifs de plus que vous avez maintenant et c'est fait? – Eddy

+0

ne fonctionne pas pour moi. Seules les 8 premières enceintes sont vérifiées, puis le motif commence à devenir fou. – Nick

0

Nevermind je l'ai résolu moi-même. J'ai vérifié contre le tableau des cercles sélectionnés, cela a fonctionné.

  for (int y = 0; y < SelectedCircles.GetLength(0); y++) 
      { 
       for (int x = 0; x < SelectedCircles.GetLength(1); x++) 
       { 
        if (SelectedCircles[y, x] == 1) 
        { 
         if (y - 1 >= 0 && SelectedCircles[y - 1, x] != 1 && Circles[y - 1, x] == colorKey) 
          SelectedCircles[y - 1, x] = 1; // TOP 

         if (y + 1 <= 9 && SelectedCircles[y + 1, x] != 1 && Circles[y + 1, x] == colorKey) 
          SelectedCircles[y + 1, x] = 1; // BOTTOM 

         if (x + 1 <= 9 && SelectedCircles[y, x + 1] != 1 && Circles[y, x + 1] == colorKey) 
          SelectedCircles[y, x + 1] = 1; // RIGHT 

         if (x - 1 >= 0 && SelectedCircles[y, x - 1] != 1 && Circles[y, x - 1] == colorKey) 
          SelectedCircles[y, x - 1] = 1; // LEFT 
        } 
       } 
      } 
     } 
Questions connexes