Stránka 1 z 1

C# Snake

Napsal: 12 dub 2016 21:52
od bohmacek
Zdravím.
Mám jako projekt do školy udělat hada. Můj had je v poli pictureboxů 15x15 a 40x40 pixelů. Po stisknutí buttonu se naspawnuje pole a po stisknutí druhého tlačítka se mi spawne jídlo pro hada a taky had samotný. Had se pohybuje a je to 1 čtvereček. Když sní jídlo, dole se v labelu ukáže jeho délka. Ovšem nevím jak udělat optický pohyb tohoto hada. Programově se přičítá ( jeho délka ), ale opticky je to furt jenom jeden čtvereček. Posílám source a prosím vás o pomoc. Předem děkuji všem za vaše rady a podobně.

Zde je Form1

Kód: Vybrat vše

namespace HraSnake
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        PictureBox[,] pole = new PictureBox[15, 15];
        Random nahKulicka = new Random();
        Hat had;
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 15; i++)
            {
                for (int o = 0; o < 15; o++)
                {
                    PictureBox p = new PictureBox();
                    p.Width = 40;
                    p.Height = 40;
                    p.BackgroundImage = Image.FromFile("myluju.png");
                    p.Location = new Point(i * 40, o * 40);
                    p.BorderStyle = BorderStyle.Fixed3D;
                    pole[i, o] = p;
                    panel1.Controls.Add(pole[i, o]);

                }
            }
            button1.Visible = false;
            button3.Visible = true;
            had = new Hat(1, 3, 5);
            timer2.Start();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            timer2.Stop();
            string message = "Doopravdy chcete ukončit hru ?";
            string caption = "Form Closing";
            var result = MessageBox.Show(message, caption,
                                 MessageBoxButtons.YesNo,
                                 MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                this.Close();
            }
            if (result == DialogResult.No)
            {
                timer1.Start();
                timer2.Start();
            }

        }
        Image jidlo = Image.FromFile("lol.png");
        Image hadik = Image.FromFile("qwre.png");
        int r1 = 0;
        int r2 = 0;
        private void button3_Click(object sender, EventArgs e)
        {
             r1 = nahKulicka.Next(0, 15);
             r2 = nahKulicka.Next(0, 15);
            pole[r1, r2].Image = jidlo;
            for (int i = 0; i < had.Delka; i++)
            {
                pole[had.Zleva + i, had.Shora].Image = hadik;
            }
            button3.Enabled = false;
            button3.Visible = false;
            button2.Enabled = true;
            button2.Visible = true;
            had.Dolu = true;
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           

            if (had.Nahoru)
            {
               
                Zruseni(had.Zleva, had.Shora);
                had.Pohyb(0, -1);
                if (had.Shora < 0) had.Shora = 14;
                Hybani(0,-1);
            }

            if (had.Dolu)
            {
               
                Zruseni(had.Zleva, had.Shora);
                had.Pohyb(0, 1);
                if (had.Shora > 14) had.Shora = 0;
                Hybani(0,1);
            }
            if (had.Doleva)
            {
                Zruseni(had.Zleva, had.Shora);
                had.Pohyb(-1, 0);
                if (had.Zleva < 0) had.Zleva = 14;
                Hybani(-1,0);
            }
            if (had.Doprava)
            {
                Zruseni(had.Zleva, had.Shora);
                had.Pohyb(1, 0);
                if (had.Zleva>14) had.Zleva = 0;
                Hybani(1,0);
            }
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.W)
            {
                had.Dolu = false;
                had.Doleva = false;
                had.Doprava = false;
                had.Nahoru = true;
             


            }
            if (e.KeyCode == Keys.S)
            {
                had.Nahoru = false;
                had.Doleva = false;
                had.Doprava = false;
                had.Dolu = true;
               

            }
            if (e.KeyCode == Keys.D)
            {
                had.Dolu = false;
                had.Doleva = false;
                had.Nahoru = false;
                had.Doprava = true;
             
            }
            if (e.KeyCode == Keys.A)
            {
                had.Dolu = false;
                had.Nahoru = false;
                had.Doprava = false;
                had.Doleva = true;
             
            }
            if (e.KeyCode == Keys.Escape)
            {
                timer1.Stop();
                timer2.Stop();
                string message = "Doopravdy chcete ukončit hru ?";
                string caption = "Form Closing";
                var result = MessageBox.Show(message, caption,
                                     MessageBoxButtons.YesNo,
                                     MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    this.Close();
                }
                if (result == DialogResult.No)
                {
                    timer1.Start();
                    timer2.Start();
                }

            }

        }
       

        void Hybani(int kamX,int kamY)
        {
            try
            {
                    pole[had.Zleva , had.Shora].Image = hadik;
            }
            catch
            { }

        }
   

        void Zruseni(int x, int y)
        {

            pole[x,y].Image = null;
        }


        private void button2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.W)
            {
                had.Dolu = false;
                had.Doleva = false;
                had.Doprava = false;
                had.Nahoru = true;


            }
            if (e.KeyCode == Keys.S)
            {
                had.Nahoru = false;
                had.Doleva = false;
                had.Doprava = false;
                had.Dolu = true;


            }
            if (e.KeyCode == Keys.D)
            {
                had.Dolu = false;
                had.Doleva = false;
                had.Nahoru = false;
                had.Doprava = true;

            }
            if (e.KeyCode == Keys.A)
            {
                had.Dolu = false;
                had.Nahoru = false;
                had.Doprava = false;
                had.Doleva = true;

            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            label3.Text = "Souřadnice: " + had.Zleva + ", " + had.Shora + "     Delka hada:" + had.Delka;

            if (r1 == had.Zleva && r2 == had.Shora)
            {
                had.Delka++;
                r1 = nahKulicka.Next(0, 15);
                r2 = nahKulicka.Next(0, 15);
                pole[r1, r2].Image = jidlo;
            }
        }
    }
}

Zde je class Hat

namespace HraSnake

Kód: Vybrat vše

{
    class Hat
    {
        int delka;
        int zleva;
        int shora;
        bool nahoru = false;
        bool dolu = false;
        bool doprava = false;
        bool doleva = false;

        public int Delka
        {

            get
            {
                return delka;
            }

            set
            {
                delka = value;
            }
        }

        public int Zleva
        {
            get
            {
                return zleva;
            }

            set
            {
                zleva = value;
            }
        }

        public int Shora
        {
            get
            {
                return shora;
            }

            set
            {
                shora = value;
            }
        }

        public bool Nahoru
        {
            get
            {
                return nahoru;
            }
           
            set
            {
                dolu = false;
                doleva = false;
                doprava = false;
                nahoru = value;
            }
        }

        public bool Dolu
        {
            get
            {
                return dolu;
            }

            set
            {
               
                dolu = value;
            }
        }

        public bool Doprava
        {
            get
            {
                return doprava;
            }

            set
            {
               
                doprava = value;
            }
        }

        public bool Doleva
        {
            get
            {
                return doleva;
            }

            set
            {
               
                doleva = value;

            }
        }

        public Hat(int delka,int zleva, int shora)
        {
            this.Delka = delka;
            this.Zleva = zleva;
            this.Shora = shora;
        }

        public void Pohyb(int oKolikX, int oKolikY)
        {
            Zleva += oKolikX;
            Shora += oKolikY;
        }
     

    }
}]

Prosím o nekopírování, i když tento projekt je takový s prominutím SHIT, že by to nemělo smysl. Děkuji ještě jednou za vaše rady.

Re: C# Snake

Napsal: 12 dub 2016 22:09
od faraon
Ten zdroják zvýrazni pátým tlačítkem v první řadě, to je "Zobrazení kódu". Bude to přehlednější a zachováš původní formátování.

Když se ti ten tvůj čtvereček pohybuje, jak zajišťuješ že z předchozí pozice zmizí a na nové se objeví?

Co takhle místo jedněch souřadnic použít pole, a nechat zobrazovat vždy takový počet čtverečků, jaká je délka hada? Při pohybu se budou souřadnice posouvat v poli, a při prodloužení se prodlouží použitá část pole...

Re: C# Snake

Napsal: 13 dub 2016 09:13
od Eldan
Můžeš použít pole/seznam aktivních kusů hada jako souřadnice (o velikosti jako had), kde když se had nají tak poslední prvek neuberes, jinak budeš vždy všechny prvky posouvat.

Sent from my A0001 using Tapatalk