6 / 6 / 3
Регистрация: 31.08.2015
Сообщений: 56
|
|
1 | |
Игра "Змейка": советы по улучшению кода31.08.2015, 06:29. Показов 4380. Ответов 10
Метки нет Все метки)
(
Всем здрасте
![]()
0
|
|
31.08.2015, 06:29 | |
Ответы с готовыми решениями:
10
Игра "Змейка", ошибка "Globals.Close не объявлен", неправильная логика игры Игра на WinForm: советы по улучшению Игра "змейка" с делегатами, событиями и потоками Экземпляры объекта не стираются (игра "змейка") |
![]() ![]() |
|
31.08.2015, 08:10 | 2 |
![]() Решение
Leonin, В целом код хороший.
Несколько замечаний: 1) В C# принята в основном CamelNotation, а у вас почти все идет через подчеркивание: Check_control_keys_in_RT -> CheckControlKeysInRt 2) Метод Check_control_keys_in_RT сделан неоптимально, повторяющийся код. 3) if (Game.started == false) -> if (!Game.started) 4) В классе Apple: Random rnd; -> static Random rnd; 5) Местами неоптимален алгоритм. Например при создании яблока: "//Проверяем, не совпадает ли она с какой либо позицией сегментов змейки" Зачем? Ведь есть класс field, который содержит все занятые клетки. 6) Сам алгоритм змейки тоже неоптимален. Зачем вы сдвигаете все сегменты змейки каждый раз? Ведь достаточно передвинуть голову и забрать один сегмент из конца. Заодно и структура Turn - не понадобится (она лишняя в любом случае, да еще и неоднородно внутри). 7) Поля public List<Turn> turns; и public List<Point> eated_places; - не нужны. 8) Зачем класс Segment содержит направление? Направление имеет только голова, остальные части змеи - нет. Соотвественно направление - это свойство Snake а не Segment. 9) Публичные поля принято обозначать с большой буквы. 10) В целом код получился сложноватым для змейки. Но если высделаете оптимизацию, описанную выше, должен стать значительно проще. 11) Классы слишком связанные. Например в методы Segment вы передаете в параметрах класс Snake. Это неправильно. Segment не должен брать на себя функции класса в который он агрегирован. Это все равно что пилот самолета будет спрашивать советов у пассажира. Аналогично и в некторызх других классах. 12) Вы слишком злоупотребляете методом Equals. Лучше все таки использовать ==. Особенно для структур. Они боксятся при передаче в Equals.
1
|
16 / 16 / 8
Регистрация: 05.08.2015
Сообщений: 79
|
|
31.08.2015, 08:19 | 3 |
я не являюсь большим критиком. и смотрел немного бегло. понравилась игра в плане как начинающего) ну есть небольшие косяки но это ерунда. она трушно программерская.
есть куда улучшать в графическом плане и плане управления. вот что мне в коде понравилось это наличие комментарием и вроде даже адекватно написанных. Плюс отформатированный код без лишних плобелов. Молодец. Складывается мнение что это не прям первая программа. Но местами комментов много. например не стоит давать коммент конструктору ![]() + вопрос по второй структуре Turn почему нельзя было использовать для dir_x,..._y ту же структуру Point? + наводящий вопрос. можно ли было максимально больше методов вынести из статического класса Game? и вообще сделать его отдельным классом, а в Main только конфигурации запуска и запуск- остановка игры? + в классе Inout заметил коммент к глобальному полю класса а написанно "создаем". лушче описывать по существу что за поле и коротко + класс Field имеет объявленные переменные: ширину и высоту. Почему они паблик? можно в процессе менять? Можно ли было использовать в этом случае не поля а именно props (это там где есть {get; set;}? конечно это спорный момент но я наверное чаще использую проперти чем просто паблик поля. Спорный немного момент, конечно. Обработчики (циклы всякие) в этом конструкторе можно вынести в приватный метод чтобы не захламлять сам конструктор, если он увеличится в размерах в будущем. +почему я не видел нигде приватных переменных кроме класса apple переменная rnd? + небольшой совет. комменты можно ставить к методам ( иэто будет более нагляднее и приятно и потмо можно в документацию закинуть) просто нажав "///" и сгенерируется авто-паттерн под коммент. http://habrahabr.ru/post/41514/ + Небольшое замечание. У меня как пользователя англ. версии винды не отображаются русские слова в консоле правильно. На случай, если захочешь предусмотреть это в следующей версии программы ![]() А так мне понравился код. Очень адекватное начало. Я, конечно, далеко не гуру. Просто проходил мимо.
1
|
6 / 6 / 3
Регистрация: 31.08.2015
Сообщений: 56
|
|
31.08.2015, 09:28 [ТС] | 4 |
Storm23,
2,3) Лучше вынести "if (!Game.started) Game.started = true;" в отдельный приватный метод input'a? или лучше, наверное, в публичный метод Game'a? 4) Я так понял, статик -- это глобальная переменная для всех экземпляров? 5) Изначально я и смотрел на . Но почему-то захотел сравнивать именно позиции сегментов змейки, не затрагивая field. Просто хотел посмотреть, получиться ли) 6) Попробую сделать замену головы хвостом) 7) Если удастся реализоваться 6 пункт, то да) 9) А если публичные поля будут совпадать с именем типа? Тот же Snake Snake. Посчитал, что как-то неправильно) та же проблема у меня возникает при перечислении формальных и фактических параметров, когда их названия совпадают... например, direction и dir_x) 12) Компилятор ругается на "==" , мол, не может применяться к операндам этого типа... Как сделать, чтобы пользовательские типы можно было сравнивать или, например, складывать? По остальным замечаниям учту ![]() rockandroll, Это не совсем первая, но первая законченная) По струтурам turn... Посчитал, что будет запутанно, если для характеристики движения вместо directionX или Y будет точка Point... О том, чтобы вынести Game тоже думал. В принципе игра ведь 1 на программу и создание экземпляра game можно избежать, если использовать сам класс со статическими экземплярами как сам экземпляр ![]() С шириной и высотой, думаю, просто сделать их readonly. Я долго пытался сделать так, чтобы x и y считались с начала игрового поля, а не с рамки. Но в итоге запутался с get set'ами... Особенно, когда используешь get set с массивами. С приватными да, я, наверное, переборщил, сделав почти все публичным ![]() Спасибо обоим за советы. Следующий шаг будет попытка запилить рогалик)
0
|
![]() ![]() |
||||||||||||||||
31.08.2015, 10:21 | 5 | |||||||||||||||
Как это в Snake может быть поле Snake? Это не логично даже с умозрительной точки зрения. Если вдруг имя будет совпадать с чем либо, можно поставить знак подчеркивания в конце. Но такое бывает очень редко. Обычно поля не могут иметь такое же имя как сам класс, и они обычно не совпадают с именами методов. Структура Point должна выглядеть так:
1
|
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
|
|
31.08.2015, 22:37 | 7 |
Leonin, Ты за 1.5 месяца все так быстро понял. Для первого проекта - отлично. Хотя я бы сделал все совсем по-другому и уместил бы строк в 150 мб чуть больше. Но все приходит с опытом
0
|
Master of Orion
![]() |
|
01.09.2015, 10:19 | 8 |
pro_100_gram, не уверен, что правильно разнеся змейку на модули получится 150 строк
![]() ![]() Добавлено через 1 минуту За 1.5 месяца вполне достойный результат, если человеку это дело всё нравится. Мою змейку я через полгода писал, правда она была на гуе и событиях ![]() ![]()
0
|
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
|
|
01.09.2015, 10:42 | 9 |
Psilon, http://habrahabr.ru/post/202476/
150 это так - нормально. Люди в 30 строк умудряются накодить. Надо будет как-нить ради интереса узнать свой минимум строк в змейке ![]() Добавлено через 1 минуту Тут конечно ООП роль играет, но все же
0
|
Master of Orion
![]() |
||||||
01.09.2015, 11:08 | 10 | |||||
pro_100_gram, вот именно, что "Накодить". А я говорю, написать. Чтобы не пришлось спойлеры с кодом там называть. ООП тут не при чем, вопрос в архитектуре. Автор на неё вообще положил, чтобы поменьше кода было. Ну, его право.
Добавлено через 2 минуты Я уже молчу про то, что там по куче операции в одной строке
![]()
0
|
02.09.2015, 09:37 | 11 |
Leonin, молодец! Мне понравиласть игра! Только цель бы добавить, например, набрать 20 для победы. Открываются ворота и она уходит. А то она растёт, пока не умрёт - это неоптимистично. Отличная писать игры с целью изучения C#!
Замечу, что если писать с использованием специализированного на играх инструменте, то кода будет значительно меньше, времени уйдёт тоже меньше: Unity 2D Snake Tutorial
2
|
02.09.2015, 09:37 | |
Помогаю со студенческими работами здесь
11
Игра "Змейка". Как добавить ей тело и чтобы оно равно количеству съеденной цифры Игра "Змейка", способы реализации Консольное приложения игра "змейка"
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |