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>(); }
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(); }