Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 11.10.2023
Сообщений: 12
1

Управление движением в консоли

09.01.2024, 13:42. Показов 946. Ответов 4

Author24 — интернет-сервис помощи студентам
Здравствуйте! Хочу как минимум научится делать бродилки по лабиринту в консоли, потом уже что-то другое из этих знаний. Но проблема в том, чтобы я не использовал, меня не удовлетворяет как персонаж(красный прямоугольничек) двигается, нашёл где-то в интернете метод решения с использованием async, но меня всё ещё не устраивает, я хочу чтобы он двигался нормально - а именно пока я удерживаю кнопку он двигается, перестаю - не двигается. Сейчас же он может "перескочить" сразу с одного конца карты на другой. Подскажите, пожалуйста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Threading;
using System.Threading.Tasks;
 
class Program
{
    static int Width = 120;
    static int Height = 30;
    static char[,] Map = new char[Width, Height];
 
    static void MapPrint()
    {
        Console.SetCursorPosition(0, 0);
        for (int y = 0; y < Height; y++)
        {
            for (int x = 0; x < Width; x++)
            {
                if ((Player.x == x) && (Player.y == y))
                {
                    Console.BackgroundColor = ConsoleColor.Red;
                    Console.Write(' ');
                }
                else if (Map[x, y] == '@')
                {
                    Console.BackgroundColor = ConsoleColor.Blue;
                    Console.Write(' ');
                }
                else
                {
                    Console.BackgroundColor = ConsoleColor.DarkBlue;
                    Console.Write(' ');
                }
            }
            Console.WriteLine();
        }
    }
 
    class Player
    {
        static public int x = Width / 2;
        static public int y = Height / 2;
        static public char img = 'P';
    }
 
    static void MapGenerate()
    {
        Random xex = new Random();
        for (int y = 0; y < Height; y++)
        {
            for (int x = 0; x < Width; x++)
            {
                if ((x == 0) || (y == 0) || (x == Width - 1) || (y == Height - 1))
                {
                    Map[x, y] = '@';
                }
                else if (xex.Next(0, 11) == 1)
                {
                    Map[x, y] = '@';
                }
            }
        }
    }
 
    static async Task MovePlayer()
    {
        while (true)
        {
            if (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                    case ConsoleKey.W:
                        if (Map[Player.x, Player.y - 1] != '@')
                        {
                            Player.y--;
                        }
                        break;
                    case ConsoleKey.S:
                        if (Map[Player.x, Player.y + 1] != '@')
                        {
                            Player.y++;
                        }
                        break;
                    case ConsoleKey.A:
                        if (Map[Player.x - 1, Player.y] != '@')
                        {
                            Player.x--;
                        }
                        break;
                    case ConsoleKey.D:
                        if (Map[Player.x + 1, Player.y] != '@')
                        {
                            Player.x++;
                        }
                        break;
                }
            }
            await Task.Delay(0);
        }
    }
 
    static void Main(string[] args)
    {
        Console.CursorVisible = false;
        MapGenerate();
        Console.SetWindowSize(Width + 1, Height);
 
        Task.Run(async () => { await MovePlayer(); });
 
        while (true)
        {
            MapPrint();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2024, 13:42
Ответы с готовыми решениями:

Управление размером консоли
Здравствуйте!) Прошу Вас помочь в вопросе управления размерами консоли программно. Наверняка...

Тетрис в консоли. Как реализовать управление фигурами
Приветствую. Препод в универе пошутил и предложил написать тетрис в консоли, так вот, столкнулся с...

Управление движением объектов с клавиатуры
Постоянное движение нескольких графических объектов с отражением от границ окна (по таймеру)....

Задача моделирования и управление движением
Суть в том что, клетка находится изначально в любой клетке(например в верхней) и пользователь...

4
2096 / 1506 / 391
Регистрация: 26.06.2017
Сообщений: 4,315
09.01.2024, 14:59 2
Цитата Сообщение от odnaglaziw Посмотреть сообщение
Сейчас же он может "перескочить" сразу с одного конца карты на другой.
Просто очень быстро отрабатывает MovePlayer. Увеличьте задержку Task.Delay(0); или сделайте код синхронным, т.е. после считывания клавиатуры перерисовывайте карту и вновь ожидайте ввода и так пока не надоест

Добавлено через 14 минут
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
 
class Program
{
    static int Width = 120;
    static int Height = 30;
    static char[,] Map = new char[Width, Height];
 
    static void MapPrint()
    {
        // реализация
    }
 
 
    static void MovePlayer()
    {
        bool keyRead;
        while (!keyRead)
        {
            if (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                    case ConsoleKey.W:
                        if (Map[Player.x, Player.y - 1] != '@')
                        {
                            Player.y--;
                        }
                        break;
                    case ConsoleKey.S:
                        if (Map[Player.x, Player.y + 1] != '@')
                        {
                            Player.y++;
                        }
                        break;
                    case ConsoleKey.A:
                        if (Map[Player.x - 1, Player.y] != '@')
                        {
                            Player.x--;
                        }
                        break;
                    case ConsoleKey.D:
                        if (Map[Player.x + 1, Player.y] != '@')
                        {
                            Player.x++;
                        }
                        break;
                    case ConsoleKey.Escape:
                        exitRequired = true;
                        break;
                }
                keyRead = true;
            }
        }
    }
 
    static bool exitRequired;
 
    static void Main(string[] args)
    {
        Console.CursorVisible = false;
        MapGenerate();
        Console.SetWindowSize(Width + 1, Height);
 
        while (!exitRequired)
        {
            MovePlayer();
            MapPrint();
        }
    }
}
1
2 / 2 / 0
Регистрация: 11.10.2023
Сообщений: 12
09.01.2024, 15:19  [ТС] 3
Цитата Сообщение от Uswer Посмотреть сообщение
перерисовывайте карту и вновь ожидайте ввода
Если я вас понял, то я так делал и в этом случае что персонаж, что отрисовка карты дёрганые. Либо же я вас не понял
0
2096 / 1506 / 391
Регистрация: 26.06.2017
Сообщений: 4,315
09.01.2024, 15:54 4
Конечно дёрганные, т.к. при зажатой клавише перерисовка всей карты будет практически постоянной. Более правильно будет нарисовать карту единожды, а при перемещении персонажа запоминать тот символ, на место которого персонаж перемещается, при уходе персонажа в другую позицию восстанавливать символ карты из запомненного.

Добавлено через 2 минуты
Даже запоминать не надо есть же карта, надо просто при уходе персонажа перерисовать символ, который занимал персонаж.

Добавлено через 18 минут
Для вашей реализации даже в карту смотреть не надо, надо всего лишь после ухода персонажа нарисовать пробел.
0
967 / 449 / 231
Регистрация: 27.06.2014
Сообщений: 987
10.01.2024, 06:50 5
odnaglaziw, здесь есть пример перемещения по лабиринту анимированного курсора (персонажа) с использованием таймера.
Но вот отрабатывать события KeyDown и KeyUp придётся только через глобальных хук (или ещё как???)
0
10.01.2024, 06:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2024, 06:50
Помогаю со студенческими работами здесь

Управление движением лейбла, нажатием на стрелки клавиатуры
Здравствуйте! Нужна помощь, решил я тут прописать перемещение лейбла по форме, нажатием стрелок, но...

Движение, вращение, управление движением, управление вращением фигуры
Написать программу, выполняющую четыре операции над графическим...

Управление движением
Вопрос в следующем: хотел сделать, чтобы марио двигался только по зеленным и синим квадратам,...

Управление движением мячика
Решил написать игру, но двигаюсь к этому постепенно, сделал загрузку и отображение мячика, сделал...

Управление движением с помощью клавиш
сделать прогу управ движ * по экрану с помощью клавиш влево вправо вверх вниз

Рисование точки и управление ее движением
поместить на форму графическое поле, по которому будет перемещаться точка,кнопку для вывода...

Задача моделирования и управление движением
Суть в том что, клетка находится изначально в любой клетке(например в верхней) и пользователь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru