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

Пишу консольную змейку, крашит при увеличении размера - C++

Восстановить пароль Регистрация
 
X-User
 Аватар для X-User
2 / 2 / 0
Регистрация: 12.08.2014
Сообщений: 23
04.07.2015, 17:51     Пишу консольную змейку, крашит при увеличении размера #1
Появилось желание сделать свою игру на С++, так как нужно начинать с простого, решил сделать простую змейку. Нашёл в интернете пример, и взялся его переписывать. Пока что убрал некоторые функции, оставил только управление и вывод на экран. Вот пример:

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
# include <iostream>
# include <windows.h>
# include <time.h>
# include <conio.h>
 
using namespace std;
 
int snake_size, dir_x, dir_y, coordinates_x[1000], coordinates_y[1000];
char C, a[1000][1000];
const int N = 10, M = 14, INTERVAL = 240;
 
void Output_Field()
 
{
    system("cls");
    
    for (int i = 0; i <= N; ++i)
     for (int j = 0; j <= M; ++j)
      cout << (i == 0 || j == 0 || i == N || j == M ? '#' : 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 Snake_On_Field ()
 
{
     if(dir_x == 1 && dir_y == 0) a[coordinates_x[1]][coordinates_y[1]] = 'v';
     if(dir_x == -1 && dir_y == 0) a[coordinates_x[1]][coordinates_y[1]] = '^';
     if(dir_x == 0 && dir_y == 1) a[coordinates_x[1]][coordinates_y[1]] = '>';
     if(dir_x == 0 && dir_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 Check_Out ()
 
{
    if (coordinates_x[1] == N) coordinates_x[1] = 1;
    if (coordinates_x[1] == 0) coordinates_x[1] = N-1;
    if (coordinates_y[1] == M) coordinates_y[1] = 1;
    if (coordinates_y[1] == 0) coordinates_y[1] = M-1;
}
void next_step()
 
{   
 
     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] += dir_x;
     coordinates_y[1] += dir_y; 
 
    Check_Out();
    Snake_On_Field ();
  
}
void standart_settings()
{
     snake_size = 4;
     
 
     coordinates_x[1] = 4;
     coordinates_y[1] = 4;
    
     
 
     dir_x = 0;
     dir_y = 1;
}
void Change_Dir ()
{
     C = _getch();
     switch (C)
     {
         case 'd': if (dir_x != 0 && dir_y != -1) { dir_x = 0;dir_y = 1; } break;
         case 'w': if (dir_x != 1 && dir_y != 0) { dir_x = -1; dir_y = 0;} break;
         case 'a': if (dir_x != 0 && dir_y != 1){ dir_x = 0; dir_y = -1; } break;
         case 's': if (dir_x != -1 && dir_y != 0){ dir_x = 1; dir_y = 0; } break;
         
         default : break; 
     } 
};
 
int main ()
{
    standart_settings();
    
    while (1)
    
    {
        if (_kbhit())
        Change_Dir();
 
        clear_snake_on_table();
        next_step();          
        Output_Field();
 
        Sleep(120);
        
    }
}
Вот мой код, пишу через класс.

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
#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
using namespace std;
 
class Snake
{
private:
    char Game_Field[100][100],C;
    int W, H, dir_x, dir_y, snake_size;
    int coord_x[100];
    int coord_y[100];
    
public:
     Snake (): W(14), H(10), dir_x(1), dir_y(0), snake_size(2)
    {
        coord_x[0] = 7; coord_y[0] = 5;     
    }
 
void Output_Field ()
{
    system ("cls");
    for (int h = 0; h <= H; h++)
        {
            for (int w = 0; w <= W; w++)
                {
                    if ((w == 0) || (h == 0) || (w == W) || (h == H)) cout << '#';
                    else cout << Game_Field[w][h];
                }   cout << endl;
        } 
}
 
void Snake_On_Field ()
{
    
    if ((dir_x == 1)&&(dir_y == 0)) Game_Field[coord_x[0]][coord_y[0]] = '>';
    if ((dir_x == -1)&&(dir_y == 0)) Game_Field[coord_x[0]][coord_y[0]] = '<';
    if ((dir_x == 0)&&(dir_y == 1)) Game_Field[coord_x[0]][coord_y[0]] = '^';
    if ((dir_x == 0)&&(dir_y ==-1)) Game_Field[coord_x[0]][coord_y[0]] = 'v';
 
    for (int i = 1; i < snake_size; i++)
        Game_Field[coord_x[i]][coord_y[i]] = '@';
}
 
void Next_Step ()
{
    
    for (int i = snake_size-1; i >= 1; i--)
    {
        coord_x[i] = coord_x[i-1];
        coord_y[i] = coord_y[i-1];
    }
 
    coord_x[0]+=dir_x;      coord_y[0]-=dir_y;
 
    Snake_On_Field ();
    Check_Out (); 
    
}
 
void Clear_Field ()
{
     for (int i = 0; i <= H; i++)
            for (int j = 0; j < W; j++)
                Game_Field[j][i] = ' ';
}
 
void Check_Out ()
{
    if (coord_x[0] == 0) coord_x[0] = W-1; 
    if (coord_x[0] == W) coord_x[0] = 1;
    if (coord_y[0] == 0) coord_y[0] = H-1;
    if (coord_y[0] == H) coord_y[0] = 1;
}
 
void Change_Dir ()
{
     C = getch();
     switch (C)
     {
     case 'w': if (dir_x != 0 && dir_y != -1) { dir_x = 0;dir_y = 1; } break;
         case 'a': if (dir_x != 1 && dir_y != 0) { dir_x = -1; dir_y = 0;} break;
         case 's': if (dir_x != 0 && dir_y != 1){ dir_x = 0; dir_y = -1; } break;
         case 'd': if (dir_x != -1 && dir_y != 0){ dir_x = 1; dir_y = 0; } break;
         
         default : break; 
     }
}
 
};
 
int main ()
{
    Snake game;
 
    while (1)
    {
        if (_kbhit())
        game.Change_Dir();
 
        game.Clear_Field();     
        game.Next_Step (); 
        game.Output_Field();  
        
        Sleep(110); 
    }
 
    return 0;
}
Стандартные настройки закинул в консруктор, немного изменил названия ячеек и кое что по координатам. Значит проблема вот в чём - когда я ставлю размер змейки больше 2 (в конструкторе snake_size), то происходит краш при запуске, но в примере все отлично работает. Уже пару раз всё зверил, ошибок не нашёл. Прошу помочь решить эту проблему.. Чтобы я мог в коде указывать размер змейки, и оно не крашило. Спасибо.
Компиляция была в Dev C++ и VS 2012 Express
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 17:51     Пишу консольную змейку, крашит при увеличении размера
Посмотрите здесь:

Как прописать консольную команду C++
C++ Написать консольную программу
захотел написать консольную программку для пингования C++
Крашит из-за кривого условия, как залатать C++
C++ Написать консольную программу , выполняющую следующие действия
C++ Задача на консольную графику, нарисовать круги
Растрирование текста через консольную программу C++
Использование указателя AP в main.cpp крашит приложение C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Valera_
 Аватар для _Valera_
486 / 368 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
04.07.2015, 19:31     Пишу консольную змейку, крашит при увеличении размера #2
Цитата Сообщение от X-User Посмотреть сообщение
for (int i = 1; i < snake_size; i++)
* * * * Game_Field[coord_x[i]][coord_y[i]] = '@';
тут

Добавлено через 3 минуты
Шаг 1 :

Цитата Сообщение от X-User Посмотреть сообщение
coord_x[0] = 7; coord_y[0] = 5;
в конструкторе присвоили первым элемента массива значения, в остальных мусор.

Шаг 2 :

Цитата Сообщение от X-User Посмотреть сообщение
for (int i = 1; i < snake_size; i++)
* * * * Game_Field[coord_x[i]][coord_y[i]] = '@';
Послали под видом индексов мусор => программа упала.

Добавлено через 5 минут
Цитата Сообщение от X-User Посмотреть сообщение
char Game_Field[100][100],C;
* * int W, H, dir_x, dir_y, snake_size;
Динамический массив в помощь.

Добавлено через 8 минут
Цитата Сообщение от X-User Посмотреть сообщение
void Next_Step ()
{
for (int i = snake_size-1; i >= 1; i--)
* * {
* * * * coord_x[i] = coord_x[i-1];
* * * * coord_y[i] = coord_y[i-1];
* * }
coord_x[0]+=dir_x;* * * coord_y[0]-=dir_y;
Можно не перемещать всю змейку. Затираем хвост, на место головы ставим "тело", а на место куда должна пойти змейка - голову. Ну или сделайте список какой то....



Цитата Сообщение от X-User Посмотреть сообщение
int coord_x[100];
* * int coord_y[10
Сделайте очередь с указателями на ячейку, не экономно, как-то.
X-User
 Аватар для X-User
2 / 2 / 0
Регистрация: 12.08.2014
Сообщений: 23
04.07.2015, 20:38  [ТС]     Пишу консольную змейку, крашит при увеличении размера #3
Спасибо за помощь. Пробему решил. В конструкторе просто добавил
C++ (Qt)
1
for (int i = 1; i < 100; i++) { coord_x[i] = 0; coord_y[i] = 0; }
Yandex
Объявления
04.07.2015, 20:38     Пишу консольную змейку, крашит при увеличении размера
Ответ Создать тему
Опции темы

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