Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66

Прошу критики игры "Змейка"

20.06.2018, 15:06. Показов 6581. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Недавно написал змейку.
Прошу оценить и покритиковать немного,мб какие-то предложения,поправки.
Вложения
Тип файла: rar Project.rar (12.87 Мб, 47 просмотров)
Тип файла: rar отдельно main.rar (1.3 Кб, 11 просмотров)
Тип файла: rar отдельно екзешник.rar (24.7 Кб, 25 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2018, 15:06
Ответы с готовыми решениями:

Змейка, завершение игры
Нужно сделать чтобы змейка ела 5 яблок и игра заканчивалась, но не могу понять как это сделать( Вот сам код #include...

Прошу критики
Всем привет! Прошу старших коллег оценить код ниже. Любая критика приветствуется. Стоит задача спарсить страницы с объявлениями о...

Прошу вашей критики
Начинаю делать собственный проект www.geo-rus.ru. Жду вашей критики по всем фронтам. :) Главный вопрос: стоит ли он развития, или...

85
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66
07.08.2018, 17:15  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кстати, было бы интересно услышать ваше мнение относительно причин этого феномена.
очень просто)
если зажать одну клавишу-мы снижаем время задержки таймаута,поэтому цикл прокручивается быстрее и соответственно змейка быстрее передвигается

Серьезный баг,в старом коде его не было,так как там использовался Sleep

Окей,реализую другой цикл
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
07.08.2018, 17:55
Цитата Сообщение от anton3d Посмотреть сообщение
если зажать одну клавишу-мы снижаем время задержки таймаута
Немного поправлю формулировку: при нажатии кнопки функция getsh() завершается сразу, не дожидаясь таймаута.
1
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66
08.08.2018, 16:32  [ТС]
COKPOWEHEU, починил баг с таймаутом:
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 <curses.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <sys/time.h>
 
bool game_status;
char field[24][80],head,tail,food,direction,last_direction;
int head_pos_x,head_pos_y,last_head_pos_x[100],last_head_pos_y[100],food_position_x,food_position_y,key,score,counter,length,highscore;
unsigned int start_time, search_time, end_time;
 
 
unsigned long get_time_ms(){
  struct timeval tv;
  unsigned long time_ms;
  gettimeofday(&tv,NULL);
  time_ms = tv.tv_usec/1000 + tv.tv_sec*1000;
  return time_ms;
}
 
unsigned long next_game_tick;
 
void set_food(){
    do{
    food_position_x = rand() % 78 + 1;
    food_position_y = rand() % 22 + 1;
    }while(field[food_position_y][food_position_x] != ' ');
    field[food_position_y][food_position_x] = food;
}
 
void draw(){
    move(0,0); //чтобы начать отрисовку с угла
    for (int i = 0; i < 24; ++i) {
        for (int j = 0; j < 80; ++j){
            if(field[i][j] == food)addch(field[i][j] | A_BOLD | COLOR_PAIR(2));else{
                if(field[i][j] == head)addch(field[i][j] | A_BOLD | COLOR_PAIR(3));else{
                    if(field[i][j] == tail)addch(field[i][j] | COLOR_PAIR(3));else
                    addch(field[i][j] | A_BOLD | COLOR_PAIR(1));
                }
            }
        }
        move(i+1,0);//перевод строки
    }
    attrset(A_BOLD);
    printw("SCORE: %i", score);
    printw(" ");
    printw("HIGHSCORE: %i", highscore);
    printw(" ");
    printw("TIME: %5.1f", search_time / 1000.0);
    printw("s");
    attrset(A_NORMAL);
}
 
void check_input(){
    key = getch(); //ввод символа
    last_direction = direction;
    switch (key){
        case KEY_DOWN:
            if (last_direction != 'U')direction = 'D';
            break;
        case KEY_UP:
            if (last_direction != 'D')direction = 'U';
            break;
        case KEY_LEFT:
            if (last_direction != 'R')direction = 'L';
            break;
        case KEY_RIGHT:
            if (last_direction != 'L')direction = 'R';
            break;
    }
}
 
void init(){
    std::ifstream in("highscore.txt");//подключаем файл с рекордом,если таковой имеется
    in >> highscore;//считываем рекорд
    in.close();
    noecho();
    curs_set(0);
    start_color();
    init_pair(1, COLOR_BLUE, COLOR_BLACK);
    init_pair(2, COLOR_RED, COLOR_BLACK);
    init_pair(3, COLOR_GREEN, COLOR_BLACK);
    init_pair(4, COLOR_WHITE, COLOR_BLACK);
    timeout(10);
    set_escdelay(0);
    keypad(stdscr, TRUE);
    mousemask(ALL_MOUSE_EVENTS, NULL);
    cbreak();
    leaveok(stdscr,false);
    nonl();
    for (int i = 0; i < 24; ++i){for (int j = 0; j < 80; ++j)field[i][j]=' ';}
    for (int i = 0; i < 24; ++i)field[i][0] = '#';
    for (int i = 0; i < 24; ++i)field[i][79] = '#';
    for (int i = 1; i < 80; ++i)field[0][i] = '#';
    for (int i = 1; i < 80; ++i)field[23][i] = '#';
    start_time = clock();
    search_time = 0;
    score = 0;
    head = '@';
    tail = 'o';
    food ='O';
    head_pos_x = 15;
    head_pos_y = 11;
    counter = 0;
    length = 3;
    srand(time(NULL));
    set_food();
}
 
void move(){
    field[last_head_pos_y[counter - 1]][last_head_pos_x[counter - 1]] = ' ';
    field[0][0] = '#';//код вроде новый,а костыли старые :D
    last_head_pos_x[counter - 1] = head_pos_x;
    last_head_pos_y[counter - 1] = head_pos_y;
    switch (direction)
    {
    case 'L'://влево
        head_pos_x -= 1;
        break;
    case 'R'://вправо
        head_pos_x += 1;
        break;
    case 'D'://вниз
        head_pos_y += 1;
        break;
    case 'U'://вверх
        head_pos_y -= 1;
        break;
    }field[last_head_pos_y[counter - 1]][last_head_pos_x[counter - 1]] = tail;
    if (length == counter) {
        for (int i = 1; i <= length; ++i)field[last_head_pos_y[counter - i]][last_head_pos_x[counter - i]] = tail;
    }
    if (counter == length)counter = 0;
    ++counter;
}
 
void check_position(){
    if (field[head_pos_y][head_pos_x] == '#')game_status = false;
    if (score != 0 && field[head_pos_y][head_pos_x] == tail)game_status = false;
    if (field[head_pos_y][head_pos_x] == food){
        ++score;
        ++length;
        set_food();
    }
}
 
void update(){
    move();
    check_input();
    check_position();
    end_time = clock();
    search_time = end_time - start_time;
    field[head_pos_y][head_pos_x]=head;
}
 
void menu(){
    attron(A_BOLD | COLOR_PAIR(3));
    addstr("                       ______                _            \n" );
    addstr("                      / _____)              | |           \n" );
    addstr("                     ( (____   ____   _____ | |  _  _____ \n" );
    addstr("                      \\____ \\ |  _ \\ (____ || |_/ )| ___ |\n" );
    addstr("                      _____) )| | | |/ ___ ||  _ ( | ____|\n" );
    addstr("                     (______/ |_| |_|\\_____||_| \\_)|_____)\n" );
    addstr("                                                          \n" );
    attron(A_BLINK |COLOR_PAIR(4));
    addstr("                         Press ENTER to start new game\n");
    while (true) {
        key = getch();
        if (key == 13) {
            game_status = true;//запускаем игру
            attrset(A_NORMAL);
            break;
        }
    }
}
 
void end_game(){
    clear();
    attron(A_BOLD | COLOR_PAIR(3));
    addstr("                       ______                _            \n" );
    addstr("                      / _____)              | |           \n" );
    addstr("                     ( (____   ____   _____ | |  _  _____ \n" );
    addstr("                      \\____ \\ |  _ \\ (____ || |_/ )| ___ |\n" );
    addstr("                      _____) )| | | |/ ___ ||  _ ( | ____|\n" );
    addstr("                     (______/ |_| |_|\\_____||_| \\_)|_____)\n" );
    addstr("                                                          \n" );
    printw("\n");
    if (score > highscore) {
        highscore = score;
        attron(A_BOLD | COLOR_PAIR(4));
        printw("                           Your new highscore: ");
        attron(A_BOLD | COLOR_PAIR(2));
        printw("%i", highscore);
        printw("\n");
        printw("\n");
        std::ofstream out("highscore.txt");
        out << highscore;
        out.close();
    }
    attron(A_BLINK | A_BOLD | COLOR_PAIR(4));
    addstr("                     Press ENTER to restart,or ESC to exit");
    do {
        key = getch();
        if (key == 13) {
            game_status = true;
            direction = ' ';
            attrset(A_NORMAL);
        }
    } while ((key != 27) and (key != 13));
}
 
int main(){
    
    initscr();
    init();
    menu();
    while(game_status){
        init();
        while(game_status){
            update();
            next_game_tick = get_time_ms()+140;
            while( get_time_ms() < next_game_tick)draw();
        }
        end_game();
    }
    endwin();
    return 0;
}
не идеально,но тут достаточно

Добавлено через 7 минут
Недавно в одной книге по геймдизайну прочитал,что игроделы могут бесконечно улучшать свою игру.
Потратив достаточно времени я понял куда хочу теперь двигаться и теперь хочу начать делать что-то новое.
Я понимаю,что код пока не идеален,но теперь все механики и внешний вид меня вполне устраивают.
Поэтому-спасибо COKPOWEHEU и 8Observer8 за адекватную критику и большую помощь))

Добавлено через 3 минуты
тема закрыта)
0
 Аватар для COKPOWEHEU
4138 / 2716 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
09.08.2018, 10:27
Куда потеряли форматирование и теги кода?
Управление стало еще неудобнее. Такое ощущение что реагирует даже не на следующем шаге, а через шаг. Причины пока не знаю.
Сбилась начальная картинка.
Сбился отсчет секунд. Причем реализован он все так же через clock(), который неточный.
Вместо бесконечной отрисовки лучше было использовать какой-то из sleep'ов. Это позволит программе просто спать между циклами и снизит загрузку процессора:
C
1
2
3
4
5
6
7
8
unsigned long time_old, time_cur;
while(game_status){
  update();
  time_cur = get_time_ms();
  if( time_old - time_cur < TIME_CYCLE_MS )
    usleep( (TIME_CYCLE_MS - time_old + time_cur)*1000 );
  time_old = time_cur;
}
Правда, usleep это функция POSIX, не везде она может быть. Вместо этого в windows можно использовать Sleep(ms). Помните, я предлагал использовать заголовочник portability.h? Думаю, не помешает вынести функцию задержки туда
Правда, в моем варианте управление стало еще более неудобным. Наверное, посижу над ним пока.
Цитата Сообщение от anton3d Посмотреть сообщение
Недавно в одной книге по геймдизайну прочитал,что игроделы могут бесконечно улучшать свою игру.
В данном случае я рассматриваю улучшение игры как тренировочную площадку для ознакомления с принципами разработки игр вообще. Использование консольной программы в целом проще, чем графической, поэтому и тренироваться лучше на ней.
Скажем, было бы неплохо все-таки оформить змейку как отдельный объект и изменить отрисовку: пусть в ней будет метод Snake::draw(), который будет рисовать голову и стирать поле за хвостом. Не то чтобы такой подход использовался в современных играх (там действительно идет перерисовка всего экрана), но поможет разобраться с объектами.
Кроме того, у вас очень много отдельных глобальных переменных. Впрочем, возможно просто пока не осознали проблем, к которым это приведет.
В общем, я считаю, что пока стоит продолжать с консольной версией.
.
Но заставлять не буду. Если хотите, могу выложить заготовку кода на OpenGL + SDL2, начнете разбираться с трехмерной графикой.
В конце концов, без увлеченности и получения видимых результатов прогресса не будет.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
09.08.2018, 13:33
anton3d,
Игровой цикл (Game Loop)
1
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66
09.08.2018, 23:22  [ТС]
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но заставлять не буду.
В конце концов, без увлеченности и получения видимых результатов прогресса не будет.
Спасибо за понимание)
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если хотите, могу выложить заготовку кода на OpenGL + SDL2, начнете разбираться с трехмерной графикой.
Сначала я хочу сам попробовать,и выложу что получится в новый топик,а там уже посмотрим на мои косяки

Добавлено через 1 минуту
8Observer8, Спасибо)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.08.2018, 23:22

Прошу вашей критики
Народ, всем привет, в общем я только начал изучать верстку. Взял шаблон вот тут: Хотел сделать резиновую верстку, но остановился...

Прошу критики и рекомендаций
Уважаемые форумчане! Выношу на ваш суд свою БД. Раньше я никогда не занималась созданием баз, но рискнула взять на себя такую...

Прошу критики от профессионалов...
Все время работал с классическим html, но решил попробовать блогинг. Создал блог 29 января 2012 - сами видите-еще зародыш, но не успел...

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

Прошу критики веб-дизайна
Занимаюсь самообучением веб-дизайну. Хочу услышать адекватную критику и советы. Знаю, что еще очень многое не умею, но хотелось бы...


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

Или воспользуйтесь поиском по форуму:
86
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru