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; }
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); } }
public Snake(int rowPosition, int columnPosition) { HeadPosition = new ArenaPosition(rowPosition, columnPosition); HeadDirection = SnakeHeadDirectionEnum.InPlace; }