Comments 37
Репозитории то пустые :)
Не уверенна, сейчас проверю)
Убрала и подправила, спасибо за указание на ошибку)
> if (cooldown <= 0) { for_shot = true; cooldown = 10; }
habrahabr.ru/post/341198
habrahabr.ru/post/341198
Я тут решил прогнать ваш проект бесплатной PVS-Studio. Я взял ветку final-v1.3, до 4го коммита. И хотел бы обратить ваше внимание на предупреждения, что она мне показала:
V3010 — The return value of function 'CreateShot' is required to be utilized. Program.cs 241
Ваш метод создаёт объект, возвращает его, но не использует.
И два предупреждения:
V3102 — Suspicious access to element of 'x' object by a constant index inside a loop. Program.cs 551, 559
Это не реклама продукту, я просто мимо проходил. Поправьте или проверьте у себя, пожалуйста, заранее, чтобы потом не выстрелило.
p.s. ах да, строчки могут отличаться на 2, потому что для PVS-Studio пришлось добавить 2 строки комментария.
Andrey2008, надеюсь я вашу лицензию не нарушил. Я временно добавил шапку и убрал её.
V3010 — The return value of function 'CreateShot' is required to be utilized. Program.cs 241
PlayerState.CreateShot(Players[MY_ID], PlayerState.NewPosition_X(MyTank, '\0'), 3);
Ваш метод создаёт объект, возвращает его, но не использует.
И два предупреждения:
V3102 — Suspicious access to element of 'x' object by a constant index inside a loop. Program.cs 551, 559
for (int i = 0; i < x.Length - 1; i++) {
Console.CursorLeft = x[0];
Console.CursorTop = y[i];
В обоих случаях вы итерируете по «x», но индекс используете для «y».Это не реклама продукту, я просто мимо проходил. Поправьте или проверьте у себя, пожалуйста, заранее, чтобы потом не выстрелило.
p.s. ах да, строчки могут отличаться на 2, потому что для PVS-Studio пришлось добавить 2 строки комментария.
Andrey2008, надеюсь я вашу лицензию не нарушил. Я временно добавил шапку и убрал её.
Вот мне не ясно: зачем сразу статью писать? Можно же просто складывать их в папочку и никогда не публиковать, как это делал я, когда только научившись чему-нибудь брался писать статьи. Почему бы не дождаться, когда ваш код станет простым и ясным, чтобы быть хорошим примером, а не вот эти тысячи строк.
Хорошо, но как я пойму простой код или нет, как можно оценить свой код не слушая критику?
Самооценивание и сравнение? Но эти методы почти не работают с новичками (и я тому, как видите пример (хотя все остальные проекты живут в ЯндексДиск (в папочке)).
Самооценивание и сравнение? Но эти методы почти не работают с новичками (и я тому, как видите пример (хотя все остальные проекты живут в ЯндексДиск (в папочке)).
1. Освоить создание своих типов с перегрузкой операторов, чтобы не писать по две строчки одинакового кода
2. Освоить функцию cos / sin (или написать функцию angle to dir), чтобы не писать switchcase для 4х случаев.
2. Освоить функцию cos / sin (или написать функцию angle to dir), чтобы не писать switchcase для 4х случаев.
Но смысл от косинуса или синуса, если мы используем всего 4 случая?
Это не WinForm версия…
Это не WinForm версия…
3. Понять, что булевы выражения уже годятся, чтобы возвращать результат, а дополнительный код не требуется
if (startPosition.X > 0 && startPosition.Y > 0) return true;
return false;
4. Слишком много static. Для этого существуют синглтоны, в таком случае очень легко конвертить синглтон в обычный объект (когда потребуется сделать множество контекстов абстракции и так далее).
Жду еще пару статей на тему «настало время еще раз все переделать».
Буду конечно занудой, но я думаю вам стоит все же разбить код на несколько файлов, а то получается солянка и банально не удобно читать.
Это хорошая и правильная идея — предоставлять свой код для оценки сообществом (даже если вы новичок, в этом нет ничего зазорного). Другой разговор, что сообщество Хабра, возможно, для этого не лучшим образом подходит (на этом ресурсе люди всё-таки чаще ожидают каких-то законченных материалов для специалистов среднего и высокого уровня). Мне кажется, что куда больше фидбэка вы сможете получить, если обратитесь в места с более высокой концентрацией .NET-разработчиков.
Вот тут перечислено несколько .NET-сообществ в Telegram, приходите :)
Зачем вы вообще проверяете направление выстрела в методе ForgetTheWay, если все прошлые позиции уже записаны в списках x_way и y_way?
Кстати, вы совершенно напрасно выбрали UDP-сокеты. Эти сокеты подходят только если вы делаете свой протокол с контролем потерь пакетов (совершенно не ваш случай) или же если несколько потерянных пакетов ничего не изменят.
У вас потеря пакетов с выстрелами порушит всю игру. Не надо так делать, используйте TCP.
У вас потеря пакетов с выстрелами порушит всю игру. Не надо так делать, используйте TCP.
Я придумала идею получше и уже обсуждаю её, если хотите можете присоединится к нам, вот мой vk: vk.com/unicode_72
По поводу многопоточности: что-то я не вижу у вас в коде никаких блокировок. А они нужны раз уж у вас доступ к одним и тем же объектам идет сразу из кучи потоков!
Как минимум, надо отказаться от обработки каждого пришедшего события в новой задаче — в этом нет смысла; обрабатывать их все можно просто подряд.
А дальше надо думать как синхронизировать «клавиатурный поток» с сетевым. Или наставить локов на каждую операцию, или складывать все события в блокирующую очередь, которую будет разбирать третий поток.
Как минимум, надо отказаться от обработки каждого пришедшего события в новой задаче — в этом нет смысла; обрабатывать их все можно просто подряд.
А дальше надо думать как синхронизировать «клавиатурный поток» с сетевым. Или наставить локов на каждую операцию, или складывать все события в блокирующую очередь, которую будет разбирать третий поток.
Вам уже много замечаний высказали по содержанию, а от меня будет капелька занудства по оформлению.
Я понимаю, сейчас это все выглядит несущественным, но нужно прививать себе хорошие привычки.
Извините, если высказалась резковато. Вы смелая и, надеюсь, упорная. Интересно посмотреть, что получится в итоге.
- Среди большинства .NET разработчиков принят CamelCase стиль именования классов/методов. Если он Вам не мил, используйте другой, но придерживайтесь его везде в рамках одного проекта. Сейчас же можно встретить идущие подряд методы Event_work, MoveShot и from_to_key.
- По возможности выбирайте названия переменных так, чтобы их назначение было понятным без комментариев. Вот так точно не надо (я сначала подумала, что tasc — это опечатка):
Task tasc = new Task(() => { Event_listener(); }); Task task = new Task(() => { To_key(); });
- Если же комментируете код, то пишите, почему добавлена та или иная строка, а не что она делает. И не забывайте актуализировать:
// Создаем экземпляр класса Position, с координатами 2, 2 var startPosition = new Position(10, 5);
- Про разбиение кода на несколько файлов уже говорили. Можно было хотя бы #region использовать, чтобы структурировать.
Я понимаю, сейчас это все выглядит несущественным, но нужно прививать себе хорошие привычки.
Извините, если высказалась резковато. Вы смелая и, надеюсь, упорная. Интересно посмотреть, что получится в итоге.
Sign up to leave a comment.
Танчики в консоли, статья вторая: «Настало время всё переделать!»