using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;

namespace Snake
{
    class Plansza_Snake : Plansza
    {
        public enum kierunki { gora, dol, lewo, prawo };
        private Waz figura;
        public kierunki kierunek = kierunki.lewo;
        public bool gra = false;
        public bool pauza = false;
        public bool przedluz = false;
        public bool nowy_element = false;
        private Color kolor_nowych = Color.MediumSeaGreen;
        private Random losuj;

        public Plansza_Snake()
            : base()
        {
            figura = new Waz();
            losuj = new Random();
        }

        public Plansza_Snake(int a, int b)
            : base(a, b)
        {
            figura = new Waz();
            losuj = new Random();
        }

        public void nowywaz()
        {
            figura = new Waz();
            kierunek = kierunki.lewo;
            int i, j;
            foreach (Point buf in figura.punkty)
            {
                i = buf.X;
                j = buf.Y;
                siatka[i, j] = new kratka(i, j, figura.kolor);
                siatka[i, j].rysuj(g);
            }
            int[] rnd_wsp = new int[2];
            Point rnd_Punkt = losowe_wspolrzedne();
            siatka[rnd_Punkt.X, rnd_Punkt.Y] = new kratka(rnd_Punkt.X, rnd_Punkt.Y, kolor_nowych);
            siatka[rnd_Punkt.X, rnd_Punkt.Y].rysuj(g);
        }

        public void ruch()
        {
            LinkedListNode<Point> buf = figura.punkty.First;
            int x = buf.Value.X;
            int y = buf.Value.Y;
            int nowy_x, nowy_y;
            nowy_x = nowy_y = 0;
            bool zlapano_kratke = false;
            switch (kierunek)
            {
                case kierunki.dol:
                    nowy_x = x;
                    nowy_y = y + 1;
                    break;
                case kierunki.gora:
                    nowy_x = x;
                    nowy_y = y - 1;
                    break;
                case kierunki.lewo:
                    nowy_x = x - 1;
                    nowy_y = y;
                    break;
                case kierunki.prawo:
                    nowy_x = x + 1;
                    nowy_y = y;
                    break;
            }
            if (!sprawdzwymiary(nowy_x, nowy_y))
            {
                gra = false;
                return;
            }
            buf = buf.Next;
            if (siatka[nowy_x, nowy_y].czyzajeta())
            {
                if (siatka[nowy_x, nowy_y].getkolor() != kolor_nowych
                    && siatka[nowy_x, nowy_y] == siatka[buf.Value.X, buf.Value.Y])
                {
                    switch (kierunek)
                    {
                        case kierunki.dol: kierunek = kierunki.gora; break;
                        case kierunki.gora: kierunek = kierunki.dol; break;
                        case kierunki.lewo: kierunek = kierunki.prawo; break;
                        case kierunki.prawo: kierunek = kierunki.lewo; break;
                    }
                    ruch();
                    return;
                }
                else if (siatka[nowy_x, nowy_y].getkolor() == kolor_nowych)
                    zlapano_kratke = true;
                else
                {
                    gra = false;
                    return;
                }
            }
            figura.punkty.AddFirst(new LinkedListNode<Point>(new Point(nowy_x, nowy_y)));
            siatka[nowy_x, nowy_y] = new kratka(nowy_x, nowy_y, Color.Azure);
            siatka[nowy_x, nowy_y].rysuj(g);
            if (!nowy_element)
            {
                buf = figura.punkty.Last;
                siatka[buf.Value.X, buf.Value.Y].kasuj(g, BackColor);
                figura.punkty.RemoveLast();
            }
            else
            {
                Point rnd_Punkt = new Point();
                rnd_Punkt = losowe_wspolrzedne();
                siatka[rnd_Punkt.X, rnd_Punkt.Y].setkolor(kolor_nowych);
                siatka[rnd_Punkt.X, rnd_Punkt.Y].rysuj(g);
            }
            if (zlapano_kratke) nowy_element = true;
            else nowy_element = false;
        }

        public Point losowe_wspolrzedne()
        {
            Point p = new Point();
            do
            {
                p.X = losuj.Next(sz_ekranu - 1);
                p.Y = losuj.Next(wys_ekranu - 1);
            } while (siatka[p.X, p.Y].czyzajeta());
            return p;
        }
    }
}