Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
1tuz
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 3
#1

"Змейка", не работают кнопки направления движения - C++

05.05.2015, 23:57. Просмотров 1147. Ответов 6
Метки нет (Все метки)

Всем привет!
Нашёл рабочий программный код змейки в С++,откомпилированный и запущенный в Dev C++
При запуске не работают кнопки направления движения змейки.
Подскажите пожалуйста,в чём проблема
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# include <iostream>
# include <windows.h>
# include <time.h>
// библиотека, нужна для использования функции Sleep()
# include <conio.h>
// библиотека, нужна для использования функций kbhit() и getch()
using namespace std;char main_color[] = "color ##";
// шаблон для цвета
int snake_size, change_x, change_y, coordinates_x[1000], coordinates_y[1000], food_x = -1, food_y = -1;
/*
    snake_size - размер змейки
    change_x, change_y - в какую сторону движется змейка
    coordinates_x[1000], coordinates_y[1000] - массивы, хранящие координаты частей тела змейки
    food_x, food_y - координаты еды
    PS: координаты головы змейки хранятся в coordinates_x[1], coordinates_y[1]
*/
char symbol, a[1000][1000];
/*
    symbol - хранит в себе ASCII код нажатой клавиши
    a[1000][1000] - наша таблица, в которой происходит вся игра
*/
const int N = 13, M = 17, INTERVAL = 200;
/*
    константы,
    N - размер таблицы, а именно высота
    M - ширина таблицы
    INTERVAL - интервал в миллисекундах, через каждый этот промежуток времени змейка будет передвигаться
*/
void change_color()
// функция изменения цвета консоли
{
     char x = rand() % 16, y = rand() % 16;
     if (x == y)
      ++y;
     y %= 16;
     if (x > 9)
      x += 'A' - 10;
     else
      x += '0';
     if (y > 9)
      y += 'A' - 10;
     else
      y += '0';
     // выбираем рандомные цвета
     main_color[6] = x;
     main_color[7] = y;
     system(main_color);
     // меняем цвет
}
void change_direction()
// функция, считывающая нажатую клавишу
{
     symbol = getch();
     // считываем нажатую клавишу с помощью функции getch()
     switch (symbol)
     {
         case 'w': if(change_x != 1 || change_y != 0) { change_x = -1; change_y = 0; } break;
         case 'a': if(change_x != 0 || change_y != 1) { change_x = 0; change_y = -1; } break;
         case 's': if(change_x != -1 || change_y != 0) { change_x = 1; change_y = 0; } break;
         case 'd': if(change_x != 0 || change_y != -1) { change_x = 0; change_y = 1; } break;
         // управление змейкой у нас через wasd 
         case 32 : change_color(); break;
         // если нажат пробел, то меняем цвет консоли
         default : break; 
     }
}
void show_table()
// функция для вывода таблицы
{
    system("cls");
    // очищаем консоль
    for (int i = 0; i <= N + 1; ++i)
     for (int j = 0; j <= M + 1; ++j)
      cout << (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : a[i][j]) << (j <= M ? "" : "\n");
    // выводим таблицу и края
}
void clear_snake_on_table()
// очищаем координаты, в которых располагалась змейка
{
     for (int i = 1; i <= snake_size; ++i)
      a[coordinates_x[i]][coordinates_y[i]] = ' ';
}
void show_snake_on_table()
// красим координаты змейки
{
     if(change_x == 1 && change_y == 0) a[coordinates_x[1]][coordinates_y[1]] = 'v';
     if(change_x == -1 && change_y == 0) a[coordinates_x[1]][coordinates_y[1]] = '^';
     if(change_x == 0 && change_y == 1) a[coordinates_x[1]][coordinates_y[1]] = '>';
     if(change_x == 0 && change_y == -1) a[coordinates_x[1]][coordinates_y[1]] = '<';
     // изменяем тип головы
 
     for (int i = 2; i <= snake_size; ++i)
      a[coordinates_x[i]][coordinates_y[i]] = '@';
     // красим змейку
}
bool game_over()
// проверяем, съела ли змейка саму себя
{
     for (int i = 2; i <= snake_size; ++i)
      if (coordinates_x[1] == coordinates_x[i] && coordinates_y[1] == coordinates_y[i]) return true;
     // если координаты головы змейки равны координате какой-либо части тела змейки, то змейка съела саму себя
     return false;
     // если все координаты различны, то все в порядке - играем дальше
}
void check_coordinates()
// проверяем, не вышла ли змейка за поле, если да то возвращаем ее обратно
{
    if (coordinates_x[1] > N) coordinates_x[1] = 1;
    if (coordinates_x[1] < 1) coordinates_x[1] = N;
    if (coordinates_y[1] > M) coordinates_y[1] = 1;
    if (coordinates_y[1] < 1) coordinates_y[1] = M;
}
void next_step()
// функция следующего хода, в которой наша змейка сдвигается в сторону на 1 ячейку
{
     clear_snake_on_table();
     // чистим таблицу от змейки
 
     for (int i = snake_size; i >= 2; --i)
     {
         coordinates_x[i] = coordinates_x[i - 1];
         coordinates_y[i] = coordinates_y[i - 1];
     }
     // передвигаем тело змейки
 
     coordinates_x[1] += change_x;
     coordinates_y[1] += change_y;
     // передвигаем голову змейки
 
     check_coordinates();
     // проверяем в порядке ли координаты
 
     if(coordinates_x[1] == food_x && coordinates_y[1] == food_y)
     {
         snake_size++;
         food_x = -1;
         food_y = -1;
     }
     // если голова змейки там же где и еда, то увеличиваем размер змейки и очищаем координаты змейки
 
     show_snake_on_table();
     // рисуем змейку
 
     if (game_over() == true)
     // если змея укусила себя
     {
         cout << "You're looser! \n";
         // сообщаем всю правду о игроке
         system("pause");
         // приостанавливаем игру
         exit(0);
         // завершаем программу
     }
}
bool food_check()
// функция проверки на наличие еды на карте
{
     if(food_x == -1 && food_y == -1) return false;
     // если координаты еды неопределенны то возвращаем true
     return true;
     // в остальных случаях false
}
void place_food()
// функция добавления еды на карту
{
     srand(time(NULL));
     for (int i = 1; i <= 9; ++i)
     {
         int x = rand(), y = rand();
         if(x < 0) x *= -1;
         if(y < 0) y *= -1;
         x %= (N + 1);
         y %= (M + 1);
         if(x == 0) ++x;
         if(y == 0) ++y;
         if(a[x][y] != '@' && a[x][y] != 'v' && a[x][y] != '^' && a[x][y] != '<' && a[x][y] != '>')
         {
             food_x = x;
             food_y = y;
             a[x][y] = '+';
             return;
         }
     }
     // ставим в рандомное место еду
}
void standart_settings()
// начальные установки
{
     snake_size = 2;
     // размер змеи - 2
 
     coordinates_x[1] = 1;
     coordinates_y[1] = 2;
     coordinates_x[2] = 1;
     coordinates_y[2] = 1;
     // змейка занимает две клетки вправо от координаты {1,1}
 
     change_x = 0;
     change_y = 1;
     // змейка движется вправо
}
int main ()
{
    standart_settings();
    // задаем стандартные настройки
 
    while (1)
    // бесконечный цикл
    {
        if (kbhit() == true)
        // если нажата клавиша
         change_direction();
         // обрабатываем нажатую клавишу
 
        next_step();
        // двигаем змейку
 
        if(food_check() == false)
         place_food();
        // если нет еды, то ставим ее
 
        show_table();
        // рисуем змейку
 
        Sleep(INTERVAL);
        // "усыпляем" программу на заданный интервал
    }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2015, 23:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос "Змейка", не работают кнопки направления движения (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Загрузка информации из файла (система рекордов в игре "Змейка") - C++
Не получается сделать считывание из файла и загрузки рекорда,помогите.Пытался сам,но всё запорол#include &lt;glut.h&gt; #include &lt;iostream&gt; ...

"Змейка": при нажатии клавиши игра просто останавливается - C++
#include&lt;iostream&gt; #include&lt;windows.h&gt; #include&lt;conio.h&gt; using namespace std; const int Y = 20, X = 50; enum DIR{UP, DOWN, LEFT,...

Пишу игру "змейка". Есть вопрос по ней - C++
Я сейчас пишу игру &quot;змейка&quot;. (в консоли), но возникла одна проблема. Направление движения от пользователя я принимаю так: раз в секунду...

Как реализовать взаимодействие классов в игре "Змейка" - C++
Всем привет. Я пишу змейку и у меня следующий вопрос. У меня есть несколько классов Game, Snake, Block, Food. Каждый класс в отдельном...

6
egor2116
451 / 375 / 42
Регистрация: 20.01.2013
Сообщений: 1,135
06.05.2015, 09:23 #2
Игра запускается,но змейка не поворачивается.
Управление
верх - w
вниз - s
вправо - d
влево - a

Добавлено через 3 минуты
Это тема, дубликат "Змейка", не работают кнопки направления движения
0
1tuz
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 3
06.05.2015, 12:37  [ТС] #3
Спасибо конечно,но я знаю итак,где кнопки управления,проблема в том,что они не работают...
Пробовал менять на другие клавиши в коде - всёравно не поворачивается
0
egor2116
451 / 375 / 42
Регистрация: 20.01.2013
Сообщений: 1,135
06.05.2015, 12:39 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Спасибо конечно,но я знаю итак,где кнопки управления,проблема в том,что они не работают
Работают я только что проверял. Обратите внимание на раскладку клавиатуры.
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25535 / 17088 / 5416
Регистрация: 22.10.2011
Сообщений: 30,257
Записей в блоге: 7
06.05.2015, 12:41 #5
Нормально все работает, проверено на gcc, который и твой DevC++ использует.
0
1tuz
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 3
06.05.2015, 16:06  [ТС] #6
Цитата Сообщение от egor2116 Посмотреть сообщение
Работают я только что проверял. Обратите внимание на раскладку клавиатуры.
Спасибо огромное,я об этом вообще не думал.
Всё работает)))
0
egor2116
06.05.2015, 16:11     "Змейка", не работают кнопки направления движения
  #7

Не по теме:

если хотите выразить благодарность есть кнопка +1 Спасибо

0
06.05.2015, 16:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2015, 16:11
Привет! Вот еще темы с ответами:

Небольшой пример. Игра "змейка" - как в ней делают препятствия - C++
Здравствуйте сегодня случайно увидел старенькую игру &quot;змейка&quot; и меня заинтересовало как именно они делают там препятствия чтобы их нужно...

Исправление кода игры "Змейка" - C++
Добрый вечер, помогите исправить код(игра змейка), на данный момент когда запускаю игру, появляется 5 яблок, после того как змейка ест...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru