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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Проект из нескольких файлов http://www.cyberforum.ru/cpp-beginners/thread1651385.html
Всем привет. Столкнулся с проблемой. Использую codeblocks, совсем тривиальный пример. Есть три файла use.cpp my.cpp my.h. Файл my.cpp #include "my.h" #include <iostream> using namespace std;
C++ Лабораторные работы Всем доброго времени суток. Скажите пожалуйста, есть ли у кого-то готовое решение для таких задач ? 1)Найти сумму 1^2+ 2^2+ 3^2+... + 10^2. Операцию возведения в степень не использовать, учесть особенности получения квадрата натурального числа, отмеченные в предыдущей задаче. 2)Дано натуральное число. Определить, есть ли в нем цифры а и b. 3)Дано натуральное число. Установить, является... http://www.cyberforum.ru/cpp-beginners/thread1651383.html
Выражение должно быть допустимым для изменения левосторонним значением C++
//Структура пользователя программой struct User { char Login; char Password; }; User Array; //Функция входа в программу void Enter()
Getline() и cin C++
Проблема заключается в том, что после ввода через cin , getline() не работает, точнее работает, но непонятно для меня. Я так предполагаю, что после ввода через cin в потоке остается \n и getline() автоматом считывает его в нужную мне строку. Очистка потока вввода с cin.clear() не помогает. #include <iostream> #include <string> #include <conio.h> using namespace std; class Employee {...
C++ Определить количество отрицательных элементов массива С++ со вставкой Assembler http://www.cyberforum.ru/cpp-beginners/thread1651339.html
В программе на языке С ++ определить произвольный массив целых элементов. Ввод исходных данных и вывод результатов осуществить на языке С ++, а обработку согласно варианта как ассемблерную вставку в программе на языке высокого уровня. Собственно вариант: Определить количество отрицательных элементов массива. Помогите, добрые люди...
C++ Floating point exception (core dumped) Здравствуйте товарищи. Загорелся я на днях создать программу с процедурной генерацией мира. Но поскольку опыта с С++ у меня мало (раньше работал с С#, Java) - я столкнулся с проблемой, которую никак не могу решить и прошу вашей помощи. Ссылка на мой репозиторий Я подозреваю, что ошибка кроется где-то в getVertex, но как бы я не плясал - толку ноль... Самый большой прогресс это появление... подробнее

Показать сообщение отдельно
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.01.2016, 19:23     Найти ошибку
Цитата Сообщение от Александр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();
}
рекомендую вас сейчас немножко забить на возможные глюки,
сосредоточившись на игровом дизайне.

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

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

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

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

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