Exemple #1
0
        /// <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;
        }
Exemple #2
0
        /// <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;
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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;
        }