Example #1
0
        // Resolves soma task for snake to go ahead.
        private void ItsTimeToDisplay(object sender, EventArgs e)
        {
            if (!isStarted || isReStarted)
            {
                return;
            }

            // clac the head next position
            switch (snake.HeadDirection)
            {
            case SnakeHeadDirectionEnum.Up:
                snake.HeadPosition.RowPosition -= 1;
                break;

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

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

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

            case SnakeHeadDirectionEnum.InPlace:
                break;

            default:
                break;
            }

            //check if the snake crash into the wall
            if (snake.HeadPosition.RowPosition < 0 || snake.HeadPosition.RowPosition > RowCount - 1 ||
                snake.HeadPosition.ColumnPosition < 0 || snake.HeadPosition.ColumnPosition > ColumnCount - 1)
            {
                EndOfGame();
                return;
            }

            //check if the snake crash into itself
            if (snake.Tail.Any(x => x.RowPosition == snake.HeadPosition.RowPosition && x.ColumnPosition == snake.HeadPosition.ColumnPosition))
            {
                EndOfGame();
                return;
            }

            //check if the snake aet a food
            //if (foods.FoodPositions.Any(x=>x.RowPosition == snake.HeadPosition.RowPosition && x.ColumnPosition == snake.HeadPosition.ColumnPosition)) {

            var foodToDelete = foods.Remove(snake.HeadPosition.RowPosition, snake.HeadPosition.ColumnPosition);

            if (foodToDelete != null)
            {
                EraseFromCanvas(foodToDelete.Paint);

                foodsHaveEatenCount += 1;
                View.NumberOfMealsTextBlock.Text = foodsHaveEatenCount.ToString();

                snake.Length += 1;
                GetNewFood();
            }

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

            //we have to delete the old head position befor we save the new head position.
            EraseFromCanvas(snake.HeadPosition.Paint);
            //we save the new head position into the HeadPosition.
            snake.HeadPosition.Paint = paintHead;

            // head of snake will change to neck !
            var neckPaint = ShowSnakeNeck(snake.HeadPositionOld.RowPosition, snake.HeadPositionOld.ColumnPosition);

            //var neckPaint = ShowSnakeNeck(snake.HeadPosition.RowPositionOld, snake.HeadPosition.ColumnPositionOld);
            //var neckPaint = ShowSnakeNeck(neck.RowPosition, neck.ColumnPosition);

            snake.Tail.Add(new CanvasPosition(snake.HeadPositionOld.RowPosition, snake.HeadPositionOld.ColumnPosition, neckPaint));
            //snake.Tail.Add(new CanvasPosition(snake.HeadPosition.RowPositionOld, snake.HeadPosition.ColumnPositionOld, neckPaint));
            //snake.Tail.Add(new CanvasPosition(neck.RowPosition, neck.ColumnPosition, neckPaint));

            if (snake.Tail.Count < snake.Length)
            {
            }
            else
            {
                var end = snake.Tail[0];

                ShowEmptyArenaPosition(end.RowPosition, end.ColumnPosition, end.Paint);

                snake.Tail.RemoveAt(0);
            }
        }
Example #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();
        }