Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Problemino snake in c#

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11

    Problemino snake in c#

    Salve ragazzi e buone feste! Come da titolo come compito scolastico devo creare il giochetto snake in c#(visuale). Premetto che sto usando visual studio 2010 ho utilizzato dei oggetti semplici per il mio gioco.Infatti come campo di gioco ho usato un panel, la mela è una picturebox quadrata e il serpente è una picturebox quadrata anch'esso. Per i movimenti e tutto apposto(interagiscono con le freccette attraverso l'evento keydown della form),l'intercettazione della mela con il serpete funiona inceremtantomi la label che mostra il punteggio e rigenerand ogni volta una nuova Location della mela a random.
    Ma ora qui mi sorge il problema di come incrementare il serpente e di seguito controllare la collisione del serpente su se stesso. Ce qualcuno che mi potrebbe illuminare su come eseguire questi due passaggio,xk io avevo pensato lavorare con le "Location" delle picturebox del serpente ma credo che diventerebbe troppo laborioso...
    Grazie mille in anticipo!

  2. #2
    Io separerei l'elaborazione "logica" da quella grafica. Cioè prima cercherei di far funzionare il gioco dentro una struttura dati, poi cercherei di dare un "vestito" grafico ai dati.
    Per quanto riguarda la parte dati, io proverei ad usare un array di Point, dove conservare le coordinate x,y di ogni singolo pezzetto dello snake. Così facendo non è difficile determinare la collisione dello snake con se stesso: basta infatti verificare che la coordinata della testa coincida con una delle coordinate del corpo. Le mele le metterei in un altro array di Point, facilitando anche in questo caso la rilevazione di collisione.
    Una volta realizzata correttamente la parte dati andrei a implementare il paint di una PictureBox o di un Panel.
    Chi non cerca trova.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11
    Ok dai provero a far qualcosa caso mai se ho problemi mi rifarò sentire

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11
    Ho un problemino,come hai detto tu di creare un array di tipo Point dove salvo le cordinate x,y di ogni sigolo tassello del serpente,le cordinate x,y come glie le do? Cioe come faccio a ricavarmente una precisamente dietro un altra e poi in futuro aggiungere nuovi tasselli esattamente dietro a quelli vecchi...

  5. #5
    Immaginiamo che lo snake sia lungo 4 tasselli e abbia questa disposizione (la prima coordinata x, y è la testa):
    (5, 2), (4, 2), (3, 2), (2, 2)
    Quando il serpente avanza di una posizione è sufficiente determinare la nuova posizione della testa (calcolata in base alla posizione precedente e al verso) e inserirla come primo elemento dell'array, eliminando l'ultimo. Supponiamo per semplicità che il serpente si muova verso destra (asse x positivo):
    (6, 2), (5, 2), (4, 2), (3, 2)

    Quando il serpente "mangia" la mela esso si allunga per esempio di tre tasselli. L'allungamento va fatto nei successivi tre avanzamenti, incrementando ogni volta la lunghezza dell'array:
    (7, 2), (6, 2), (5, 2), (4, 2), (3, 2)
    (8, 2), (7, 2), (6, 2), (5, 2), (4, 2), (3, 2)
    (9, 2), (8, 2), (7, 2), (6, 2), (5, 2), (4, 2), (3, 2)
    Chi non cerca trova.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11
    Grazie della risp.. Ora che ci penso hai ragione facendo cosi dovrei tribulare meno.. Pero invece di usare un array siccome non sappiamo a priori la grandezza del snake che assumerà va bene se uso una lista di Point?

  7. #7
    Si dovrebbe andare bene!
    Chi non cerca trova.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11
    Ciao tas.. Eccomi di nuovo ho fatto come mi hai detto tu e ci sono riuscito interpretando la struttura dati come mi hai detto tu pero ora mi ritrovo che quando inizio a mangiare abbastanza mele e il serpente si ingrandisce sempre piu,noto che la velocità di spostamento del serpente cala drasticamente piu si mangia...
    Qualche idea per risolvere cio?

  9. #9
    Per sfizio ho provato a scrivere l'applicazione (in VB.NET) e non noto particolari rallentamenti (nel mio esempio incremento 5 unità ad ogni mela e sono arrivato tranquillamente a 30 mele). Posta il codice che vediamo.
    Chi non cerca trova.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    11
    codice:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Windows.Forms;
    
    
    
    namespace TurboSnake
    {
        public partial class gamefrm : Form
        {
            public gamefrm()
            {
                
                InitializeComponent();
            }
            private Random gen = new Random();
            private int punteggio=0,livello=1,bonus=0,vite=3,xmela,ymela,xserp,yserp;
            private List<Point> ciccio = new List<Point>();
            private List<PictureBox> corpo=new List<PictureBox>(); 
            private void gamefrm_Load(object sender, EventArgs e)
            {
                serpenteimg.Location = new Point(10, 10);
                punteggiolbl.Text = Convert.ToString(punteggio);
                livellolbl.Text = Convert.ToString(livello);
                vitelbl.Text = Convert.ToString(vite);
                do
                {
                    xmela = gen.Next(64 - 1) * 10;//genero posiione iniz. mela
                    ymela = gen.Next(47 - 1) * 10;
                } while (ymela == serpenteimg.Location.Y && xmela == serpenteimg.Location.X);
                melaimg.Location = new Point(xmela, ymela);
                ciccio.Add(new Point(5,5));//aggiunta la testa
                ciccio.Add(new Point(5,8));//aggiunto corpo
                ciccio.Add(new Point(5,11));//aggiunto corpo
                ciccio.Add(new Point(5,14));//aggiunta coda
                for (int i = 0; i < ciccio.Count; i++)
                {
                    PictureBox box=new PictureBox();// creo le immagini per il snake iniziali
                    corpo.Add(box);
                }
                disegna();
            }
            
            private bool su = false, giu = false, dx = false, sx = false;
            private void gamefrm_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Up)//intercetto tasto su
                {
                    timer2.Enabled = false;
                    timer3.Enabled = false;
                    timer4.Enabled = false;
                    timer1.Interval = 30;
                    timer1.Enabled = true;
                    if (su == false)
                    {
                        timer1.Tick += new EventHandler(timer1_Tick);
                        su = true; 
                    }
                }
                if (e.KeyCode == Keys.Down)//intercetto tasto giu
                {
                    timer1.Enabled = false;
                    timer3.Enabled = false;
                    timer4.Enabled = false;
                    timer2.Interval =30;
                    timer2.Enabled = true;
                    if (giu == false)
                    {
                        giu = true; 
                        timer2.Tick += new EventHandler(timer2_Tick);
                    }
                }
                if (e.KeyCode == Keys.Left)//intercetto tasto sin
                {
                    timer1.Enabled = false;
                    timer2.Enabled = false;
                    timer4.Enabled = false;
                    timer3.Interval =30;
                    timer3.Enabled = true;
                    if (sx == false)
                    {
                        sx = true;
                        timer3.Tick += new EventHandler(timer3_Tick);
                    }
                }
                if (e.KeyCode == Keys.Right)//intercetto tasto destr
                {
                    timer1.Enabled = false;
                    timer2.Enabled = false;
                    timer3.Enabled = false;
                    timer4.Interval =30;
                    timer4.Enabled = true;
                    if (dx == false)
                    {
                        dx = true;
                        timer4.Tick += new EventHandler(timer4_Tick); 
                    }
                }
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                xserp=ciccio[0].X;yserp=ciccio[0].Y;
                yserp-= 3;
                ciccio.Insert(0, new Point(xserp, yserp));//movimento
                ciccio.RemoveAt(ciccio.Count-1);
                disegna();
               mela_mang();
            }
            private void timer2_Tick(object sender, EventArgs e)
            {
                xserp=ciccio[0].X;yserp = ciccio[0].Y;
                yserp += 3;
                ciccio.Insert(0, new Point(xserp, yserp));//movimento
                ciccio.RemoveAt(ciccio.Count - 1);
                disegna();
                mela_mang();
            }
            private void timer3_Tick(object sender, EventArgs e)
            {
                xserp = ciccio[0].X;yserp= ciccio[0].Y;
                xserp -= 3;
                ciccio.Insert(0, new Point(xserp, yserp));//movimento
                ciccio.RemoveAt(ciccio.Count - 1);
                disegna();
               mela_mang();
            }
            private void timer4_Tick(object sender, EventArgs e)
            {
                xserp = ciccio[0].X; yserp=ciccio[0].Y;
                xserp += 3;
                ciccio.Insert(0, new Point(xserp, yserp));//movimento
                ciccio.RemoveAt(ciccio.Count - 1);
                disegna();
               mela_mang();
            }
            private void aggiungi()
            {
                PictureBox box = new PictureBox();
                corpo.Add(box);  
            }
    
            private void disegna()//assegno ogni punto un immagine
            {
               for(int i=0;i<ciccio.Count;i++)
               {
                   corpo[i].Location=ciccio[i];
                   corpo[i].Size=new Size(20,20);
                   corpo[i].BackColor = Color.LawnGreen;
                   corpo[i].Visible = true;
                   Controls.Add(corpo[i]);
                   corpo[i].BringToFront();
                   
               }
            }
            private void mela_mang()
            {
                if(melaimg.Bounds.IntersectsWith(corpo[0].Bounds))// se mangia mela
                {
                    punteggio += 5;
                    punteggiolbl.Text = Convert.ToString(punteggio);
                    xmela = gen.Next(10, terrenopnl.Width - 20);
                    ymela = gen.Next(10, terrenopnl.Height - 20);
                    melaimg.Location = new Point(xmela, ymela);
                    Application.DoEvents();// refresh form mela
                    incrementa_serp();
                    if (punteggio % 20 == 0)
                        livello++;
                    livellolbl.Text = Convert.ToString(livello);
                }
            }
            private void incrementa_serp()
            {  
                if (su == true)
                {
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 2# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 3# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
                }
                if (giu == true)
                {
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 2# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 3# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    yserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
                   
                }
                if (dx == true)
                {
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp += 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
                }
                if (sx == true)
                {
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
    
                    xserp = ciccio[ciccio.Count - 1].X; yserp = ciccio[ciccio.Count - 1].Y;
                    ciccio.Add(new Point(xserp, yserp));//aggiunga 1# tassello
                    xserp = ciccio[0].X; yserp = ciccio[0].Y;
                    xserp -= 3;
                    ciccio.Add(new Point(xserp, yserp));
                    ciccio.RemoveAt(ciccio.Count - 1);//spostamento
                    aggiungi();
                    disegna();
                }
            }
     
            private void melaimg_Click(object sender, EventArgs e)
            {
    
            }
    
            private void terrenopnl_Paint(object sender, PaintEventArgs e)
            {
            }
        }
    }
    Ecco qui il codice...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.