29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
|||||||||||||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||||||||||||
Оцените код "Змейки"15.08.2014, 16:16. Показов 1922. Ответов 16
Метки нет (Все метки)
Прошу добрых жителей форума оценить мою "Змейку". Посоветуйте на данном примере, как не следует писать и как лучше. Если есть конкретные замечания по коду, по возможности опишите, как следовало бы сделать. Принимаю любую критику.
0
|
15.08.2014, 16:16 | |
Ответы с готовыми решениями:
16
Движение змейки - разобрать код Код Змейки на Паскаль ABC.NET Покритикуйте код "Змейки" Оцените код |
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
|||||||||||
15.08.2014, 16:46 | 2 | ||||||||||
В классах данные-члены стоит помещать в private секцию, это одно из главных правил ООП. В твоём примере это не критично, но на будущее.
1
|
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
||||||
15.08.2014, 17:05 [ТС] | 3 | |||||
А в классе Snake массив
И ещё, нормально ли такое определение объектов, как у меня, с использованием extern?
0
|
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
|
15.08.2014, 17:10 | 4 |
В общем случае, да.
В принципе нормально для небольших программ. А в принципе глобальные переменные лучше не использовать.
0
|
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
|
15.08.2014, 17:17 [ТС] | 5 |
А как, например, можно было сделать, в классе Food доступ к массиву змейки без определения здесь объекта Snake.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.08.2014, 17:19 | 6 |
Aspirin, 1 вариант - Переделать архитектуру.
2 вариант - Хранить ссылку на объект типа Snake в Food.
0
|
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
|||||||||||
15.08.2014, 18:34 [ТС] | 7 | ||||||||||
Есть ещё такая проблема: в классе Food метод spawn
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
15.08.2014, 18:54 | 8 |
Очевидно, что еде нет никакой нужды знать о змее. Создавать еду должна игра, именно она должна знать о всех игровых объектах и естественно, что именно игра должна подбирать подходящее расположение для еды
Добавлено через 2 минуты Ну, вероятно происходит переполнение стека из-за того, что генерируются одинаковые координаты из-за того, что текущее время не успевает измениться Добавлено через 7 минут В целом код на 3- ( честно говоря лениво все расписывать ), но по сравнению с кодом, который периодически выкладывают на этом форуме, твой выглядит более-менее неплохо
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
15.08.2014, 22:01 | 9 | ||||||||||
Может, я чего не догоняю, но объясни мне этот участок кода:
После этого получаем, что size становится равным i; а поскольку i инкременируется (и на следующей итерации становится БОЛЬШЕ size на 1),а size не меняется, for (int i = 3; i < size; i++) Мы попадаем в вечный цикл... Ну, до тех пор. пока не случится переполнение i. Я не прав?
0
|
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
|
15.08.2014, 22:12 | 10 |
Нет. size приравнивается i, потом i увеличивается на 1, а затем уже в начале следующей итерации цикла проверяется условие i < size. Короче, как только выполнится size = i, цикл сразу закончится.
Но ты прав в другом - цикл организован через ж... Добавлено через 4 минуты Всё существенно переработать. Змейка ничего не знает о еде, еда ничего не знает о змейке. Слопала змейка еду или нет, должна знать сама игра: когда координаты начала змейки и еды сравняются. Как-то так. Кстати, подумай на досуге, что в твоей программе пришлось бы поменять, если бы объектов еды потребовалось бы создать больше 1?
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
15.08.2014, 22:15 | 11 |
виноват
0
|
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
|
15.08.2014, 22:44 [ТС] | 12 |
И правда, я упустил этот момент, я хотел поставить там break после того, как выполнится условие.
Хотя не вижу не чего плохого в такой ситуации, т.к. по сказанному выше все работает)
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||||||||||||
15.08.2014, 23:13 | 13 | ||||||||||||||||||||||||||||||
В вечный цикл мы не попадём. как выяснилось. при выполнении условия size сравняется с i, потом выполнится i++, после чего i станет больше size и произойдёт выход из цикла. Если это то, что ты хотел, тогда самое оно.
++++++++++++++++++++++++++++++++++++++++++++++++++++++ Теперь по рациональности. Повременим пока с break. Смотри, насколько я понял, цель этого кода, в КАЖДОЙ итерации при выполнении условия увеличивать i на 1. Действительно, ты проверяешь одно условие,
и при истинности каждого из этих условий инкременируешь i. Но уже за нас всё придумано. Два условия нужно объединить в одно, вот так:
Наконец, последнее, по size. Если цель size=i, выйти из цикла, тогда действительно либо break, либо, если использовать мой вариант ВООБЩЕ обходимся без этого приравнивания. Если действительно есть необходимость приравнять size к i ПОМИМО выхода из цикла, тогда пишем так:
Добавлено через 5 минут ............
0
|
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
||||||
15.08.2014, 23:17 | 14 | |||||
0
|
29 / 6 / 2
Регистрация: 05.10.2012
Сообщений: 117
|
|
15.08.2014, 23:59 [ТС] | 15 |
Цель - при выполнении условия изменить size на номер текущей итерации.
"Физический смысл": Этот метод - разрезание змейки. В цикле мы проходим по телу змейку(начиная от 3, т.к змейка длинной 4 и меньше не может разрезать себя) и проверяем попала ли "голова" змейки на её тело, если условие выполняется, изменяем длину змейки на номер текущей итерации(длина змейки становится равна номеру блока в котором произошел разрез) и выходим из цикла. Если будет меньше, то мы просто в цикл не войдем.
0
|
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
|
16.08.2014, 00:00 | 16 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
16.08.2014, 00:04 | 17 | |||||
значит так:
0
|
16.08.2014, 00:04 | |
16.08.2014, 00:04 | |
Помогаю со студенческими работами здесь
17
Оцените код Оцените код Оцените код Оцените код Оцените код Оцените код Оцените от 1 до 10 код Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |