Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
9 / 6 / 3
Регистрация: 16.02.2020
Сообщений: 28
1

Вывод и изменение игрового поля

19.05.2020, 02:11. Показов 4903. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
мне нужна помощь изучаю С ++
пишу игру змейка на консоли написал уже всю логику но теперь пытаюсь улучшить вывод игры на экран.
сейчас у меня поле рисуется в цикле потом стирается и перерисовуется с изменениями, но это приводит к мерцанию рамки и элементов. подскажите какой функцией или инструментом можно воспользоватся чтобы избежать мерцания и чтобы перерисовывалась только изменяемая часть поля.
мне сказали что в линуксе есть функция mvwinch для этого но я пишу в виндовсе поэтому она мне не подходит.
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
 system("cls");
 
    for (int i = 0; i < sz; i++)
    {
 
        for (int j = 0; j < sz; j++)
            if (j == 0 && i == 0) // РИСОВАНИЕ РАМКИ
                cout << char(201);
            else if (i == 0 && j == sz - 1)
                cout << char(187);
            else if (i == sz - 1 && j == 0)
                cout << char(200);
            else if (i == sz - 1 && j == sz - 1)
                cout << char(188);
            else if (i == 0 || i == sz - 1)
                cout << char(205);
            else if (j == 0 || j == sz - 1)
                cout << char(186);
            else if (snake.y == i && snake.x == j) //РИСОВАНИЕ ГОЛОВЫ ЗМЕИ
                cout << "o";
            else if (food.y == i && food.x == j) //РИСОВАНИЕ ЕДЫ
                cout << "@";
            else {
                if (!tail(i, j))
                    cout << " ";
            }
 
 
        cout << "\n";
    }
    cout << "score-->" << score << "\n";
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2020, 02:11
Ответы с готовыми решениями:

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

Генерирование игрового поля
Здравствуйте, друзья! Я пишу программу, в которой нужно генерировать игровое поле размером 10 строк...

Создание игрового поля
Подскажите, пожалуйста, ответ на такой вопрос: Я часто видел, что в простеньких 2d-играх,...

Создание игрового поля
Как создать игровое поле??? ....... Также можно и создание игровой карти...... Можете навести...

6
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.05.2020, 02:33 2
Цитата Сообщение от kalifan Посмотреть сообщение
мне сказали что в линуксе есть функция mvwinch для этого
Не в Linux, а в ncurses, которую можно и в Windows использовать.
0
9 / 6 / 3
Регистрация: 16.02.2020
Сообщений: 28
19.05.2020, 21:01  [ТС] 3
ncurses
никогда не использовал и что то не могу разобратся. Можно как то по подробнее на каком нибуть примере

Добавлено через 51 секунду
или может подскажете как ее внедрить в мой код?
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.05.2020, 22:19 4
Цитата Сообщение от kalifan Посмотреть сообщение
как ее внедрить в мой код?
Отказаться от потоков ввода/вывода и использовать функции из ncurses.

Мне стало интересно разобраться с основами, открыл гугл и нашел несколько полезных материалов для начала:
Введение в ncurses
Пишем первую программу на Ncurses
Ввод и вывод в ncurses
Теплый ламповый текстовый интерфейс. Просто о простом

После беглого ознакомления набросал небольшую пробную программу с перемещающимся символом в консоли.
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
#include <ncurses.h>
#include <unistd.h>
 
struct Vector2i {
    int x;
    int y;
 
    Vector2i& operator +=(const Vector2i& other) {
        x += other.x;
        y += other.y;
        return *this;
    }
};
 
class Player {
    Vector2i m_pos;
    Vector2i m_speed;
    char m_letter;
 
public:
 
    Player(Vector2i pos, Vector2i speed, char letter)
        : m_pos(pos)
        , m_speed(speed)
        , m_letter(letter)
    { }
 
    void on_key(int key_code) {
        switch (key_code) {
        case KEY_UP:
            m_speed = {0, -1};
            break;
        case KEY_DOWN:
            m_speed = {0, 1};
            break;
        case KEY_LEFT:
            m_speed = {-1, 0};
            break;
        case KEY_RIGHT:
            m_speed = {1, 0};
            break;
        }
    }
 
