Faccio fatica a capire il tuo codice.
Perché usi 4 timer diversi? Perché usi le PictureBox? Sei partito bene usando la classe List, ma poi vai a gestire la dinamica del gioco appoggiandoti alle proprietà degli oggetti grafici che hai creato. Se per ogni segmento dello snake crei una PictureBox capisco perfettamente perché dopo poco il gioco rallenti!
Suggerimenti:
- usa solamente un Timer per effettuare lo spostamento dello snake e la gestione delle collisioni
- non usare le PictureBox per disegnare lo snake ma disegna direttamente sul Form, utilizzando l'evento Paint
- come ti avevo già detto in un post precedente cerca di tenere ben separate la gestione del gioco dalla sua rappresentazione grafica.
- usa la struttura Point per memorizzare le coordinate x, y di un'ipotetica griglia, di dimensioni prefissate
Ecco un ipotetico algoritmo.
Avvio del gioco
- inizializzo la lista (ciccio) con 4 segmenti contigui
- imposto la variabile direzione = 0 (vedi evento KeyDown)
- imposto la variabile punteggio = 0
- imposto la variabile allunga = 0 (vedi evento Tick)
- cerco una posizione casuale e libera per la mela
- avvio il Timer
Evento Tick del Timer
- se allunga > 0 aggiungo un elemento vuoto in coda alla lista ciccio e decremento allunga = allunga - 1
- determino la nuova coordinata x,y della testa, in base alla posizione attuale della testa e alla direzione
- controllo l'eventuale collisione col bordo (x < 0 | y < 0 | x > max_x | y > max_y): se avviene -> game over
- controllo l'eventuale autocollisione (basta iterare tra tutti gli elementi della lista ciccio): se avviene -> game over
- controllo l'eventuale collisione con la mela (testa.x = mela.x && testa.y = mela.y): se avviene imposto la variabile allunga = 5 (o altro valore a piacimento), incremento punteggio, determino una nuova posizione casuale per la mela
- inserisco la nuova testa all'inizio della lista ciccio, elimino l'ultimo elemento
- forzo il ridisegno dell'area del form (this.Invalidate())
Evento Paint
- disegno un cerchio pieno sulle coordinate della mela (metodo FillEllipse dell'oggetto e.Graphics)
- disegno un rettangolo pieno per ogni coordinata nella lista ciccio (metodo FillRectangle)
Le coordinate effettive degli oggetti grafici devono essere calcolate in proporzione all'area di disegno.
Evento KeyDown
- imposto la variabile "direzione" con un valore che dipende da quale tasto direzione ho premuto (per esempio 0=destra, 1=giù, 2=sinistra, 3=su)

Rispondi quotando
