示例#1
0
 public Snake(int rowPosition, int columnPosition)
 {
     //ilyenkor (a jatek elejen) nincs megjelenitve semmi, igy nincs ilyen adatunk, ezert a null
     HeadPosition = new ArenaPosition(rowPosition, columnPosition);
     Heading      = SnakeHeadingEnum.InPlace;
     Length       = 6;
     //gondoskodom arrol, hogy a lista valtozom listat tartalmazzon, nehogy
     //object reference null kivetel tortenjen
     //https://netacademia.blog.hu/2017/05/30/miert_ne_hasznaljunk_null-t
     Tail = new List <ArenaPosition>();
 }
示例#2
0
        private void ItsTimeForDisplay(object sender, EventArgs e)
        {
            if (!isStarted || isGameOver)
            {
                return;
            }
            //Meg kell jegyezni, hogy a kigyo feje hol van
            //Ez hibas megoldas, mert a currentPosition ugyanarra az objektumra fog mutatni, azaz nem taroltuk el az eredeti erteket!!!
            //var currentPosition = snake.HeadPosition;

            //Igy mar helyesen mukodik a regi ertek mentese egy uj peldanyba
            var neck = new ArenaPosition(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            //Ki kell szamolni a kovetkezo poziciot a fej iranya alapjan
            switch (snake.Heading)
            {
            case SnakeHeadingEnum.Up:
                snake.HeadPosition.RowPosition -= 1;
                break;

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

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

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

            case SnakeHeadingEnum.InPlace:
                break;

            default:
                break;
            }

            //Megvan a fej uj pozicioja. Meg a megjelenites elott ellenorizni kell, hogy:
            //falnak mentunk-e?
            if (snake.HeadPosition.RowPosition < 0 ||
                snake.HeadPosition.RowPosition > RowCount - 1 ||
                snake.HeadPosition.ColumnPosition < 0 ||
                snake.HeadPosition.ColumnPosition > ColumnCount - 1)
            {//Jatek vege
                EndOfGame();
                //Mivel vege a jateknak, nem csinalunk mar semmit
                return;
            }

            //Sajat farkunkba haraptunk -e?

            //old school
            //var collision = false;
            //foreach (var tailitem in snake.Tail)
            //{//Vegigmengyunk a farokpontokon, ellenorizzuk, hogy az uj fej poz, egyezik -e?
            //    if (tailitem.RowPosition == snake.HeadPosition.RowPosition && tailitem.ColumnPosition == snake.HeadPosition.ColumnPosition)
            //    {
            //        collision = true;
            //    }
            //}
            //if (collision)
            //{//utkoztunk
            //    EndOfGame();
            //}

            //LINQ megoldas
            if (snake.Tail.Any(x => x.RowPosition == snake.HeadPosition.RowPosition &&
                               x.ColumnPosition == snake.HeadPosition.ColumnPosition))
            {//utkoztunk
                EndOfGame();
                return;
            }

            if (score < 1)
            {
                EndOfGame();
                return;
            }
            //ellenorini, hogy ettunk -e? Kigyo feje vs etelek listaja
            //megprobaljuk torolni az etelt az etelek kozul
            var foodToDelete = foods.Remove(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            if (foodToDelete != null)
            {
                //ettunk: a kigyo feje el fogja tuntetni az etelt a gridrol
                //igy csak adminisztralnunk kell
                ScoringAndPenalty(foodToDelete);

                //egyek nojon a kigyo hossza
                snake.Length++;

                //es gyorsuljon is
                StartPendulum();
                //megjelenitjuk, hogy mennyit ettunk
                View.NumberOfMealsTextBlock.Text = score.ToString();

                //generalunk uj eteleket
                GetNewFood(2);
            }
            ShowSnakeHead(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            //A kigyo fejebol nyak lesz, ennek megfeleloen kell megjeleniteni
            ShowSnakeNeck(neck.RowPosition, neck.ColumnPosition);
            //Viszont, a farok adataihoz a nyaknak hozza kell adodnia
            snake.Tail.Add(new ArenaPosition(neck.RowPosition, neck.ColumnPosition));

            //Amig a kigyo hossza kisebb, mint aminek lennie kellene
            if (snake.Tail.Count < snake.Length)
            {//addig nem csinalunk semmit, hadd "novekedjen"
            }
            else
            {//Mar megvan a teljes hossz, ne legyen hosszabb; a kigyo legveget torolni kell, ami az elso elem a listaban
                //Meg torles elott kell az info, hogy melyik ArenaPozicioban van, hogy oda visszarakjuk az eredeti racsot
                var end = snake.Tail[0];
                ShowEmptyArenaPosition(end.RowPosition, end.ColumnPosition);
                //majd az adatk kozul is toroljuk
                snake.Tail.RemoveAt(0);
            }
            UpdateFoods();
        }