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

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

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

Author24 — интернет-сервис помощи студентам
Привет.
Недавно написал змейку.
Прошу оценить и покритиковать немного,мб какие-то предложения,поправки.
Вложения
Тип файла: rar Project.rar (12.87 Мб, 44 просмотров)
Тип файла: rar отдельно main.rar (1.3 Кб, 11 просмотров)
Тип файла: rar отдельно екзешник.rar (24.7 Кб, 25 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2018, 15:06
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Окей,реализую другой цикл
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
07.08.2018, 17:55 82
Цитата Сообщение от anton3d Посмотреть сообщение
если зажать одну клавишу-мы снижаем время задержки таймаута
Немного поправлю формулировку: при нажатии кнопки функция getsh() завершается сразу, не дожидаясь таймаута.
1
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66
08.08.2018, 16:32  [ТС] 83
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
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
09.08.2018, 10:27 84
Куда потеряли форматирование и теги кода?
Управление стало еще неудобнее. Такое ощущение что реагирует даже не на следующем шаге, а через шаг. Причины пока не знаю.
Сбилась начальная картинка.
Сбился отсчет секунд. Причем реализован он все так же через 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
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
09.08.2018, 13:33 85
anton3d,
Игровой цикл (Game Loop)
1
2 / 2 / 0
Регистрация: 08.06.2018
Сообщений: 66
09.08.2018, 23:22  [ТС] 86
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но заставлять не буду.
В конце концов, без увлеченности и получения видимых результатов прогресса не будет.
Спасибо за понимание)
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если хотите, могу выложить заготовку кода на OpenGL + SDL2, начнете разбираться с трехмерной графикой.
Сначала я хочу сам попробовать,и выложу что получится в новый топик,а там уже посмотрим на мои косяки

Добавлено через 1 минуту
8Observer8, Спасибо)
1
09.08.2018, 23:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2018, 23:22
Помогаю со студенческими работами здесь

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

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

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

Прошу конструктивной критики сайта
Про сопромат sopromat.ueuo.com

Сделал шахматы: прошу критики
Я - начинающий программист-самоучка, программа в архиве - моя первая более-менее серьезная работа,...


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

Или воспользуйтесь поиском по форуму:
86
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru