IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
BluPri
Člen
Avatar
BluPri:23.4.2017 15:44

Ahoj, takže jsem stvořil hada svou první hru v C# a je to dobrý pocit :-) , ale jsou tu dvě malé chyby na kráse:

1. Celá hra je někdy sekaná a někdy ne, může za to asi část kde čistím konzoli, ale nevím proč se to děje jen někdy

Snake snake = new Snake(ConsoleColor.White);
            Console.CursorVisible = false;

            //Start of the game
            Console.CursorLeft = Console.WindowWidth / 2;
            Console.CursorTop = Console.WindowHeight / 4;
            Console.WriteLine(@"
                           _____             _
                          / ____|           | |
                         | (___  _ __   __ _| | _____
                          \___ \| '_ \ / _` | |/ / _ \
                          ____) | | | | (_| |   <  __/
                         |_____/|_| |_|\__,_|_|\_\___|
                         Press any key to start the game");
            Console.ReadKey();

            //Game loop
            while (snake.Alive)
            {
                Console.Clear();
                Console.BackgroundColor = ConsoleColor.Black;
                snake.Draw();
                snake.Move();
                Thread.Sleep(50);

                //Reaction to the pressed keys
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo key = Console.ReadKey();

                    if (key.Key == ConsoleKey.RightArrow && !(snake.Direction == 180))
                        snake.Direction = 0;
                    if (key.Key == ConsoleKey.LeftArrow && !(snake.Direction == 0))
                        snake.Direction = 180;
                    if (key.Key == ConsoleKey.UpArrow && !(snake.Direction == 270))
                        snake.Direction = 90;
                    if (key.Key == ConsoleKey.DownArrow && !(snake.Direction == 90))
                        snake.Direction = 270;
                }
            }

            //End of the game
            Console.Clear();
            Console.CursorLeft = Console.WindowWidth / 2;
            Console.CursorTop = Console.WindowHeight / 4;
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write(@"
                 __     __           _               _
                 \ \   / /          | |             | |
                  \ \_/ /__  _   _  | |     ___  ___| |_
                   \   / _ \| | | | | |    / _ \/ __| __|
                    | | (_) | |_| | | |___| (_) \__ \ |_ _ _ _
                    |_|\___/ \__,_| |______\___/|___/\__(_|_|_)
                    Press any key to end the game");
            Console.ReadKey();

2. Had se někdy o kostku prostě zasekne, z ničeho nic, teď už vůbec netuším kvůli čemu se to může dít

/// <summary>
/// List of cubes
/// </summary>
private List<Cube> articles = new List<Cube>();

//Instances
private Cube cube;
private Random random;

private ConsoleColor Color { get; set; }

public bool Alive { get; set; }
public int Direction { get; set; }

private int coordinateX { get; set; }
private int coordinateY { get; set; }
private bool isColision { get; set; }
private Cube food = new Cube(0, 0, ConsoleColor.DarkGreen);

/// <summary>
/// Parameter constructor
/// </summary>
/// <param name="color">Color</param>
public Snake(ConsoleColor color)
{
    Alive = true;
    Color = color;
    Direction = 0;
    articles.Add(cube = new Cube(10, 15, Color));
    articles.Add(cube = new Cube(10, 16, Color));
    articles.Add(cube = new Cube(10, 17, Color));
    random = new Random();
    AddFood();
}

public void AddFood()
{
    coordinateX = random.Next(Console.WindowWidth / 2);
    coordinateY = random.Next(Console.WindowHeight);
    isColision = true;

    //Creates food outside the snake
    while(isColision)
    {
        food.X = coordinateX;
        food.Y = coordinateY;
        isColision = false;
        foreach (Cube c in articles)
        {
            if (c.Colision(food))
                isColision = true;
        }
    }
}

//Draws the list of cubes and food
public void Draw()
{
    foreach (Cube c in articles)
    {
        c.Draw();
    }
    food.Draw();
}

public void Move()
{
    Cube newHead = new Cube(articles[0].X, articles[0].Y, Color);
    if (Direction == 0)
        newHead.X++;
    if (Direction == 180)
        newHead.X--;
    if (Direction == 90)
        newHead.Y--;
    if (Direction == 270)
        newHead.Y++;

    //Colision with food
    if (articles[0].Colision(food))
    {
        articles.Insert(0, newHead);
        AddFood();
    }

    //Checks the impact on the wall
    else if (articles[0].OutsideTheConsole)
        Alive = false;

    //Normal case e.g. nothing happens
    else
    {
        articles.Insert(0, newHead);
        articles.RemoveAt(articles.Count - 1);
    }

    //Checks the impact on another article of the snake
    for (int i = 1; i < articles.Count; i++)
        if (articles[0].Colision(articles[i]))
            Alive = false;
}

/// <summary>
/// Length of the snake
/// </summary>
/// <returns>Length length of the snake</returns>
public int length;
public int Length
{
    get
    {
        return articles.Count;
    }

    private set
    {
        length = value;
    }

}

Kostka

/// <summary>
       /// Coordinate X of the cube
       /// </summary>
       public int X { get; set; }
       /// <summary>
       /// Coordinate Y of the cube
       /// </summary>
       public int Y { get; set; }

       /// <summary>
       /// Color of the cube
       /// </summary>
       private ConsoleColor Color { get; set; }

       private bool outsideTheConsole;
       public bool OutsideTheConsole
       {
           get
           {
               return (X >= Console.WindowWidth / 2 || Y >= Console.WindowHeight || X < 0 || Y < 0);
           }

           private set
           {
               outsideTheConsole = value;
           }
       }

       /// <summary>
       /// Checks the colision with cube
       /// </summary>
       /// <param name="cube">Cube</param>
       /// <returns>True if the colision is valid</returns>
       public bool Colision(Cube cube)
       {
           return (X == cube.X && Y == cube.Y);
       }

       /// <summary>
       /// Parameter constructor
       /// </summary>
       /// <param name="x">Coordinate x</param>
       /// <param name="y">Coordinate y</param>
       /// <param name="color">Color of the cube</param>
       public Cube(int x, int y, ConsoleColor color)
       {
           X = x;
           Y = y;
           Color = color;
       }

       /// <summary>
       /// Nonparameter constructor
       /// </summary>
       public Cube()
       {
           X = 0;
           Y = 0;
           Color = ConsoleColor.Black;
       }

       /// <summary>
       /// Draws the cube as 2 rectangles
       /// </summary>
       public void Draw()
       {
           if (!OutsideTheConsole)
           {
               Console.CursorLeft = X * 2;
               Console.CursorTop = Y;
               Console.ForegroundColor = Color;
               Console.Write("██");
           }
       }

Mimochodem, obrovské díky za tenhle tutoriál, moc mě to baví a nemumím si představit lépe napsané tutoriály :-)

 
Odpovědět
23.4.2017 15:44
Avatar
Jiri Otoupal
Tvůrce
Avatar
Jiri Otoupal:23.4.2017 22:58

Ahoj , to mazání prováděj pomoci /b na cursor.position . Celkem by mě zajímalo jak řešíte ty kolize , máte nějakou databázi kde je jaký znak ?

Nahoru Odpovědět
23.4.2017 22:58
Vše je jen otázka času
Avatar
BluPri
Člen
Avatar
Odpovídá na Jiri Otoupal
BluPri:24.4.2017 16:58

No trochu nechápu, jak to mazání myslíš, možná by byla dobrá ukázka a kolizi řeší metoda Colision, tu pak využívám hlavně u metody Move. A co se týče databáze je tam list ve kterém jsou uloženy kostky, ty pak vykresluji pomocí cyklu.

 
Nahoru Odpovědět
24.4.2017 16:58
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 3 zpráv z 3.