C# Snake - problem z przyrostem długości węża

0

Witam. Mam pewien problem z grą Snake otóż owy problem dotyczy przyrostu długości węża po zjedzeniu jedzenia. Długość węża powinna się powiększać. Mam taką klasę Snake:

public class Snake
    {
        public Rectangle[] snakeRec;
        public SolidBrush brush;
        private int x, y, szer, dl;


        public Snake()
        {
            snakeRec = new Rectangle[3];
            brush = new SolidBrush(Color.Blue);

            x = 20;
            y = 0;
            szer = 10;
            dl = 10;

            for (int i = 0; i < snakeRec.Length; i++)
            {
                snakeRec[i] = new Rectangle(x, y, szer, dl);
                x -= 10;
            }
        }

        public void rysujSnake(Graphics plansza)
        {
            foreach (Rectangle rec in snakeRec)
            {
                plansza.FillRectangle(brush, rec);
            }
        }

        public void rysujSnake()
        {
            for (int i = snakeRec.Length - 1; i > 0; i--)
            {
                snakeRec[i] = snakeRec[i - 1];
            }
        } 

Oraz w Form1:

public partial class Form1 : Form
    {
        Random randŻarcie = new Random();
        Graphics plansza;
        Snake snake=new Snake();
        Żarcie żarcie;

        bool left = false;
        bool right = false;
        bool down = false;
        bool up = false;
        int punkty = 0;
        double level = 1;
        int wartosc = 0;

        public Form1()
        {
            InitializeComponent();
            żarcie = new Żarcie(randŻarcie);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 3;

            plansza = e.Graphics;
            żarcie.rysujŻarcie(plansza);
            snake.rysujSnake(plansza);

            for (int i = 0; i < snake.snakeRec.Length; i++)
            {
                if (snake.snakeRec[i].IntersectsWith(żarcie.żarcieRec))
                {
                   //tutaj chciałam umieścić właściwy kod ale coś poknociłam

                    punkty++;
                    żarcie.żarcieLocation(randŻarcie);

                    label1.ForeColor = Color.Blue;
                    label1.Text = punkty.ToString();

                    if (punkty % 3 == 0)
                    {
                        label4.ForeColor = Color.Red;
                        label4.Text = ("new");
                        level++;
                        progressBar1.Value = 0;

                    }
                    else
                    {
                        label4.ForeColor = Color.Blue;
                        label4.Text = level.ToString();
                        progressBar1.Value = punkty % 3;
                    }
                }
            } 
0

Według mnie najlepszym sposobem było by zamienienie tablicy snakeRec na listę, i późniejsze używanie snakeRec.Add( ... ) dla dodawania kolejnych segmentów. Rozumiem, że reszta gry działa w porządku, bo pytałeś tylko o samo dodawanie? :)

0

Tak działa poprawnie. Nie zabardzo znam się na listach generycznych. Nie da się tego zrobić w prostszy sposób?

1
Monika89ers napisał(a):

Tak działa poprawnie. Nie zabardzo znam się na listach generycznych. Nie da się tego zrobić w prostszy sposób?

Da się bez list, ale... Bez znajomości list daleko nie zajdziesz.

Działanie list:

List<int> li = new List<int>(); // stworzenie listy
li.Add(4); // dodanie elementu do listy;
for(int i = 0; i < li.Count; i++) {} // iterowanie po liście wersja 1
foreach(int elem in li) {} // iterowanie po liście wersja 2

Ty zamiast intów używasz Rectangle.

1

A ja bym poszedl jeszcze o krok dalej i zamiast uzywac listy do przechowywania weza sprobowalbym z kolejka (http://msdn.microsoft.com/en-us/library/system.collections.queue%28v=vs.90%29.aspx), ktorej koniec bylby "glowa" weza. Dzieki takiemu podejsciu przesuniecie weza polega na wykonaniu dwoch operacji na kolejce: zdjecie (Dequeue) elementu z poczatku kolejki (przesuniecie ogona) oraz dodania (Enqueue) nowego elementu na koniec kolejki (przesuniecie glowy weza). W przypadku zjedzenia zarcia wystarczy tylko zrobic Enqueue bez robienia Dequeue i waz sie wydluzy.
Kolejka implementuje interfejs IEnumerable dzieki czemu do rysowaniu weza mozna uzyc foreach :)

0

Ogólnie lista jest tym samym, co tablica, z tym, że jej typ określa się podaniem typu w nawiasach ostrych. Korzystać można z nich tak samo jak z tablic - odnosimy się do elementów za pomocą indeksatorów (nawiasy kwadratowe), wielkość odczytujemy z pola Length lub właściwości Count, elementy dodajemy przez Add oraz AddRange, usuwamy analogocznie przez Remove lub RemoveRange, ich użycie jest dość intuicyjne i sporo nam o nich podpowie intellisense. Jak napisał kolega MSM, daleko bez znajomości list nie zajdziesz :) Polecam troszkę się w nich podszkolić, temat nie jest zbyt obszerny, a jest bardzo, ale to bardzo warty jego poznania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1