Не так работает цикл while c#

Рейтинг: 0Ответов: 1Опубликовано: 15.04.2023

Пуля должна долететь до стены и не ломать, а она делает наоборот.

namespace game
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.CursorVisible = false;//Убирает курсор из консолиъ
            Console.ForegroundColor = ConsoleColor.Yellow;
            char[,] map =
            {
                {'░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
                {'░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░', },
            };

            //Координаты персонажа
            int UserPositionY = map.GetLength(1) / 2;//0 2
            int UserPositionX = map.GetLength(1) / 2;//1 2

            int BulletPositionY = map.GetLength(1) / 2;//0 2
            int BulletPositionX = map.GetLength(1) / 2;//1 2


            //int UserPositionY1 = map.GetLength(0) / 5;
            //int UserPositionX1 = map.GetLength(1) / 5;

            string mapString = "";
            for (int y = 0; y < map.GetLength(0); y++)
            {
                for (int x = 0; x < map.GetLength(1); x++)
                {
                    Console.Write(map[y, x]);
                }
                Console.WriteLine();
            }

            //Начало игры
            object locker = new();

            char player = '▲';
            bool isShoot = false;

            while (true)
            {//Начало While
             //Отрисовка
             //  lock (locker)


                lock (locker)
                {
                    //Ходьба персонажа
                    Console.SetCursorPosition(UserPositionX, UserPositionY);
                    //Console.SetCursorPosition(BulletPositionX, BulletPositionY);
                    Console.Write(player);

                }
                //Console.SetCursorPosition(UserPositionX1, UserPositionY1);
                //Console.Write('1');
                //Считываем клавиши          

                var key = Console.ReadKey(true).Key; //Для считывания клавиши

                lock (locker)
                {
                    Console.SetCursorPosition(UserPositionX, UserPositionY);
                    //Console.SetCursorPosition(BulletPositionX, BulletPositionY);
                    Console.Write(' ');
                }

                switch (key)
                {
                    case ConsoleKey.W:

                        if (map[UserPositionY - 1, UserPositionX] != '░')
                        {
                            player = '▲';
                            UserPositionY--;
                        }
                        break;
                    case ConsoleKey.S:
                        if (map[UserPositionY + 1, UserPositionX] != '░')
                        {
                            player = '▼';
                            UserPositionY++;
                        }
                        break;
                    case ConsoleKey.A:
                        if (map[UserPositionY, UserPositionX - 1] != '░')
                        {
                            player = '◄';
                            UserPositionX--;
                        }
                        break;
                    case ConsoleKey.D:
                        if (map[UserPositionY, UserPositionX + 1] != '░')
                        {
                            player = '►';
                            UserPositionX++;
                        }
                        break;
                    case ConsoleKey.Spacebar:
                        if (map[UserPositionY - 1, UserPositionX] != '░')
                        {
                            if (isShoot) continue;

                            isShoot = true;
                            Task.Run(async () =>
                            {
                                char bullet = '°';

                                int currentPosPlayerX = UserPositionX;
                                int currentPosPlayerY = UserPositionY;

                                char player1 = player;

                                if (player1 == '▲')
                                {
                                    int i = 1;
                                    while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
                                    {

                                        
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY - i);
                                            Console.Write(bullet);
                                        }

                                        await Task.Delay(100);
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY - i);
                                            Console.Write(" ");
                                        }
                                        i++;
                                        
                                    }

                                }
                                if (player1 == '▼')
                                {
                                    int i = 1;
                                    while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
                                    {
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY + i);
                                            Console.Write(bullet);
                                        }

                                        await Task.Delay(100);
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY + i);
                                            Console.Write(" ");
                                        }
                                        i++;
                                    }
                                }

                                if (player1 == '◄')
                                {
                                    int i = 1;
                                    while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
                                    {
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX - i, currentPosPlayerY);
                                            Console.Write(bullet);
                                        }

                                        await Task.Delay(100);
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX - i, currentPosPlayerY);
                                            Console.Write(" ");
                                        }
                                        i++;
                                    }
                                }

                                if (player1 == '►')
                                {
                                    int i = 1;
                                    while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
                                    {
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX + i, currentPosPlayerY);
                                            Console.Write(bullet);
                                        }

                                        await Task.Delay(100);
                                        lock (locker)
                                        {
                                            Console.SetCursorPosition(currentPosPlayerX + i, currentPosPlayerY);
                                            Console.Write(" ");
                                        }
                                        i++;
                                    }
                                }


                                isShoot = false;
                            });
                        }
                        break;

                }//Конец switch



            }//Конец While
        }

    }
}

Ответы

▲ 0Принят

По-моему x и y перепутаны, в перемещении у Вас:

map[UserPositionY, UserPositionX] 

а в движении пули:

map[UserPositionX, UserPositionY]

Насколько я вижу проблема заключается в том какое условие в while везде:

... currentPosPlayer* + i + 1 != '░')

А это не совсем правильно. Т.е. я понял Вашу логику с тем что во всех четырех циклах i + 1 и растет, а Вы его либы прибавляете либо вычитаете, но в условиях Вы это не учитываете, поправьте условия и все должно заработать.

if (player1 == '▲')
{
    while (map[currentPosPlayerY - i - 1, currentPosPlayerX] != '░')    {
        ...
    }
}
if (player1 == '▼')
{
    while (map[currentPosPlayerY + i + 1, currentPosPlayerX] != '░')    {
        ...
    }
}

if (player1 == '◄')
{
    while (map[currentPosPlayerY, currentPosPlayerX - i - 1] != '░')    {
        ...
    }
}
if (player1 == '►')
{
    while (map[currentPosPlayerY, currentPosPlayerX + i + 1] != '░')    {
        ...
    }
}

Мне кажется тут вполне можно использовать else if так как лишь одно из условий верно в конкретный момент времени.

Подозреваю что всему виной копипаст — зло, чтобы такого не происходило постарайтесь не дублировать код, я имею в виду что вместо четырех while подумайте как написать всего один (без дублирования), это можно сделать, просто возможно Вы об этом не задумывались. А об этом стоит думать всякий раз когда руки тянуться к Ctrl + c и Ctrl + v Ну или по крайней мере при копировании проверяйте все ли Вы заменили в вставленном коде.