Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/218: Рейтинг темы: голосов - 218, средняя оценка - 4.77
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383

Консольная змейка

31.07.2013, 16:22. Показов 40607. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал консольную змейку, но почему-то не работает управление
Ну, как не работает, цвет на пробел то меняется, но W, A, S, D чтоб двигаться не работают
Пробовал стрелками (на клавиатуре), тоже не работает

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
229
#include "stdafx.h"
# 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2013, 16:22
Ответы с готовыми решениями:

Консольная змейка
Добрый день. С недавнего времени я пишу в консоли игру с одноименным названием. Занятие, прошу заметить, довольно увлекательное :) ...

C++ Консольная змейка. Код
Доброго времени суток. Недавно я начал учиться программировать. И вот задался я целью написать консольную змейку. Кодил я кодил и пришел...

Консольная змейка. Кто что скажет? )
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;windows.h&gt; #include&lt;time.h&gt; #include&lt;stdlib.h&gt; //#include&lt;iostream&gt; ...

20
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
31.07.2013, 16:37
А у меня все работает.
Кстати как она лихо сквозь стены проходит. )))

Попробуйте пройтись в режиме отладки - посмотреть что происходит во время нажатия клавиш, какие коды и т.д.
0
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 16:38  [ТС]
Может это из-за MSVS
Помнится я когда-то такой же код компилил в Code Blocks, тоже всё работало
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.07.2013, 16:39
По ходу, лажа в ф-ции change_direction, там эти условия левые наверно. Я удалил их и змейка стала двигаться.
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
229
#include "stdafx.h"
# 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': { change_x = -1; change_y = 0; } break;
         case 'a': { change_x = 0; change_y = -1; } break;
         case 's': { change_x = 1; change_y = 0; } break;
         case 'd': { 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
 Аватар для h_wolf
11 / 11 / 2
Регистрация: 24.01.2013
Сообщений: 212
31.07.2013, 16:40
как ни странно но в Code::Blocks все работает
0
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 16:41  [ТС]
Хмм, в Code Blocks скомпилировал, тоже не работает
Отладчиком?
Я не особо владею всякими там OllyDbg, и т.д.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.07.2013, 16:42
Цитата Сообщение от Даниил Посмотреть сообщение
OllyDbg
это ж дизассемблер
0
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 16:44  [ТС]
Цитата Сообщение от Dani Посмотреть сообщение
По ходу, лажа в ф-ции change_direction, там эти условия левые наверно. Я удалил их и змейка стала двигаться.
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
229
#include "stdafx.h"
# 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': { change_x = -1; change_y = 0; } break;
         case 'a': { change_x = 0; change_y = -1; } break;
         case 's': { change_x = 1; change_y = 0; } break;
         case 'd': { 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);
        // "усыпляем" программу на заданный интервал
    }
}
Тоже не работает

Добавлено через 36 секунд
А что вы имеете ввиду под словом отладчик? Я вообще не шарю в таких вещах
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
31.07.2013, 16:46
Даниил, то, что я Вам написал работает в MSVS 2012. Это для WASD
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
31.07.2013, 16:58
Цитата Сообщение от Даниил Посмотреть сообщение
А что вы имеете ввиду под словом отладчик?
Точку остановки поставить в требуемом месте и в пошаговом режиме просмотреть что там происходит.
0
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 16:59  [ТС]
У меня 2008

Добавлено через 36 секунд
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Точку остановки поставить в требуемом месте и в пошаговом режиме просмотреть что там происходит.
А вот тут можно пожалуйста подробнее? Я не знаю как это всё делается
0
40 / 40 / 5
Регистрация: 05.12.2011
Сообщений: 343
31.07.2013, 17:00
Возможно, это из-за раскладки клавиатуры, если включен русский язык, то клавиши будут иметь другой код.
1
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 17:01  [ТС]
Цитата Сообщение от stragger Посмотреть сообщение
Возможно, это из-за раскладки клавиатуры, если включен русский язык, то клавиши будут иметь другой код.
Ахах, какой же я долбень, спасибо, проблема была в раскладке
0
40 / 40 / 5
Регистрация: 05.12.2011
Сообщений: 343
31.07.2013, 17:02
Даниил, бывает
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
31.07.2013, 17:03
Цитата Сообщение от Даниил Посмотреть сообщение
А вот тут можно пожалуйста подробнее?
Обычная отладка, точки останова.
Цитата Сообщение от Даниил Посмотреть сообщение
проблема была в раскладке
Бгг. ))
1
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
31.07.2013, 17:07  [ТС]
И вам спасибо большое
1
1 / 1 / 0
Регистрация: 03.02.2017
Сообщений: 5
03.02.2017, 13:30
Когда запускаешь твою игру смени язык на англ у меня тоже VS 2012 и все работает
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.02.2017, 15:06
Fedor0781, ТС уже покинул нас
Последняя активность: 05.09.2014 14:52
Тема вообще 4-летней давности и ответ был уже дан.
0
0 / 0 / 0
Регистрация: 04.11.2018
Сообщений: 1
04.11.2018, 12:39
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
symbol = getch();
     // считываем нажатую клавишу с помощью функции getch()
     switch (symbol)
     {
         case 72: if(change_x != 1 || change_y != 0) { change_x = -1; change_y = 0; } break;
         case 75: if(change_x != 0 || change_y != 1) { change_x = 0; change_y = -1; } break;
         case 80: if(change_x != -1 || change_y != 0) { change_x = 1; change_y = 0; } break;
         case 77: if(change_x != 0 || change_y != -1) { change_x = 0; change_y = 1; } break;
         // управление змейкой у нас через wasd
         case 32 : change_color(); break;
         // если нажат пробел, то меняем цвет консоли
         default : break;
     }
вот код для управления стрелками, только переменную symbol надо еще целочисленной сделать и все будет работать.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
04.11.2018, 18:21
Еще один некрофил поднимает устаревшую и неактуальную тему 2013 года чтобы отписаться об устаревшей и неактуальной технологии (conio.h)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2018, 18:21
Помогаю со студенческими работами здесь

Консольная Змейка: фрукт генерируется за пределами карты
Здравствуйте! Я написал консольную змейку на с++. В ней всё работает нормально, но есть один баг. Через некоторое время фрукт генерируется...

Консольная графика С++
Сейчас пишу для экзамена покер на одного игрока. И столкнулся проблемой, при рисовании карт, они у меня рисуются одна под одной и по этому...

Консольная графика
Доброго времени суток. Подскажите, как подключить консольную графику в visual studio 2013?

Консольная программа...
Здравствуйте! Прошу помочь с написанием консольной программы, которая вводит с консоли значения элементов двумерного массива целых чисел...

Qt + консольная программа
Написал консольную программу, теперь хочу подключить ее к другой программе на QT, но столкнулся с тем, что в QT видимо как то по своему...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru