"castrare" array a due dimensioni

vorrei programmare snake per andare su una matrice di led 8x8

per farlo contavo di avere una matrice byte a due dimensioni, nella quale ad ogni avanzamento del serpente tolgo 1 ai valori in essa contenuta, incremento le variabili della posizione del serpente e nelle cordinate delle variabili scrivo la lunghezza del serpente.

spero di essermi spiegato :grin:

il problema quale è?

è che io ho un altra matrice byte ad una dimensione nella quale scrivo quale pixel devono essere illuminati.

non riesco a fare si che se il valore contenuto nell array in 2D sia diverso da 0 i pixel si accendano.

avevo innestato due for per farlo, una cosa come:

void convert()
  {
    for(byte x; x<8;x++)
      {
        for(byte y; y<8;y++)
          {
            if(array[x][y] != 0)
              bitSet(buff[x],y);
             else
              bitClear(buff[x],y);
          }   
      }
  }

ma non funziona ed ho gia esaurito le idee :stuck_out_tongue:

grazie della disponibilità ;D

if ( array[y][x] )
{
    buff[y] |= 1 << x;
}
else
{
    buff[y] &= ~(1 << x);
}

cerca di usare le matrici secondo la forma yx e non xy.

in teoria ti basta il vettore a bit che contenga la mappa del gioco, 6variabili per XY snake/coda/testa e XY cibo.
Quindi setti sulla mappa lo snake a due punti con le coordinate in testa e coda, metti il punto con le relative coordinate nella variabile.
ora mettiamo che vai a destra azzeri il bit della coda cerchi nei contorni di Moore la nuova posizione della coda, controlli se il bit sucessivo alla testa sia valido o mebo, setti il bit a destra della testa infine incrementi la posizione della testa.

Secondo me non hai bisogno di un array bidimensionale ma solo di un arrai monodimensionale a 8 elementi.
La posizione del serpente lo decodifichi con un bit nel Byte di ogni elemento, come viene usato anche per pilotare un MAX7219 in modalitá matrice.

Ciao Uwe.

@vbextreme mi dispiace deluderti ma non funziona :grin:

nel loop principale ho impostato array[4][4] = 3, ma sul dot matrix rimane tutto spento.

riguardo al procedimento da te suggerito, non mi pare possa funzionare, poiche nel caso in cui il serpente faccia una u non saprei quale bit andare ad azzerare

@uwefed temo di non aver capito.

io ho due array, uno byte monodimensionale che uso come buffer per i due 74hc595 (niente MAX7219), e un altro in cui pensavo di salvare il numero di "spostamenti" da fare prima che il pixel diventi 0.

vi prego! aiutatemi!

non vedendo errori ho provato a eliminare il secondo for, andando quindi a creare 8 if uno dopo l'altro.

e così funziona!

void convert()
  {
    for(byte x; x<8;x++)
      {
            if ( array[0][x] )
                buff[0] |= 1 << x;
            else
                buff[0] &= ~(1 << x);
            if ( array[1][x] )
                buff[1] |= 1 << x;
            else
                buff[1] &= ~(1 << x);
             if ( array[2][x] )
                buff[2] |= 1 << x;
            else
                buff[2] &= ~(1 << x); 
              if ( array[3][x] )
                buff[3] |= 1 << x;
            else
                buff[3] &= ~(1 << x);
                if ( array[4][x] )
                buff[4] |= 1 << x;
            else
                buff[4] &= ~(1 << x);
                if ( array[5][x] )
                buff[5] |= 1 << x;
            else
                buff[5] &= ~(1 << x);
                if ( array[6][x] )
                buff[6] |= 1 << x;
            else
                buff[6] &= ~(1 << x);
                if ( array[7][x] )
                buff[7] |= 1 << x;
            else
                buff[7] &= ~(1 << x);
      }
  }

sapreste dirmi perche cosi funziona, ed invece prima no?

void convert()
{
    for(byte y = 0; y < 8; ++y)
    {
        for( byte x = 0; x < 8; ++x)
        {
            if ( array[y][x] )
                buff[y] |= 1 << x;
            else
                buff[y] &= ~(1 << x);
        }
    }
}

Il principale problema è che non hai inizializzato le variabili x e y a 0.
Pertanto ti consiglio di abilitare i warning del compilatore e di usare la dichiaazione delle variabili in stile C

void convert()
{
    byte y;
    for( y = 0; y < 8; ++y)
    {
        byte x;
        for( x = 0; x < 8; ++x)
        {
            if ( array[y][x] )
                buff[y] |= 1 << x;
            else
                buff[y] &= ~(1 << x);
        }
    }
}

Non avevo mica pensato alla U.....ahahahah

grazie mille! ho fatto l'upload e funziona