Diskuze: Problém se spawnem

C# .NET .NET (C# a Visual Basic) Problém se spawnem American English version English version

Avatar
GunSpawn
Redaktor
Avatar
GunSpawn:

Ahoj všem,
mám tu menší problém. Udělal jsem v C# hru, něco na způsob hada a všechny prvky jsou náhodně generovány, ale problém je v tom, že když hru spustím, tak se had nejdřív na obrazovce neobjeví vůbec a když dám šipku doprava, tak se objeví u posledního generovaného prvku (v tomto případě východ). [Nevšímejte si věcí, jakože překážkama se dá projít, to jsem ještě neřešil]. Zde je kód

using System;

namespace Upg.Snake
{
    enum StavHry
    {
        Probiha,Vyhra,Prohra,Ukonceni
    }

    class HerniSvet
    {
        private int[,] Mapa;
        private int x = 1, y = 1;
        int predchoziX = 1, predchoziY = 1;
        int zbyvajiciPredmety;
        int pocetPredmetu = 4;
        int pocetPrekazek = 4;
        int pocetVychodu = 1;
        const int MapaSirka = 24;
        const int MapaVyska = 24;
        const int Prekazka = 3;
        const int Predmet = 2;
        const int Vychod = 1;
        Random nahoda = new Random();
        public StavHry stavHry = StavHry.Probiha;


        public int X
        {
            get
            {
                return x;
            }
            set
            {
                if (value >= 1 && value < MapaSirka - 1)
                {
                    if (Mapa[value, y] == Prekazka)
                    {
                        return;
                    }
                    Mapa[x, y] = Prekazka;
                    x = value;
                }

            }
        }

        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                if(value >=1 && value < MapaVyska -1)
                {
                    if (Mapa[x,value] == Prekazka)
                    {
                        return;
                    }
                    Mapa[x, y] = Prekazka;
                    y = value;
                }
            }
        }

        public void ZkontrolujPolicko()
        {
            if (Mapa[x,y] == Predmet)
            {
                Mapa[x, y] = 0;
                zbyvajiciPredmety--;
            }
            else if (Mapa[x,y] == Vychod && zbyvajiciPredmety == 0)
            {
                stavHry = StavHry.Vyhra;
            }
            else if (Mapa[x,y] == Vychod && zbyvajiciPredmety > 0)
            {
                stavHry = StavHry.Prohra;
            }
            if(Mapa[x-1,y] == Prekazka && Mapa[x,y-1] == Prekazka && Mapa[x+1,y] == Prekazka && Mapa[x,y+1] == Prekazka)
            {
                stavHry = StavHry.Prohra;
            }
        }

        public void AktualizujZobrazeni()
        {
            Console.SetCursorPosition(predchoziX, predchoziY);
            Console.BackgroundColor = ConsoleColor.White;
            Console.Write(" ");
            Console.SetCursorPosition(x, y);
            Console.BackgroundColor = ConsoleColor.Red;
            Console.Write("X");
            Console.ResetColor();
            predchoziX = x;
            predchoziY = y;
            Console.SetCursorPosition(MapaSirka + 2, 0);
            Console.WriteLine("Předmětů zbývá sebrat: " + zbyvajiciPredmety);
        }

        public void ZpracovaniPohybu()
        {
            ConsoleKeyInfo stisknutaKlavesa = Console.ReadKey(true);
            switch(stisknutaKlavesa.Key)
            {
                case ConsoleKey.DownArrow:
                    y++;
                    break;
                case ConsoleKey.UpArrow:
                    y--;
                    break;
                case ConsoleKey.LeftArrow:
                    x--;
                    break;
                case ConsoleKey.RightArrow:
                    x++;
                    break;
                case ConsoleKey.Escape:
                    stavHry = StavHry.Ukonceni;
                    break;
            }
        }

        public HerniSvet()
        {
            Mapa = new int[MapaSirka, MapaVyska];

            for (int y = 0; y < MapaVyska; y++)
            {
                Mapa[0, y] = Prekazka;
                Mapa[MapaSirka - 1, y] = Prekazka;
            }
            for (int x = 0;x < MapaSirka;x++)
            {
                Mapa[x, 0] = Prekazka;
                Mapa[x, MapaVyska - 1] = Prekazka;
            }
            for (int i = 0; i < pocetPrekazek; i++)
            {
                x = nahoda.Next(1, 23);
                y = nahoda.Next(1, 23);
                Mapa[x,y] = Prekazka;
            }
            for (int i = 0; i < pocetPredmetu; i++)
            {
                x = nahoda.Next(1, 23);
                y = nahoda.Next(1, 23);
                while (Mapa[x,y] == Prekazka)
                {
                    x = nahoda.Next(1, 23);
                    y = nahoda.Next(1, 23);
                }
                Mapa[x, y] = Predmet;
            }
            for (int i = 0; i < pocetVychodu;i++)
            {
                x = nahoda.Next(1, 23);
                y = nahoda.Next(1, 23);
                while(Mapa[x,y] == Prekazka || Mapa[x,y] == Predmet)
                {
                    x = nahoda.Next(1, 23);
                    y = nahoda.Next(1, 23);
                }
                Mapa[x, y] = Vychod;
            }

                for (int Y = 0; Y < MapaVyska; Y++)
                {
                    for (int X = 0; X < MapaSirka; X++)
                    {
                        if (Mapa[X, Y] == Predmet)
                        {
                            zbyvajiciPredmety++;
                        }
                    }
                }
            ZobrazHerniSvet();
        }

        private void ZobrazHerniSvet()
        {
            for(int y = 0;y < MapaVyska; y++)
            {
                for(int x = 0; x < MapaSirka; x++)
                {
                    if (Mapa[x,y] == Prekazka)
                    {
                        Console.SetCursorPosition(x, y);
                        Console.Write("#");
                    }
                    else if (Mapa[x, y] == Predmet)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.SetCursorPosition(x, y);
                        Console.Write("*");
                        Console.ResetColor();
                    }
                    else if (Mapa[x,y] == Vychod)
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.SetCursorPosition(x, y);
                        Console.Write("@");
                        Console.ResetColor();
                    }
                }
            }
        }
    }

    class Program
    {
        const int NovaHra = 0;
        const int Instrukce = 1;
        const int Konec = 2;

        static void Main(string[] args)
        {
            HlavniNabidka.ZobrazHlavniNabidku();
            bool hraPokracuje = true;

            while (hraPokracuje)
            {
                int vysledekVolby = HlavniNabidka.ZobrazHlavniNabidku();
                switch (vysledekVolby)
                {
                    case NovaHra:
                        Console.Clear();
                        HerniSvet herniSvet = new HerniSvet();
                        while (herniSvet.stavHry == StavHry.Probiha)
                        {
                            herniSvet.ZpracovaniPohybu();
                            herniSvet.ZkontrolujPolicko();
                            herniSvet.AktualizujZobrazeni();
                        }
                        switch (herniSvet.stavHry)
                        {
                            case StavHry.Ukonceni:
                                Console.Clear();
                                Console.WriteLine("Hra ukončena uživatelem.");
                                break;
                            case StavHry.Vyhra:
                                Console.Clear();
                                Console.WriteLine("VYhrál jsi!");
                                break;
                            case StavHry.Probiha:
                                Console.Clear();
                                Console.WriteLine("Prohrál jsi!");
                                break;
                        }
                        Console.ReadKey();
                        break;
                    case Instrukce:
                        Console.Clear();
                        Console.Write("Instrukce\nOvládání:");
                        Console.Write("šipky");
                        Console.Write("\nCíl hry:Sesbírej všechny předměty (*) a dojdi k východu (@). Cestou se vyhni překážkám (#)");
                        Console.ReadKey();
                        break;
                    case Konec:
                        hraPokracuje = false;
                        break;
                }
            }
        }
    }
    class HlavniNabidka
    {
        public static int ZobrazHlavniNabidku()
        {
            string[] polozkyNabidky = new string[3];
            polozkyNabidky[0] = "Nová hra";
            polozkyNabidky[1] = "Instrukce";
            polozkyNabidky[2] = "Konec";

            int zvolenaPolozka = 0;
            bool vyberDokoncen = false;

            Console.Clear();

            while (!vyberDokoncen)
            {
                Console.SetCursorPosition(0, 3);

                for (int i = 0; i < polozkyNabidky.Length; i++)
                {
                    if (zvolenaPolozka == i)
                    {
                        Console.BackgroundColor = ConsoleColor.Blue;
                    }
                    Console.WriteLine(polozkyNabidky[i]);
                    Console.ResetColor();
                }
                ConsoleKeyInfo StisknutaKlavesa = Console.ReadKey(true);
                if (StisknutaKlavesa.Key == ConsoleKey.DownArrow)
                {
                    zvolenaPolozka++;
                    if (zvolenaPolozka == polozkyNabidky.Length)
                    {
                        zvolenaPolozka = 0;
                    }
                }
                else if (StisknutaKlavesa.Key == ConsoleKey.UpArrow)
                {
                    zvolenaPolozka--;
                    if (zvolenaPolozka < 0)
                    {
                        zvolenaPolozka = polozkyNabidky.Length - 1;
                    }
                }
                else if (StisknutaKlavesa.Key == ConsoleKey.Enter)
                {
                    vyberDokoncen = true;
                }
            }
            return zvolenaPolozka;
        }
    }
}
Odpovědět 26.5.2014 18:56
Save early, save often, save everything, everywhere, everytime.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.