Go Down

Topic: "castrare" array a due dimensioni (Read 698 times) previous topic - next topic

boschi

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  :smiley-mr-green:

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:

Code: [Select]
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  :smiley-razz:

grazie della disponibilità  ;D

vbextreme

Code: [Select]


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.
Easy framework linguaggio C: https://github.com/vbextreme/EasyFramework
Hack your life: http://vbextreme.netai.net/
Unoffical Telegram group: https://telegram.me/joinchat/ALRu8ACkdTdXyz-2P7v13A

uwefed

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.

boschi

#3
Dec 08, 2015, 02:40 pm Last Edit: Dec 08, 2015, 02:41 pm by boschi
@vbextreme mi dispiace deluderti ma non funziona  :smiley-mr-green:

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.

boschi

#4
Dec 08, 2015, 05:07 pm Last Edit: Dec 08, 2015, 05:35 pm by boschi
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!

Code: [Select]
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?

vbextreme

#5
Dec 09, 2015, 02:10 pm Last Edit: Dec 09, 2015, 02:11 pm by vbextreme
Code: [Select]

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
Code: [Select]

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
Easy framework linguaggio C: https://github.com/vbextreme/EasyFramework
Hack your life: http://vbextreme.netai.net/
Unoffical Telegram group: https://telegram.me/joinchat/ALRu8ACkdTdXyz-2P7v13A

boschi

grazie mille! ho fatto l'upload e funziona

Go Up