Форум программистов, компьютерный форум CyberForum.ru

Найти ошибку - C++

Восстановить пароль Регистрация
 
Александр321321
5 / 5 / 4
Регистрация: 11.11.2014
Сообщений: 223
30.01.2016, 18:37     Найти ошибку #1
Только что дописал змейку, вроде бы работает, только иногда, не появляется еда, хотя координаты её выводятся на экран. Предположительно она не появляется, потому что координаты совпали с телом змейки, но в коде это вроде бы прописано, проверьте плз. На всякий случай скину всё, а саму функцию с появлением еды сделаю жирной.
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
# include <iostream>
# include <windows.h>
# include <conio.h>
//using namespace std;
char symbol,a[100][100];
const int N = 13, M = 17;
int foodx,foody,snake_size, c_x, c_y, coordinates_x[100], coordinates_y[100];
 
 
void show_table()
// функция для вывода таблицы
{
    system("cls");
    // очищаем консоль
    for (int i = 0; i <= N + 1; ++i)  {
     for (int j = 0; j <= M + 1; ++j)  {
if (i == 0 || j == 0  || i == N + 1 || j == M + 1) {
        printf("#");
        if(j>M)
           printf("\n");
      }
else {
printf("%c",a[i][j]);
if(j>M)
 printf("\n");
 
}
     }
}
    }
 
    void show_snake_on_table()
{
     if(c_x == 1 && c_y == 0)
     a[coordinates_x[1]][coordinates_y[1]] = 'V';
     if(c_x == -1 && c_y == 0)
     a[coordinates_x[1]][coordinates_y[1]] = '^';
     if(c_x == 0 && c_y == 1)
     a[coordinates_x[1]][coordinates_y[1]] = '>';
     if(c_x == 0 && c_y == -1)
      a[coordinates_x[1]][coordinates_y[1]] = '<';
 
          for (int i = 2; i <= snake_size; ++i){
         a[coordinates_x[i]][coordinates_y[i]] = '*';
       }
}
   void clear_snake_on_table()
{
     for (int i = 1; i <= snake_size; i++)
      a[coordinates_x[i]][coordinates_y[i]] = ' ';
}
 
 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 klav(){
symbol = getch();
if (symbol=='w' & c_x != -1 & c_y != 0) {
     c_x = -1;
     c_y = 0;
}
if (symbol=='a' & c_x != 0 & c_y != -1) {
     c_x = 0;
     c_y = -1;
}
if (symbol=='s' & c_x != 1 & c_y != 0) {
     c_x = 1;
     c_y = 0;
}
if (symbol=='d' & c_x != 0 & c_y != 1) {
     c_x = 0;
     c_y = 1;
}
 
}
 
[B]void edaran(){
  foodx=random(N-1)+1;    //задаются рандомные координаты для еды
  foody=random(M-1)+1;
 }[/B]
 
void dead(){
  printf("Game over. Rezyltat = %i   ",snake_size) ;
  system("pause");
  exit(0);
}
 
[B]void eda(){
   for (int i = 1; i <= snake_size; ++i){
  if (a[foodx][foody]==a[coordinates_x[i]][coordinates_y[i]]) {   //тут проверяются координаты, чтобы не совпадали с змеёй, а если совпадают, то снова даются рандомные координаты
  edaran();
  }
  }
  a[foodx][foody]='q';   --сама еда
}[/B]
 
 
   void next_step()
{   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] += c_x;
     coordinates_y[1] += c_y;
      for (int i = 2; i <= snake_size ; i++) {
    if (coordinates_x[1] ==  coordinates_x[i] && coordinates_y[1]==coordinates_y[i]) {
      dead();
    }
    if (a[coordinates_x[1]][coordinates_y[1]]=='q') {
 
      a[foodx][foody]=' ';
      eda();
          snake_size= snake_size++;
    }
 
          check_coordinates();
 
         show_snake_on_table();
 
    }
}
 
 
 
void standart_settings()
{
     snake_size = 9;
     edaran();
     coordinates_x[1] = 7;
     coordinates_y[1] = 1;
     c_x = 0;
     c_y = 1;
        eda();
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{ int r=snake_size-9;
  standart_settings();
for (int e=1;e<30;e++)   {
        if (kbhit() == true)
         klav();
 
     show_table();
      next_step();
     if (e>=25) {
     e=0;
     }
     r=snake_size-9;
     printf("Vash Rezyl'tat %i   %i %i",r, foodx,foody);
}
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2016, 18:37     Найти ошибку
Посмотрите здесь:

найти ошибку... C++
C++ найти ошибку
C++ Найти ошибку.
C++ Найти ошибку
C++ Найти ошибку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Valera_
 Аватар для _Valera_
486 / 368 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
30.01.2016, 19:03     Найти ошибку #2
Цитата Сообщение от Александр321321 Посмотреть сообщение
сделаю жирной
не удалось ....


предположу так
C++
1
2
3
4
5
6
7
8
9
void eda(){
   for (int i = 1; i <= snake_size; ++i){
  if (a[foodx][foody]==a[coordinates_x[i]][coordinates_y[i]]) {   //тут проверяются координаты, чтобы не совпадали с змеёй, а если совпадают, то снова даются рандомные координаты
  edaran();
   i = 1;
  }
  }
  a[foodx][foody]='q';   --сама еда
}
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
30.01.2016, 19:23     Найти ошибку #3
Цитата Сообщение от Александр321321 Посмотреть сообщение
проверьте плз.
почему вы сравниваете размер через <=, а не просто < ?

я добавил недостающую функцию рандома,
исправил несколько ошибок компиляции.

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

первый же запуск игры привел к её зависанию.
змейка двигалась, но не реагировала на управление.

думаю дело не в цикле.
если бы это был цикл - она бы зависла,
но перерисовка шла, и змейка двигалась.

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


далее я причесал немножко код, устранив предупреждения компилятора.

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



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
// =======================================================================
// =======================================================================
 
#include <random>
#include <chrono>
 
int random(const int a, const int b)
{
    static std::default_random_engine gen(
        static_cast<unsigned>(
            std::chrono::system_clock::now().time_since_epoch().count()
        )
    );
    std::uniform_int_distribution<int> distribution(a, b);
    return distribution(gen);
}
 
// =======================================================================
// =======================================================================
 
 
#include <iostream>
#include <conio.h>
 
char a[100][100];
 
const size_t N = 13, M = 17;
 
size_t snake_size = 0;
int foodx, foody, c_x, c_y, coordinates_x[100], coordinates_y[100];
 
// функция для вывода таблицы 
void show_table()
{
    system("cls");
 
    // очищаем консоль
    for (size_t i = 0; i <= N + 1; ++i)  
    {
        for (size_t j = 0; j <= M + 1; ++j)  
        {
            if (i == 0 || j == 0 || i == N + 1 || j == M + 1) 
            {
                printf("#");
                if (j > M)
                    printf("\n");
            }
            else 
            {
                printf("%c", a[i][j]);
                if (j > M)
                    printf("\n");
            }
        }
    }
}
 
void show_snake_on_table()
{
    if (c_x == 1 && c_y == 0)
        a[coordinates_x[1]][coordinates_y[1]] = 'V';
    if (c_x == -1 && c_y == 0)
        a[coordinates_x[1]][coordinates_y[1]] = '^';
    if (c_x == 0 && c_y == 1)
        a[coordinates_x[1]][coordinates_y[1]] = '>';
    if (c_x == 0 && c_y == -1)
        a[coordinates_x[1]][coordinates_y[1]] = '<';
 
    for (size_t i = 2; i < snake_size; ++i){
        a[coordinates_x[i]][coordinates_y[i]] = '*';
    }
}
void clear_snake_on_table()
{
    for (size_t i = 1; i < snake_size; i++)
        a[coordinates_x[i]][coordinates_y[i]] = ' ';
}
 
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 klav(){
    auto symbol = _getch();
    if (symbol == 'w' && c_x != -1 && c_y != 0)
        c_x = -1,
        c_y = 0;
    else if (symbol == 'a' && c_x != 0 && c_y != -1)
        c_x = 0,
        c_y = -1;
    else if (symbol == 's' && c_x != 1 && c_y != 0)
        c_x = 1,
        c_y = 0;
    else if (symbol == 'd' && c_x != 0 && c_y != 1)
        c_x = 0,
        c_y = 1;
}
 
//задаются рандомные координаты для еды
void edaran()
{
    foodx = random(0, N - 1) + 1;
    foody = random(0, M - 1) + 1;
}
 
void dead(){
    printf("Game over. Rezyltat = %i   ", snake_size);
    system("pause");
    exit(0);
}
 
void eda(){
 
    for (size_t i = 1; i < snake_size; ++i)
        //тут проверяются координаты, чтобы не совпадали с змеёй, а если совпадают, то снова даются рандомные координаты
        if (a[foodx][foody] == a[coordinates_x[i]][coordinates_y[i]])
            edaran();
    a[foodx][foody] = 'q';
}
 
void next_step()
{
    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] += c_x;
    coordinates_y[1] += c_y;
    for (size_t i = 2; i <= snake_size; i++)
    {
        if (coordinates_x[1] == coordinates_x[i] && coordinates_y[1] == coordinates_y[i])
            dead();
 
        if (a[coordinates_x[1]][coordinates_y[1]] == 'q')
            a[foodx][foody] = ' ',
            eda(),
            ++snake_size;
 
        check_coordinates();
        show_snake_on_table();
    }
}
 
void standart_settings()
{
    snake_size = 9;
    edaran();
    coordinates_x[1] = 7;
    coordinates_y[1] = 1;
    c_x = 0;
    c_y = 1;
    eda();
}
 
 
 
int main()
{
    int r = snake_size - 9;
    standart_settings();
 
    for (int e = 1; e < 30; e++)
    {
        if (_kbhit() != 0)
            klav();
 
        show_table();
        next_step();
 
        if (e >= 25)
            e = 0;
 
        r = snake_size - 9;
        printf("Vash Rezyl'tat %i   %i %i", r, foodx, foody);
    }
 
    _getch();
}
рекомендую вас сейчас немножко забить на возможные глюки,
сосредоточившись на игровом дизайне.

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

а ещё вот такой момент: змейка бегает, как сумасшедшая.
слишком быстро.

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

при достижении нового уровня - скорость повышается.

а при отладке станет проще отлавливать всякие глюки.
Александр321321
5 / 5 / 4
Регистрация: 11.11.2014
Сообщений: 223
30.01.2016, 20:10  [ТС]     Найти ошибку #4
Сейчас увы нет времени даже всё прочитать) Ну змейка не реагировала на управления, так как надо язык поменять при начале игры) Через некоторое время прочитаю и отвечу

Добавлено через 30 минут
Это всё понятно, мне эту игру никому сдавать не надо, я её написал ради тренировки) Так что все возможные бонусы это такое себе, они проблем не придадут. Не знаю в чём проблема у вас была змейкой управлять, у меня всё нормально, только нужно язык менять, каждый раз когда запускаешь. Как убрать моргания, честно говоря, не знаю. Когда сдавал свой первый курсач на VCL, тоже были моргания причём у всех и нам сказали что это из-за компа, типо не тянет или что-то в том роде. А на счёт дизайна я без понятия что тут можно) Это же консоль.
И всё-таки есть проблема с появлением едой, ничего по этому поводу не скажете? Иногда бывает, что она не появляется. хотя координаты её с низу показывает. Так и не нашёл в чём проблема
_Valera_
 Аватар для _Valera_
486 / 368 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
30.01.2016, 20:27     Найти ошибку #5
Цитата Сообщение от Александр321321 Посмотреть сообщение
всё-таки есть проблема с появлением едой, ничего по этому поводу не скажете? Иногда бывает, что она не появляется. хотя координаты её с низу показывает. Так и не нашёл в чём проблема
ты мои исправления учел?
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
30.01.2016, 20:29     Найти ошибку #6
Цитата Сообщение от Александр321321 Посмотреть сообщение
И всё-таки есть проблема с появлением едой, ничего по этому поводу не скажете? Иногда бывает, что она не появляется. хотя координаты её с низу показывает. Так и не нашёл в чём проблема
такой ситуации не наблюдал.

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


Цитата Сообщение от Александр321321 Посмотреть сообщение
Как убрать моргания, честно говоря, не знаю. Когда сдавал свой первый курсач на VCL, тоже были моргания причём у всех и нам сказали что это из-за компа, типо не тянет или что-то в том роде.
игрушки 3х мерные тянут даже самые отсталые компы,
а вывести кучку символов уже не в состоянии?
вам солгали.


вообще, на мой взгляд,
тема рисования - самая интересная в разработке консольных игрушек.
нужна двойная буферизация.
и годный алгоритм рисования.

тогда можно будет организовать красивую,
и плавную цветную аски-арт анимацию.

и это будет работать на любых,
самых отсталых машинах.


можно делать красивое меню (как в FAR, например),
реакцию на клавиши и мышку.
Александр321321
5 / 5 / 4
Регистрация: 11.11.2014
Сообщений: 223
30.01.2016, 21:07  [ТС]     Найти ошибку #7
С начало не заметил. Вроде бы ни с того ни с сего всё стало работать, но на всякий случай сделал как вы.
_Valera_
 Аватар для _Valera_
486 / 368 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
30.01.2016, 21:11     Найти ошибку #8
Цитата Сообщение от Александр321321 Посмотреть сообщение
Вроде бы ни с того ни с сего всё стало работать
Этот удивительный мир программирования)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2016, 21:17     Найти ошибку
Еще ссылки по теме:

найти ошибку? C++
C++ Найти ошибку
C++ Найти сумму целых отрицательных чисел удовлетворяющих условию (найти и исправить ошибку в коде)

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

Или воспользуйтесь поиском по форуму:
Александр321321
5 / 5 / 4
Регистрация: 11.11.2014
Сообщений: 223
30.01.2016, 21:17  [ТС]     Найти ошибку #9
Будем экспериментировать
Yandex
Объявления
30.01.2016, 21:17     Найти ошибку
Ответ Создать тему
Опции темы

Текущее время: 07:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru