/// <summary> /// A kígyó farkának megjelenítése /// </summary> private void ShowSnakeTail(GamePoint tail) { var child = GetGridArenaCell(tail); child.Icon = FontAwesome.WPF.FontAwesomeIcon.Circle; child.Foreground = Brushes.Blue; }
/// <summary> /// A kígyó fejének megjelenítése /// </summary> /// <param name="head"></param> private void ShowSnakeHead(GamePoint head) { var child = GetGridArenaCell(head); child.Icon = FontAwesome.WPF.FontAwesomeIcon.Circle; child.Foreground = Brushes.Green; }
private void SetSnakeForStart() { Snake = new Snake(); Snake.GamePoints = new List <GamePoint>(); //generáljuk a kígyó fejét var head = GetRandomMeal(); Snake.GamePoints.Add(head); //egyszerű kígyóelhelyezés: //vizszintesen rajzolunk, //ha a x 10-nél nagyobb, akkor balra //ha az x 10-nél kisebb, akkor jobbra //A kígyó fejét megjelenítjük ShowSnakeHead(head); for (int i = 0; i < ArenaSettings.SnakeCountForStart; i++) { GamePoint gamePoint; if (head.X <= 10) { //jobbra nyúlik gamePoint = new GamePoint(head.X + i + 1, head.Y); } else { //balra nyúlik gamePoint = new GamePoint(head.X - i - 1, head.Y); } Snake.GamePoints.Add(gamePoint); ShowSnakeTail(gamePoint); } }
/// <summary> /// A kígyó farka végének eltüntetése /// </summary> /// <param name="tailEnd"></param> private void RemoveSnakeTail(GamePoint tailEnd) { var child = GetGridArenaCell(tailEnd); child.Icon = FontAwesome.WPF.FontAwesomeIcon.SquareOutline; child.Foreground = Brushes.Black; Snake.GamePoints.Remove(tailEnd); }
/// <summary> /// Kiválasztunk a táblán egy mezőt a megadott koordináták alapján /// </summary> /// <param name="gamePoint"></param> /// <returns></returns> private FontAwesome.WPF.ImageAwesome GetGridArenaCell(GamePoint gamePoint) { //midegyik sor 20 (MaxX) elemből áll, tehát úgy tudom megtalálni az adott //koordinátát, hogy pl. a harmadik sorban lévő 5 elemhez elmegyek 2*20=40 elemet (2=3-1), //majd elindulok a soron belül, és az első elemtől még lépek 4-et (4=5-1) var child = MainWindow.GridArena.Children[(gamePoint.Y - 1) * ArenaSettings.MaxX + (gamePoint.X - 1)]; //Ez a Children gyűjtemén un. UIElement-ekből áll, ebbe van becsomagolva minden felületi megjelenítő //ahhoz, hogy kibányásszuk a benne lévő ImageAwesome vezérlőt, el kell kérnünk a változótól: //ezt az eléírt zárójeles típussal tudjuk megtenni var cell = (FontAwesome.WPF.ImageAwesome)child; return(cell); }
/// <summary> /// Ha a játéknak eljön a következő órajele, akkor ezt a függvényt hívjuk meg. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ItIsTimeForShow(object sender, EventArgs e) { //mivel 100 millisec-enként hívjuk ezt a függvényt, egyszerre nem //érkezhet ide két végrehajtás, ezért ez jó megoldás if (IsInShow) { return; } IsInShow = true; //frissíteni a játékidőt PlayTime = PlayTime.Add(TimeSpan.FromMilliseconds(100)); //játékmenet frissítése //a kígyó feje mozog a kijelölt irányba var oldHead = Snake.Head; GamePoint newHead = null; switch (Snake.Direction) { case SnakeDirections.None: break; case SnakeDirections.Left: newHead = new GamePoint(oldHead.X - 1, oldHead.Y); break; case SnakeDirections.Right: newHead = new GamePoint(oldHead.X + 1, oldHead.Y); break; case SnakeDirections.Up: newHead = new GamePoint(oldHead.X, oldHead.Y - 1); break; case SnakeDirections.Down: newHead = new GamePoint(oldHead.X, oldHead.Y + 1); break; default: throw new Exception($"Erre nem vagyunk felkészülve: {Snake.Direction}"); } if (newHead == null) { // nincs új fej, nincs mit tenni IsInShow = false; return; } //le kell elenőrizni, hogy //saját magába harapott-e? if (Snake.GamePoints.Any(gp => gp.X == newHead.X && gp.Y == newHead.Y)) { // magába harapott GameOver(); IsInShow = false; return; //játék vége, nincs tovább } //le kell elenőrizni, hogy //nekimentünk-e a falnak? //azért tettük be az első és utolsó sort + oszlopot, hogy //azok jelentsék a falat. Tehát a 0. és a Max+1. sor és oszlop //a fal if (newHead.X == 0 || newHead.Y == 0 || newHead.X == ArenaSettings.MaxX + 1 || newHead.Y == ArenaSettings.MaxY + 1) { // nekiment a falnak GameOver(); IsInShow = false; return; //játék vége, nincs tovább } //új fejet hozzáadjuk a kígyóhoz //a lista legelejére. Ha itt adjuk hozzá az új fejet, akkor //benne lesz a Snake.GamePoints listában és az étel generálás már //figyelembe veszi. Snake.Head = newHead; ShowSnakeHead(newHead); //le kell elenőrizni, hogy //megettünk-e ételt? var isEated = Meals.Any(gp => gp.X == newHead.X && gp.Y == newHead.Y); if (isEated) { // ételt ettünk //méghozzá ezt var meal = Meals.Single(gp => gp.X == newHead.X && gp.Y == newHead.Y); Snake.Eat(meal); RemoveMeal(meal); while (Meals.Count < ArenaSettings.MealsCountForStart) { //addig megyünk, amíg minden étel megvan, ez jelen esetben mindig az utolsó GetNewMeal(); } } //megjeleníteni a kígyó új helyzetét //régi fej már farok, hiszen a kígyó továbbcsúszott ShowSnakeTail(oldHead); //ha nem evett, akkor a farok végét eltüntetni if (!isEated) { var tailEnd = Snake.TailEnd; RemoveSnakeTail(tailEnd); } //kiírni a képernyőre ShowGameCounters(); IsInShow = false; }