    void on_step() {
        mvaddch(m_pos.y, m_pos.x, ' ');
        m_pos += m_speed;
        mvaddch(m_pos.y, m_pos.x, m_letter);
    }
};
 
int main() {
    initscr();
 
    cbreak();
    raw();
    nonl();
    noecho();
    nodelay(stdscr, true);
    curs_set(0);
    keypad(stdscr, TRUE);
 
    Player player({10, 10}, {1, 0}, '*');
 
    while (1) {
        /* === Input === */
        const int key_code{getch()};
        if (key_code != ERR) {
            // Закончить игру при нажатии F12.
            if (key_code == KEY_F(12)) {
                break;
            }
 
            player.on_key(key_code);
        }
 
        /* === Update === */
        player.on_step();
 
        usleep(1000000 / 6);
    }
 
    endwin();
    return 0;
}
А что сделали Вы за это время?

Если с ncurses под Windows судьба не сложится, посмотрите PDcurses. Но судя по информации по приведенной ранее ссылке, и с первой тоже должно всё получиться.
1
9 / 6 / 3
Регистрация: 16.02.2020
Сообщений: 28
20.05.2020, 12:37  [ТС] 5
материалы действительно очень интересные огромное спасибо. Но к сожалению это не решает мою проблему мне нужно эту игру показывать преподавателю и ее защищать но мы еще не проходили классы и нам нужно использовать только стандартный инструментарий установленный в Visual studio, а насколько я понял ncurses и PDcurses подключаются дополнительно.
Поэтому мне бы хотелось как то избежать использования дополнительных инструментов.
есть ли способ решить задачу стандартными инструментами <iostream><cstdio> и другими без векторов и классов
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
20.05.2020, 14:14 6
Лучший ответ Сообщение было отмечено kalifan как решение

Решение

Не по теме:

Цитата Сообщение от kalifan Посмотреть сообщение
нам нужно использовать только стандартный инструментарий установленный в Visual studio
Время идет, а ничего не меняется. Последний раз, пожалуй, вмешиваюсь в тему отрисовки в консоли. Есть удобные инструменты, но нет, будем как мыши, которые плачут, колются, но продолжают жрать кактус. Ок, ваше право.



Классы никто не заставляет использовать, это просто пример.

Перед выводом данные можно подготовить в буфере, а затем установить курсор в левый верхний угол (SetConsoleCursorPosition) и вывести содержимое буфера через cout, printf и т.д., как удобно. Так же рамку можно вывести 1 раз в консоль и не включать ей в границы игрового поля.

Была тут уже тема Прорисовка консоли С++.

Добавлено через 7 минут
Также можно скрыть курсор, чтобы не мешался.
C++
1
2
3
4
5
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hConsole, &cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cci);
1
9 / 6 / 3
Регистрация: 16.02.2020
Сообщений: 28
20.05.2020, 22:19  [ТС] 7
спасибо направление получил теперь буду разбиратся как это применить к моему коду
0
20.05.2020, 22:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2020, 22:19
Помогаю со студенческими работами здесь

Изменение игрового объекта
Добрый день! Есть дерево которое создается по нажатию кнопки, растет и дает яблоки. Проблема...

Моментальное изменение содержимого поля, после изменения другого поля
Всем привет. Есть страничка на JSF(Java), где находится несколько полей, в которых указывается...

Динамическое изменение маски ввода поля по значению из поля со списком
Есть две таблицы. В Т1 есть поле со списком &quot;Гражданство&quot;, значения берутся из Т2. Т2 имеет три...

Автоматическое построение игрового поля
есть такой код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int main(){ //переменные int move =...

Инициализация игрового поля с анимацией
https://drive.google.com/folderview?id=0B4GhpKcqpvU7UGVCNDE0VXdyclU&amp;usp=sharing Вот простой...

2048, очистка игрового поля
Есть код игры 2048, написан давно, сейчас понадобился, не могу разобраться в каком месте происходит...


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

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