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

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

20.06.2018, 15:06. Показов 6877. Ответов 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
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
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
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
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
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,132
Записей в блоге: 243
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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru