Ejemplo n.º 1
0
        private void ItsTimeForDisplay(object sender, EventArgs e)
        {
            if (!isStarted)
            { // ha nem indult el a játék, akkor ne csináljunk semmit
                return;
            }

            //meg kell jegyezni, hogy a kígyó feje hol van
            //ez egy rossz kód, mivel az eredeti példányra mutató kód referenciáját
            //veszi át, így az eredeti példányra mutat. Ha azt változtatom, akkor ez is változik
            //var currentPosition = snake.HeadPosition;

            //új példányt hozunk létre, így elváasztjuk a jelenlegi példányra mutató referenciától
            var currentPosition = new ArenaPosition(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            //ki kell számolni a következő pozíciót a fej iránya alapján
            switch (snake.HeadDirection)
            {
            case SnakeHeadDirectionEnum.Up:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Down:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition + 1;
                break;

            case SnakeHeadDirectionEnum.Left:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Right:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition + 1;
                break;

            case SnakeHeadDirectionEnum.InPlace:
                break;

            default:
                break;
            }

            //ki kell rajzolni a következő pozícióra a kígyó fejét
            //Kígyófej megjelenítése Circle ikonnal
            //A grid az általa tartalmazott elemeket egy gyűjteményen keresztül teszi elérhetővé
            //ez a gyűjtemény a Children
            //a gyűjtemény egy felsorolás, ahol az első elm a 0. indexő, a második az 1. indexű, és így tovább.
            //a 10. sor 10. elemét tehát így tudjuk elkérni a gyűjteménytől
            var cell = View.ArenaGrid.Children[snake.HeadPosition.RowPosition * 20 + snake.HeadPosition.ColumnPosition];
            //viszont ez egy általános IUElement típust ad vissza, bármi, ami belekerül a gridbe
            //ilyen elemként kerül bele
            var image = (FontAwesome.WPF.ImageAwesome)cell;

            //és már el tudom érni az ikon tulajdonságot
            image.Icon = FontAwesome.WPF.FontAwesomeIcon.Circle;

            //el kell tüntetni a korábbi pozícióról.
            cell       = View.ArenaGrid.Children[currentPosition.RowPosition * 20 + currentPosition.ColumnPosition];
            image      = (FontAwesome.WPF.ImageAwesome)cell;
            image.Icon = FontAwesome.WPF.FontAwesomeIcon.SquareOutline;
        }
Ejemplo n.º 2
0
        private void ItsTimeForDisplay(object sender, EventArgs e)
        {
            if (!isStarted)
            {            // ha még nem indult el a játék akor ne csináljon semmit
                return;
            }

            // meg kell jehyezni hol van a kígyó feje, ez lesz a "neck"

            //új példányt hozunk létre, mert nem egyszerűen egy létező helyzetet kell megjelníteni
            var neck = new ArenaPosition(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            // a kígyó magától mozog, a HeadDirection irányban ez alapján ki kell számolni a következő (fej)pozíciót
            switch (snake.HeadDirection)
            {
            case SnakeHeadDirectionEnum.Up:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Down:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition + 1;
                break;

            case SnakeHeadDirectionEnum.Left:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Right:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition + 1;
                break;

            case SnakeHeadDirectionEnum.InPlace:
                break;

            default:
                break;
            }
            ShowSnakeHead(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            ////a kígyó fejéből nyak lesz

            //cell = View.ArenaGrid.Children[neck.RowPosition * 20 + snake.HeadPosition.ColumnPosition];
            //image = (FontAwesome.WPF.ImageAwesome)cell;
            //image.Icon = FontAwesome.WPF.FontAwesomeIcon.SquareOutline;
        }
        private void ItsTimeForDisplay(object sender, EventArgs e)
        {
            if (!isStarted)
            { // ha nem indult el a játék, akkor ne csináljunk semmit
                return;
            }

            //meg kell jegyezni, hogy a kígyó feje hol van
            //ez egy rossz kód, mivel az eredeti példányra mutató kód referenciáját
            //veszi át, így az eredeti példányra mutat. Ha azt változtatom, akkor ez is változik
            //var currentPosition = snake.HeadPosition;

            //új példányt hozunk létre, így elváasztjuk a jelenlegi példányra mutató referenciától
            var neck = new ArenaPosition(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            //ki kell számolni a következő pozíciót a fej iránya alapján
            switch (snake.HeadDirection)
            {
            case SnakeHeadDirectionEnum.Up:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Down:
                snake.HeadPosition.RowPosition = snake.HeadPosition.RowPosition + 1;
                break;

            case SnakeHeadDirectionEnum.Left:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition - 1;
                break;

            case SnakeHeadDirectionEnum.Right:
                snake.HeadPosition.ColumnPosition = snake.HeadPosition.ColumnPosition + 1;
                break;

            case SnakeHeadDirectionEnum.InPlace:
                break;

            default:
                break;
            }

            //itt kéne tudni, hogy az új pozíció az vajon étel-e? vagy falnak mentünk-e?
            //falnak mentünk?
            if (snake.HeadPosition.RowPosition < 0 || snake.HeadPosition.RowPosition > RowCount - 1 ||
                snake.HeadPosition.ColumnPosition < 0 || snake.HeadPosition.ColumnPosition > ColumnCount - 1)
            { //falnak mentünk.
                EndOfGame();
                //mivel vége a játéknak, már nem csinálunk semmit.
                return;
            }


            //old school model
            //
            //var isCollosion = false;
            //foreach (var tailItem in snake.Tail)
            //{ // a farokpontokon végigmegyünk
            //    if (tailItem.RowPosition == snake.HeadPosition.RowPosition
            //        && tailItem.ColumnPosition == snake.HeadPosition.ColumnPosition)
            //    {
            //        isCollosion = true;
            //    }
            //}
            //if (isCollosion)
            //{ //ütköztünk
            //    EndOfGame();
            //}

            //beleharaptunk-e saját farkunkba?
            //az Any linq axtension az adott feltételt megvizsgálja a lista minden elemére, és ha
            //bármelyikre igaz, akkor true-val tére vissza, különben false-zal.
            //az x jelenti a lista egy adott elemét, ebben az esetben egy ArenaPosition-t ami a Tail listán van.
            if (snake.Tail.Any(x => x.RowPosition == snake.HeadPosition.RowPosition &&
                               x.ColumnPosition == snake.HeadPosition.ColumnPosition))
            { //ütköztünk
                EndOfGame();
                //mivel játék vége van, nem folytatjuk a megjelenítést
                return;
            }

            //ellenőrizni, hogy ettünk-e?
            //megpróbáljuk törölni az ételt az ételek közül
            var foodToDelete = foods.Remove(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            if (foodToDelete != null)
            {
                //ettünk
                //a kígyó feje el fogja tüntetni az ételt, a gridről
                //így csak adminisztrálnunk kell.

                //A Canvasról viszont nekünk kell törölnünk.
                EraseFromCanvas(foodToDelete.Paint);
                //számoljuk, hogy mennyit ettünk
                foodsHaveEatenCount = foodsHaveEatenCount + 1;

                //eggyel nőjön a kígyó hossza
                snake.Length = snake.Length + 1;

                //és gyorsuljon is

                //megjelenítjük, hogy mennyit ettünk
                View.NumberOfMealsTextBlock.Text = foodsHaveEatenCount.ToString();

                //generálunk egy új ételt
                GetNewFood();
            }


            var paintHead = ShowSnakeHead(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            //mielőtt elmentjük az fejet azelőtt kell a régit törölni
            EraseFromCanvas(snake.HeadPosition.Paint);

            snake.HeadPosition.Paint = paintHead;

            //a kígyó fejébő nyak lesz, ennek megfelelően kell megjeleníteni
            var paintNeck = ShowSnakeNeck(neck.RowPosition, neck.ColumnPosition);

            //viszont, a farok adataihoz a nyaknak hozzá kell adódnia.
            snake.Tail.Add(new CanvasPosition(neck.RowPosition, neck.ColumnPosition, paintNeck));

            //amíg a kígyó hossza (Tail.Count) kevesebb, mint a kígyó hossza (Tail.Length) :)
            if (snake.Tail.Count < snake.Length)
            { //addig MEGJELENÍTÉSHEZ nem csinálunk semmit, a kígyó húzza a csóváját
            }
            else
            { //a kígyó "előbújt", nem kell, hogy hosszabb legyen, a kígyó legvégét törölni kell
                //kell az információ, hogy eltüntessük a képernyőről
                //Az ábrán látszik, hogy a kígyó legvége mindig az első listaelem
                var end = snake.Tail[0];
                //meg kell jeleníteni erre az elemre a tábla rajzot (=eltüntetjük a tábláról)
                ShowEmptyArenaPosition(end.RowPosition, end.ColumnPosition, end.Paint);
                //majd az adatok közül is töröljük
                snake.Tail.RemoveAt(0);
            }
        }
Ejemplo n.º 4
0
 public Snake(int rowPosition, int columnPosition)
 {
     HeadPosition  = new ArenaPosition(rowPosition, columnPosition);
     HeadDirection = SnakeHeadDirectionEnum.InPlace;
 }