Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 2

Создание логики игры и двойная буферизация консоли

08.01.2018, 06:24. Показов 1423. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть консольная игра (змейка). Хотелось бы усовершенствовать ее, а именно : убрать мерцания, которые возникают в результате постоянного обновления карты, и сделать так, чтобы можно было менять скорость самой змейки(а то уж слишком быстрая). Слышал, что мерцание можно убрать благодаря двойной буферизации, но только совсем нет опыта работы с ней. Не сочтите трудом помочь, так как недавно начал изучать c++. P.s. надеюсь все правильно сделал, а то первый раз на этом сайте.
C++ (Qt)
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
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
using namespace std;
bool gameover = false;
const int width = 20;
const int height = 20;
int x,y,pointx,pointy,score;
int tailx[100] = {0};
int taily[100] = {0};
int ntail = 0 ;
enum comand{STOP = 0,LEFT,RIGHT,UP,DOWN};
comand dir;
void setup(){  //  настройки
gameover = false;
dir = STOP;
x = width/2-1;
y = height/2-1;
pointx = rand()%width;
pointy = rand()%height;
score = 0;
}
void drow(){  //   прорисовка карты
    system("cls");
for(int i=0;i<width+1;i++)
        cout<<"#";
        cout<<endl;
for(int i=0;i<height;i++){
    for(int j=0;j<width;j++){
            if(j==0 || j==width-1)
            cout<<"#";
            if(i==y && j==x)
                cout<<"0";
             else if(i==pointy && j==pointx)
                cout<<"p";
             else{
                    bool print = false;
               for(int k=0;k<ntail;k++){
                if(tailx[k]== j && taily[k]==i){
                    print = true;
                    cout<<"o";}
                }
                if(!print)
             cout<<" ";}}
            cout<<endl;}
for(int i=0;i<width+1;i++)
        cout<<"#";
    cout<<endl;
    cout<<"счет: "<<score<<endl;
}
void input(){   //  проверяет входные файлы
  if(_kbhit()){
    switch(_getch()){
    case 'a':
       dir = LEFT;
       break;
    case 'd':
        dir = RIGHT;
        break;
    case 'w':
        dir = UP;
        break;
    case 's':
        dir = DOWN;
        break;
    case 'x':
        gameover = true;
        break;}
  }
}
void logica(){//  логика игры
  int prevx = tailx[0];
  int prevy = taily[0];
  int prev2x, prev2y;
  tailx[0] = x;
  taily[0] = y;
  for(int i=1;i<ntail;i++){
    prev2x = tailx[i];
    prev2y = taily[i];
    tailx[i] = prevx;
    taily[i] = prevy;
    prevx = prev2x;
    prevy = prev2y;
  }
  switch(dir){
  case LEFT:
      x--;
      break;
  case RIGHT:
    x++;
    break;
  case UP:
    y--;
    break;
  case DOWN:
    y++;
    break;}
  if(x>width-2 || x<0 || y>height-1 || y<0)
    gameover = true;
    for(int i=0;i<ntail;i++){
        if(tailx[i]==x && taily[i]==y)
            gameover = true;
    }
  if(pointx>width-2 || pointx<0 || pointy>height-1 || pointy<0){
    pointx = rand()%width;
    pointy = rand()%height;
  }
  if(x == pointx && y == pointy){
    score = score+10;
    pointx = rand()%width;
    pointy = rand()%height;
    ntail++;
    }
}
int main(){
    setlocale(0,"");
    srand(time(NULL));
    setup();
while(!gameover){
   drow();
   input();
   logica();
}
   system("pause");
return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2018, 06:24
Ответы с готовыми решениями:

Двойная буферизация консоли
У меня есть консольная программа(что-то типа игры) с картой, когда эта карта воспроизводится во время перемещения она мерцает. Не сочтите...

Двойная буферизация
Написал тетрис (но только с палочками (друг попросил сделать =) )) Писал на чистом WinAPI, в WM_PAINT происходит сначала отрисовка...

Двойная буферизация
Добрый день. Программа должна принимать текст с клавиатуры, выводить его на экран и реагировать на '+' и '-', увеличивая и уменьшая текст...

4
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
08.01.2018, 18:21
Здравствуйте!
Похожая тема здесь уже была Двойная буферизация консоли
0
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 2
08.01.2018, 18:53  [ТС]
Я это уже неоднократно находил, но, к сожалению, не смог понять логики того, что именно должна делать эта часть кода(я про первый ответ в теме, на которую вы дали ссылку). А просто так переписывать это нет смысла, так как хочу понимать что делаю.
0
 Аватар для Старый воин
93 / 92 / 21
Регистрация: 16.08.2017
Сообщений: 188
Записей в блоге: 1
08.01.2018, 21:14
Ну там, по моему, более ценная информация чуть ниже содержится (все стандартные функции для работы с консолью). Среди них две для создания буфера и для переключения экранов. Думаю, в этом направлении копать нужно...
0
4 / 4 / 4
Регистрация: 15.11.2017
Сообщений: 86
10.01.2018, 16:19
Скорость змейки можно уменьшить команндой sleep после всех операций в main , цикл while.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2018, 16:19
Помогаю со студенческими работами здесь

Двойная буферизация
Добрый день! Имеется обычное оконное приложение Win32, необходимо реализовать при рисовании механизм двойной буферизации. Вот мой код, по...

Двойная буферизация не работает
почему то не работает Двойная Буферизация case WM_PAINT: { hdc=BeginPaint(hwnd,&amp;PaintStruct); GetClientRect(hwnd,&amp;rect); ...

Двойная буферизация графики
Дабы избавиться от мерцания изображения(фоновое изображение + побочные элементы + текс) прибегнул к использованию буферизации, проблема с...

Двойная буферизация, мерцание
Всем привет! Пишу просто графическое приложение на чистом WinApi и никак не могу разобраться с двойной буфферизацией. Попробовал...

Двойная буферизация в gdi+
Не могу разобраться, как правильно ее сделать. Есть функция: void createImage(wchar_t *path, int _abscissa, int _ordinate,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru