TGViewer
Channel Public Channel
Moth

Moth

@namlessmoth

Прохожу курс Яюниор по юнити
♡2024 by Pixlife. Copying Art is an act of love. Love is not subject to law.
Subscribers
44
Photos
98
Videos
35
Links
137
Recent Posts 19 shown
Post #369 223
Как сломать босса одним прокачанным навыком
Причём первую заратану я победил точно так же, но я тогда даже не знал что её можно есть, я просто взял двух танков оба с землятрясением которое спавнит по три камня, один из танков мог есть камни и расчитывал спавнить камни сам, но потом узнал, что заратана кидает очень много камней и обрадовался, а потом случайно обнаружил что можно бесконечно есть босса и вообще офигел
  • ❤ 2
Post #367 222
Наиграл уже 150+ часов и даже не прошел половину игры

Мне капец как не везёт почти в каждой катке попадаются такие сочетания которые невозможно пройти даже с сейв скамом

Один раз попалась имбовая пасивка на танка с контратакой любого врага, который наносит урон. В итоге в событиях выпала буря которая наносит 1 урона всем юнитам на карте и пугало которое выпускает искры по всем юнитам при получении урона. Получается буря бьёт по всем включая пугало, пугало бьёт всех включая танка, танк контратакует пугало, пугало опять бьёт по всем и так все коты умирают за один раунд до начала хода.

Потом я пересталл брать эту имбовую пассивку на танка и взял просто +4 брони и какой-то аспект камня. Я думал это просто по приколу написано, а оказалось танк превращался буквально в камень. И первый же босс делает все камни левитирующими в том числе и моего танка который по сути становился врагом и ваншотил всех союзников при приближении. Каким то чудом прошел этого босса но вторая битва ещё сложнее. Там есть амёбы которые бегают по всей карте и ищут самый большой камень чтобы поднять его и использовать как защиту и оружие. А урон от атаки равен количеству здоровья камня. Ну и естественно амёба сразу же бежала к моему танку с 50 хп поднимала его и ваншотила всех моих котов и я не мог даже убежать и спрятаться от них потому что карта маленькая.

И такие непроходимые комбинации попадаются буквально каждую вторую катку из-за чего приходится просто умирать и начинать заново.
Хотя игру можно пройти на 100% буквально за 80-100 часов.
  • ❤ 1
Post #365 169
оставлю тут, чтобы не потерять
вам смотреть нельзя, это только для меня
Post #364 162
Вчера сделал всего три задания и все три оказались не правильными
1) Задание:
Проведите рефакторинг - https://gist.github.com/HolyMonkey/adcf9478bd6dcdd21384bf269155f8fe

Решение:
В основной обработчик нажатия кнопки вынес высокоуровневые функции в декларативном стиле, чтобы было легче понимать логику кода.
На уровне ниже функции обработки данных введённых пользователем и вывод результата.
https://gist.github.com/NoNameDeleted/fb6ca90f51c76888eb00d27b0aa99da1

Ответ ментора:
Здравствуйте. Это задача на паттерн MVP.
Общая схема примерно такая.
Каждый из слоев может состоять более чем из одного класса. SRP никто не отменял)
В целом, будут классы (можно их назвать иначе) View, Prespenter, PresenterFactory, Service, DatabaseContext, Repository, Citizen, Паспорт.
View - использует MessageBox.Show, устанавливает результат строки и вызывает по нажатию кнопки метод презентера.
Презентер - обращается к модели, получает от нее какие то данные (или не получает) и принимает решение как на эти данные отреагировать (что отобразить во View). Создает паспорт и обрабатывает эксепшены.
Service (модель) - Прослойка между БД и презентером, получает от паспорта его номер, вызывает кого то, кто посчитает хэш, передает хэш в Repository.
Repository- обрабатывает DataTable, полученный от DatabaseContext, создает Citizen.
DatabaseContext- открывает соединение, создает DataTable, заполняет его и возвращает.

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

Не обязательно работать в вин формс, можно консольное приложение, главное сохранить суть.


2) Задание:
Попробуйте заменить метод на пару Включить\Выключить - https://gist.github.com/HolyMonkey/ef0c234f158151d80ecb22d3717c9ac2

Решение:
https://gist.github.com/NoNameDeleted/69b0c032940109d8a28f980e34c2d746

Ответ ментора:
Disable - не хватает действия которое бы оправдало имя метода.


3) Задание:
Отрефакторите - https://gist.github.com/HolyMonkey/1bad5877fc09bb60d2a83a522824440e

Решение:
https://gist.github.com/NoNameDeleted/a0fcff5d1ba50a1e6d17838cff7fa96e

Ответ ментора:
public void Shoot(Player player) {} - стреляем обычно в цель.
public string Find(int index) {} - Поиск предполагает перебор и сравнение по какому-то критерию, а тут мы ничего не ищем, у нас уже есть индекс.
Post #363 114
Moth Главная проблема в этом всём, что задания можно сдавать только по очереди
Оказалось что всё-таки можно сдавать несколько заданий за один раз. Я вчера сдал 7 заданий из них 6 правильных и одно с ошибкой:
1) Задание:
Используйте более распространённое и простое слово в название метода - https://gist.github.com/HolyMonkey/946002199f327790d8f66e8685a869f3

Ответ (неправильный):
https://gist.github.com/NoNameDeleted/fd862b81e3c1e6997524167abf59c88e

Комментарий:
Find - что найти? Мне не ясно, что я получу вызвав этот метод?
Не забываем про предыдущие уроки. Во всех публичных методах (в тч конструкторах) должна быть валидация входных параметров с необходимыми исключениями. Тут, как минимум, с массивом могут быть проблемы.

2) Задание:
Измените код - https://gist.github.com/HolyMonkey/fece8ba4657cb3583ae74949b252d26a

Ответ:
https://gist.github.com/NoNameDeleted/4b1ca0cd2c542d66ae2733c8b3403af9

3) Задание:
Перепишите код - https://gist.github.com/HolyMonkey/71114d1e59e1a68d9e1c82b0861b0a32

Ответ:
https://gist.github.com/NoNameDeleted/3a72f57225d40d790213eb9fce587c44

4) Задание:
Перед вами оружие - https://gist.github.com/HolyMonkey/1cc8afb9001dc20c58731a0468d28936
Поменяйте имена

Ответ:
https://gist.github.com/NoNameDeleted/4b15a2b83ec0598c9b57c1de1abe549c

5) Задание:
Переименуйте классы - https://gist.github.com/HolyMonkey/301475a9d6ec900584a254cee3485673

Ответ:
https://gist.github.com/NoNameDeleted/f03378ed1226296c9fbb5f1536974689

6) Задание:
Метод Set устанавливает значение через свой параметр, плохая история когда вы под Set маскируете более информативный глагол. Т.е если вы через этот метод не устанавливаете значение (например метод SetMoney(int amount) который установит значение), то придумайте информативный глагол.

Попробуйте переназвать эти методы - https://gist.github.com/HolyMonkey/0b7021ff18da43ca46705ca3c6a3dea9

Ответ:
https://gist.github.com/NoNameDeleted/f15735bbbc84a671618fdcc5dbabbe1e

7) Задание:
Поправьте код - https://gist.github.com/HolyMonkey/228d407270b740387bbab0fede8fc29b

Ответ:
https://gist.github.com/NoNameDeleted/2598e5e8fe254a295c653e5c97b2ae44
Post #362 103
Играю в Pokemon unite уже несколько лет
Смотрю контент на ютубе по этой игре
Решил поставить ник как у популярного стримера по приколу
Сегодня первый раз попал с ним в бой, видимо раньше рейтинг был сильно ниже
Решил сыграть максимально хорошо, но мы проиграли к сожалению
Пересмотрел его реакцию на стриме
Он буквально сказал "почему все кто ставят мой ник играют так плохо? Они специально это делают?"
Лол
  • 🌚 2
  • 👍 1
Post #361 89
Как я уже говорил следующие задания это видимо просто прикол под конец курса
Вот буквально текст задания:
Переименуйте метод - https://gist.github.com/HolyMonkey/92e8c9c2f08471e31eceef30da7ea6ad

Вот сам код:
public static int MakeValidNumber(int a, int b, int c)
{
if (a < b)
return b;
else if (a > c)
return c;
else
return a;
}

Вот решение:
 public static int Clamp(int value, int min, int max)
{
if (value < min)
return min;
else if (value > max)
return max;
else
return value;
}

И таких заданий всего 12 штук. Главная проблема в этом всём, что задания можно сдавать только по очереди, то есть можно сесть и за пол часа сделать все задания но нельзя их разом сдать.
Post #360 73
Moth Ответ ментора на это задание: Привет! Хэш сервис не должен принимать order. Есть 2 алгоритма и каждый из вызовов принимает разные данные. Смотри на то, что написано в Main в { }. То, что внутри идет в хэш сервис. Например, $"{order.Id}{_secretKey}" строка…
Ответ ментора на предыдущее задание:
Здравствуйте.

Не забываем про предыдущие уроки. Во всех публичных методах должна быть валидация входных параметров с необходимыми исключениями.
Это касается и конструтора. Все ли параметры ордера могут иметь любое значение?
Для проверки строк лучше использовать не просто сравнение с null, а метод IsNullOrWhiteSpace
https://learn.microsoft.com/ru-ru/dotnet/api/system.string.isnullorwhitespace?view=net-8.0

Моё решение (уже третье для этого задания):
Добавил исключения
https://gist.github.com/NoNameDeleted/67241dbff6793a1d984b26c65ed6476e

Опять исключения не добавил они мне уже успели надоесть за 4 задания, хорошо что это задание последнее в этом блоке.
P.S. Это решение приняли без комментариев🎉
Post #359 133
Вот так выглядит прогресс по всем курсам на данный момент:

C# - прошел полностью от начала до конца со всеми лекциями заданиями и тестами

GIT и Kanban - там надо просто посмотреть несколько видосов без тестов и заданий так что можно считать сделаным

Unity Junior - выполнил все задания и прошел все тесты, осталось только посмотреть видео по частицам и эффектам, так что тоже можно считать пройденым

Работа с графикой - там просто видео по 3д моделированию в блендере без заданий и тестов

Архитектура Unity - там всего три видео по UniTask, ECS и Zenject и один небольшой тест, который надо сделать

Напильник - там осталось примерно 10 заданий, но они все уровня "переименуй метод", "переименуй классы" так что тоже ничего сложного

Пыточная - последний самый главный модуль. Там нужно сделать три полноценные игры. Первую сделать водиночку по шаблону на выбор, вторую в команде тоже по шаблону (они сами мне подберут людей) и третью можно сделать как хочешь и с кем хочешь на любую тему единственное условие прохождения - это чтобы игры прошли модерацию Яндекс игр
  • 👍 1
Post #358 58
Moth Следующая задача "Платёжные системы": Ваша задача - https://gist.github.com/HolyMonkey/06eb6d684358365f1653301980545d05 (Там нужно реализовать вывод трёх разных ссылок для оплаты) Моё решение: Сделал три платёжные системы реализующие интерфейс IPaymentSystem…
Ответ ментора на это задание:
Привет!
Хэш сервис не должен принимать order. Есть 2 алгоритма и каждый из вызовов принимает разные данные. Смотри на то, что написано в Main в { }. То, что внутри идет в хэш сервис. Например, $"{order.Id}{_secretKey}" строка должна пойти в хэш сервис.
В строке "pay.system1 ru/order?amount=12000RUB&hash=" число 12000 это order.Amount. Нужно использовать интерполяцию внутри системы.
Не используй котрежи и публичные поля - Order
И декоратора у тебя тут нет! Декоратор это паттерн в котором реализация IInterface принимает в себя IInterface. Получается матрешка. Этот паттерн тут не нужен

Моё исправленное решение и ответ:
Изменил хеширование, теперь сервисы принимают строку
Изменил формирование ссылки
Заменил публичные поля на свойства в Order (я просто думал что код из задания не нужно менять)
Про декоратор думал, что это просто любые интерфейсы, теперь разобрался
https://gist.github.com/NoNameDeleted/67241dbff6793a1d984b26c65ed6476e

Паттерны это конечно сложная тема, особенно напрягает что там всё как то размыто и у всех разное представление о них, и на практике знание паттернов никак не помогает, можно их использовать не зная что они существуют. Так что думаю это не проблема
  • 🔥 1
Post #357 57
Следующая задача "Платёжные системы":
Ваша задача - https://gist.github.com/HolyMonkey/06eb6d684358365f1653301980545d05

(Там нужно реализовать вывод трёх разных ссылок для оплаты)

Моё решение:
Сделал три платёжные системы реализующие интерфейс IPaymentSystem
И два хэш сервиса реализующие интерфейс IHashService
Использовал паттерн декоратор
https://gist.github.com/NoNameDeleted/67241dbff6793a1d984b26c65ed6476e
Post #356 61
Moth Третье задание "Логирование": Есть такая реализация логирования - https://pastebin.com/7xL6S4vV Защищённый логер даёт функционал, что логер пишется только по пятницам (такая условность). Представьте класс Pathfinder у которого есть зависимость от условного…
ответ ментора на прошлое решение:
Привет!

SecureFileLogWriter и SecureConsoleLogWriter ведут себя идентично. Используй в этой задаче не наследование, а паттерн декоратор. В этом паттерне не используются наследники, но используются интерфейсы

ConsoleAndFileOnFridayLogger - слишком конкретное название. Принимай коллекцию логгеров

Моё решение (правильное):
Изменил код, убрал всё наследование заменил на интерфейсы
https://gist.github.com/NoNameDeleted/537bd7db81848c22e8cd528a82866fa8

Ответ на него:
Пустые конструкторы можно не оставлять

Если вкратце под резюмировать это задании, то оно было про интерфейсы. Суть интерфейсов в том что они позволяют дополнить функционал какого то класса не используя наследование. Вобщем то, что называется композиция и паттерн "декоратор"
  • 👍 1
Post #355 83
Параллельно с юнити ещё изучаю JavaScript и Gdevelop5
Пока что делаю максимально простые интерактивные холсты для арт коллабов
Вот такой сделал сегодня https://t.me/laymerHBD_bot?startapp
Для Лаймера, с прошедшим кстати🎉
  • 🔥 2
Post #354 82
Третье задание "Логирование":
Есть такая реализация логирования - https://pastebin.com/7xL6S4vV

Защищённый логер даёт функционал, что логер пишется только по пятницам (такая условность).

Представьте класс Pathfinder у которого есть зависимость от условного ILogger, в процессе своей работы он что-то пишет в лог. Что не принципиально. Сделайте в нём один метод Find который только пишет в лог через своего логера.

Перепроектируйте систему логирования так, что бы у меня было 5 объектов класса Pathfinder. 1) Пишет лог в файл. 2) Пишет лог в консоль. 3) Пишет лог в файл по пятницам. 4) Пишет лог в консоль по пятницам. 5) Пишет лог в консоль а по пятницам ещё и в файл.

Моё решение:
первые два объекта наследуются от логера, следующие два наследуются от первых двух соответственно, а последний наследуется от логгера и получает первые два объекта в конструкторе
https://gist.github.com/NoNameDeleted/537bd7db81848c22e8cd528a82866fa8

Это задание на умение выстраивать архитектуру проекта и применять связи Is-A и Has-A. Жаль только что таких заданий всего два на курсе - это и следующее, хотя этот навык сейчас самый главный в контексте развития нейросетей. Надеюсь в будущем добавят больше материалов по этой теме.
Post #353 57
Второе задание называется "Интернет магазин":
У вас есть UseCase от проектировщика который показывает как ожидается работа с системой магазина.

Вот он - https://gist.github.com/HolyMonkey/0ea27f88a1ce55d514588ab013c91076

Необходимо реализовать функционал в соответствии с комментариями в коде. Код должен запускаться.

Paylink - просто какая-нибудь случайная строка.

Я его сдал с первого раза на удивление. Вот такое решение:
https://gist.github.com/NoNameDeleted/4396ac4cdc51c095a99e1c881e1f54ad

И вот комментарии ментора:
1) Cart.Add - если в тележку запрашивается добавление товара, следует проверять наличие товара с учётом того что уже находится в тележке чтобы проверка не позволяла положить в корзину ещё 10 товаров, когда в ней уже таких товаров записано 9, а на складе всего 11
2) Cart.Add, Reserve - вместо символа ! нужно использовать сравнение, например (canFly == false) или (canFly != true). Так повышается читаемость кода
  • 🔥 1
Post #352 50
И наконец третье последнее правильное решение:
добавил интерфейс IDamagable для Player
добавил конструктор каждому классу
добавил exeption
исправил стилистические ошибки
https://gist.github.com/NoNameDeleted/e5d55a42c1e45c0800e9bf083ef71553

Самый главный вывод из этого задания:
Нельзя передавать объекту другой объект целиком, особенно если он не использует все его методы, а нужно передавать только интерфейс в котором определены только те методы которые получатель будет использовать. Ну и в этом модуле теперь требуют создавать проверки для каждого получаемого значения и выкидывать ошибки. В модуле по С# этого вообще не требовали и я не написал там ни одного эксепшена, а теперь эти эксепшены занимают в коде больше места чем сама логика. Буквально методы принимают условно два значения для каждого значения нужно создать свой эксепшен каждый из которых занимает 4 строки итого 8 строк для обработки ошибок и всего одна строка для логики. Это сильно понижает читаемость кода, так что мне это вообще не нравится...
  • 🔥 1
Post #351 49
Вот моё второе решение:
добавил интерфейс IDamagable для Player
добавил конструктор каждому классу
добавил exeption
исправил стилистические ошибки
https://gist.github.com/NoNameDeleted/e5d55a42c1e45c0800e9bf083ef71553

Ответ ментора:
1) Fire, конструктор Bot, OnSeePlayer - для всех публичных методов и конструкторов, которые принимают данные нужно делать проверку на их корректность и сразу выкидывать исключение, ArgumentNullException если прилетел null и ArgumentOutOfRangeException если отрицательное количество или условный урон

2) private Weapon _weapon; зависимости должны быть readonly, так как они необходимы объекту все время его жизни

3) HasBullets - нарушен порядок класса, должно быть 1. поля 2. конструкторы 3. события 4. свойства 5. Методы https://stackoverflow.com/questions/150479/order-of-items-in-classes-fields-properties-constructors-methods

4) в методе Fire должен произойти выстрел, если достаточного количества пуль нет, то мы стрелять не можем, но если метод вызван значит нужно, из-за невозможности выполнения с точки зрения логики, нужно кидать исключение InvalidOperationException

5) во всех местах где вы бросаете ArgumentOutOfRangeException, у вас ошибки которые не позволяют скомпилировать этот код, пожалуйста
  • 🔥 1
Post #350 50
Первая тема в напильнике называется "Инкапсуляция" задание называется "Оружие" и звучит так:
Боты ходят по карте и когда видят игрока стреляют в него.
Систему обнаружения игрока оставим за кадром и ограничимся публичным методом OnSeePlayer который условно кто-то будет вызывать.

Разберитесь с инкапсуляцией в этом коде - https://gist.github.com/HolyMonkey/9290ed63c38fc732ed8f58693077095d

Моё первое решение:
Сделал поля приватными
Добавил проверки и условия для здоровья и пуль чтобы они не оказались меньше нуля
Оружие не должно получать игрока целиком это не его ответственность
https://gist.github.com/NoNameDeleted/e5d55a42c1e45c0800e9bf083ef71553

Ответ ментора на это решение:
Оружие может получать IDamageable
В кодстайле не принято писать if в одну строку if (damage <= 0) return;
А фигурные скобки пишутся на отдельных строках if (_health < 0) {
У классов должны быть конструкторы.
Нужно валидировать все параметры публичным методов и конструкторов. Если значения некорректны, бросай исключение, а не делай return
Older posts →

About this channel

How can I read @namlessmoth without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Moth: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Moth have?
Moth (@namlessmoth) has 44 subscribers on Telegram, refreshed roughly every 30 minutes.
Does Moth know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →