Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разное тестирование > Морской бой с компьютером. Оцените работу новичка


Автор: platon2009 10.3.2010, 15:04
Обращаюсь с просьбой к опытным программистам. Помогите кто-нибудь повысить самооценку. Трачу много времени и сил на изучение программирования. Написала первую программу "Морской бой" с компьютером. Программа работает хорошо. Может ли кто-нибудь бегло посмотреть код и оценить?

Не уверена, что сейчас все делаю правильно, первый раз на форуме. Загружаю исполняемый файл. Если найдется добрый человек и захочет посмотреть код, то подскажите как мне его передать.

Если моя просьба выглядит нелепо, то заранее извините.

Добавлено через 14 минут и 19 секунд
Не могу понять, загрузился ли исполняемый файл? Позор мне...

Автор: platon2009 10.3.2010, 19:05
Программа написана в Visual Studio 2008 на VB.

Хоть кого-нибудь интересует женская логика?  smile 

Автор: mr.Anderson 10.3.2010, 19:14
Было бы на C#, поглядел бы код... А так вряд ли помогу))

PS отписался, чтобы не было впечатления, что всем побоку)

Автор: platon2009 10.3.2010, 19:15
Спасибо!

Автор: wester 10.3.2010, 21:13
platon2009, 
1) не интуитивно понятный GUI - то есть я полторы минуты соображал как сделать что бы корабль можно было по вертикали поставить , это признак того что GUI среднестатистическому юзеру будет противен
2) навязчивость хода игры - я , среднестатистический юзер играю, а не слежу что происходит на моем поле, зачем нужны MessageBox с вопросом попал\не попал я не понял. мозг на этом этапе вынесло когда я ответил что не попал , и программа мне сказала "не обманывай"
то есть я не должен постоянно искать на моем поле куда он попал .

по логике игры ничего не могу сказать так как не вижу исходников и прочее

Автор: platon2009 11.3.2010, 09:21
Спасибо, wester, за участие. Соображать полторы минуты - для меня это быстро (Шутка). В любом случае это легко исправить.

"MessageBox с вопросом попал\не попал" для выполнения программы вообще не нужны, но когда играют между собой люди, они же общаются! И обманывать нельзя!!! Пыталась сделать что-то вроде панели с радио-кнопками или всплывающую дочернюю форму с кнопками выбора между "Попал", "Не попал", "Убит". Все это сильно усложняет код, а эффект практически тот-же.

Честно говоря GUI уделила мало внимания. Меня больше волновал "интеллект" компьютера - непредсказуемая игра, разнообразная расстановка кораблей, выбор "правильного" поля для выстрела (если убиты однопалубники, то компьютер не стреляет в одиночное поле и проч.).

Присоединяю папку с проектом. Посмотрите, добрые люди!!!

Автор: wester 11.3.2010, 20:08
Цитата

"MessageBox с вопросом попал\не попал" для выполнения программы вообще не нужны, но когда играют между собой люди, они же общаются! И обманывать нельзя!!

одно дело - человеки играют , другое когда с компьютером -> тут диалог не возможен больше 3-4 окон вдумчивого текста

Цитата

Пыталась сделать что-то вроде панели с радио-кнопками или всплывающую дочернюю форму с кнопками выбора между "Попал", "Не попал", "Убит". Все это сильно усложняет код,

значит плохо спроектирована система - в нормальном коде достаточно переписать функцию вывода результата и все.

Цитата

Меня больше волновал "интеллект" компьютер

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

теперь по коду.
1)бросай VB.net
1)во-первых вынос мозга - это кирилица в именах файлах и самое ужасное в методах, 
мне страшно представить как будет дорабатываться программа на клавиатуре без русских символов
2) хорошо что есть комментарии к коду, но тем не менее это не умоляет того что он написан так сказать в традициях прошлого века
на примере 
Код

Public Enum ТипКорабля
        Нет_Корабля
        Корабль_4
        Корабль_3_1
        Корабль_3_2
        Корабль_2_1
        Корабль_2_2
        Корабль_2_3
        Корабль_1_1
        Корабль_1_2
        Корабль_1_3
        Корабль_1_4
        Убитый_корабль
        Убитый_корабль_4
        Убитый_корабль_3_1
        Убитый_корабль_3_2
        Убитый_корабль_2_1
        Убитый_корабль_2_2
        Убитый_корабль_2_3
        Убитый_корабль_1_1
        Убитый_корабль_1_2
        Убитый_корабль_1_3
        Убитый_корабль_1_4

    End Enum

не проще ли создать массив однотипных классов , а не писать одно и то же много строк подряд?

потом метод Load файла Form1.vb
я не уверен что нужно данный метод загромождать настолько, проще все это вынести в отдельные методы

3)не понятно, как писался код вообще , никакой продуманности нет, видно что было вдохновение , но код типа 
Код

    Private Sub Процедура_попадания(ByVal i As Byte, ByVal j As Byte)
        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_4 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_4
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_4, 1)
            If K(1) < 4 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(1) = 4 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_4) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")
        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_3_1 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_3_1
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_3_1, 2)
            If K(2) < 3 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(2) = 3 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_3_1) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")
        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_3_2 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_3_2
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_3_2, 3)
            If K(3) < 3 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(3) = 3 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_3_2) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_2_1 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_2_1
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_2_1, 4)
            If K(4) < 2 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(4) = 2 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_2_1) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_2_2 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_2_2
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_2_2, 5)
            If K(5) < 2 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(5) = 2 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_2_2) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_2_3 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_2_3
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_2_3, 6)
            If K(6) < 2 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(6) = 2 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_2_3) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_1_1 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_1_1
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_1_1, 7)
            If K(7) < 1 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(7) = 1 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_1_1) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_1_2 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_1_2
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_1_2, 8)
            If K(8) < 1 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(8) = 1 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_1_2) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_1_3 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_1_3
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_1_3, 9)
            If K(9) < 1 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(9) = 1 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_1_3) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")

        End If

        If Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Корабль_1_4 Then
            Поле_Игрока(i, j).Палубность_Корабля = Клетка.ТипКорабля.Убитый_корабль_1_4
            Подсчет_убитых_палуб_кораблей_противника(Клетка.ТипКорабля.Убитый_корабль_1_4, 10)
            If K(10) < 1 And убит = True Then убит = False : MsgBox("ВАШ КОРАБЛЬ НЕ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ")
            If K(10) = 1 Then номер_попадания = 0 : Кол_убитых_кораблей = Кол_убитых_кораблей + 1 : Создаем_пространства_вокруг_убитого_корабля_противника(Клетка.ТипКорабля.Убитый_корабль_1_4) : If Not убит Then MsgBox("ВАШ КОРАБЛЬ УБИТ, НЕ СТОИТ ОБМАНЫВАТЬ!!!")
        End If

        
    End Sub

до черта копипаста , а не кода , все это можно было вынести в три - четыре метода.
нужна хоть какая то продуманность, так как видно что было все написано без какой либо системы.
нужно просто сесть , взять пару листов А4 и расписать все методы что делает и как
или просто развернутую концепцию  , что какой класс делает

Автор: platon2009 12.3.2010, 09:41
Спасибо за критику.
Использовать кириллицу советует автор учебника, по которому я обучалась - помогает не запутаться. Но я с вами вполне согласна, устала переключать клавиатуру.
Не согласна по поводу перечисления. Во-первых, оно пополнялось в процессе работы, во-вторых к элементам массива следует обращаться по номеру(или я что-то не понимаю), значит нужно помнить номер каждого типа корабля или держать перед собой бумажку.
В методе Load файла Form1.vb, все операторы выполняются только один раз - это оформление игрового поля и расстановка кнопок, мне показалось (подсказала женская интуиция), не стоит их разделять. 
По поводу вдохновения - вы совершенно правы (и в остальном, естественно тоже).
Для первого раза-то как? Стоит ли продолжать этим заниматься? Сейчас осваиваю С++(смело с моей стороны?) идет достаточно легко, но отчетливо понимаю, что на этом языке так не распишешься и одного вдохновения не хватит. Спасибо.

Автор: Partizan 12.3.2010, 14:24
platon2009, нормально. с опытом всё придёт. для первого раза - сойдёт smile главное - не останавливайтесь на достигнутом, очень прислушивайтесь к критике(особенно на данном этапе) и старайтесь исправлять свои ошибки.

з.ы. автор, который посоветовал использовать кириллицу, чтобы не запутаться просто неиллюзорно доставил...откуда только такие аффтары берутся...

Автор: Exai1e 13.3.2010, 11:42
о ужас
Цитата(platon2009 @  12.3.2010,  09:41 Найти цитируемый пост)
Использовать кириллицу советует автор учебника, по которому я обучалась - помогает не запутаться.

застрелить, сжечь, отправить в тайгу

купи / скачай нормальный учебник, нормального автора. А то я чувствую этот еще не тому научит...

Автор: platon2009 13.3.2010, 14:42
Вот цитата из учебника "Понятно о Visual Basic .NET" автор Лукин С.Н.


"Называем по-русски. Взгляните в текст любой программы. Он состоит в основном из ключевых слов на английском (на латинице) и имен. Причем и тех и других так много, что глаза разбегаются и непонятно, где ключевое слово, а где имя. А если это имя – то создано ли оно программистом или взято из библиотеки классов .NET Framework – сразу не поймешь. Нам, русскоязычным, здесь удобнее: мы можем имена давать на русском (на кириллице). Разница между английскими и русскими буквами сразу бросается в глаза и разбирать текст программы становится не в пример легче: все, что мы создали сами, названо по-русски, а все, что досталось от VB – по-английски. Я так и делаю."

Очень хороший учебник для новичков. Мне кажется, что по этому учебнику даже мартышка научится программировать. Автор видимо очень трудолюбивый и добрый человек. Буквально разжевывает любую тему, снабжает такими примерами, что сразу становится понятен смысл и область применения любой операции. А от кириллицы всегда легко отказаться. Я так думаю.


Автор: wester 13.3.2010, 16:56

Цитата

Называем по-русски. Взгляните в текст любой программы.

смотря кто автор программы... а то попадаются такие перлы порой на codeplex.com....гхм..я отвлекся)

Цитата

Он состоит в основном из ключевых слов на английском (на латинице) и имен.

поразительно , а из чего еще состоять должен сорец программы ? из тайного записи заклинания вуду ?

Цитата

Причем и тех и других так много, что глаза разбегаются и непонятно, где ключевое слово, а где имя.

учить матчасть. и только.

Цитата

А если это имя – то создано ли оно программистом или взято из библиотеки классов .NET Framework – сразу не поймешь. 

парадоксально, но .net писали тоже мартышки-программисты, получается тогда вообще полная неразбериха!
Цитата

если не понимаешь \ не читаешь чтения сорцов программы то тогда рано отрываться от учебника

Цитата

Нам, русскоязычным, здесь удобнее: мы можем имена давать на русском (на кириллице).

и получать большой геморрой от систем где нет киррилицы))
Цитата

Разница между английскими и русскими буквами сразу бросается в глаза

оооо да!)
Цитата

бросается в глаза и разбирать текст программы становится не в пример легче:

автор что, принимал участие в разработке языка 1с ? откуда такие слова?!
Цитата

все, что мы создали сами, названо по-русски, а все, что досталось от VB – по-английски.

заковыка в том что 100% программы по сути создает программист, а значит он все сам создает

и потом я не могу понять как я могу попутать метод Foo() и какой -то метод из пространства System , типа Console.WriteLine()
Цитата

Я так и делаю.

либо автор тонко стебется над читателем , либо он клинический идиот
Цитата

Буквально разжевывает любую тему, снабжает такими примерами, что сразу становится понятен смысл и область применения любой операции

справки qt и msdn тоже хорошо разжевывают библиотеки классов
Цитата

А от кириллицы всегда легко отказаться.
лучше даже не начинать писать на русском, по возможности даже комментарии писать на английском

теперь по поводу ответа на критику
Цитата

Не согласна по поводу перечисления.

вот для чего нужно перечисление http://msdn.microsoft.com/ru-ru/library/cc138362.aspx
ваше перечисление можно было заменить List<T> выглядит лучше , и обращаться легче
Цитата


В методе Load файла Form1.vb, все операторы выполняются только один раз - это оформление игрового поля и расстановка кнопок, мне показалось (подсказала женская интуиция), не стоит их разделять. 

во-первых, метод Load срабатывает при каждой загрузке формы, если вы будете ее перезагружать, то будет еще раз вызван метод Load()
во-вторых,стоит либо сделать двумерные массивы куда сохранять состояние обоих полей, либо еще что , но не писать код в методах формы. это плохой тон  и ужас при переделке архитектуры
Цитата

Сейчас осваиваю С++(смело с моей стороны?)

прыгнуть с парашюта тоже смело, но смысл ? к тому же к C++ нужно подходить с хорошим знанием того что хочешь сделать , и главное, как будет делать.
да и работа с памятью тоже доставит немало экстаза при отладке


Автор: platon2009 14.3.2010, 16:45
Цитата

систем где нет киррилицы))

С подобными системами я встречусь быть-может в следующей жизни, а в этой  - даже не рассчитываю.  

 
Цитата

вот для чего нужно перечисление http://msdn.microsoft.com/ru-ru/library/cc138362.aspx
ваше перечисление можно было заменить List<T> выглядит лучше , и обращаться легче


Что может быть проще перечисления в данном случае? Чем лучше List<T>? smile 

Цитата

во-первых, метод Load срабатывает при каждой загрузке формы, если вы будете ее перезагружать, то будет еще раз вызван метод Load()


Ну и замечательно! Форма загружается один раз. Зачем перезагружать форму??? Что-бы начать новую игру, есть отдельный метод, он в самом конце Load(). 

Цитата

во-вторых,стоит либо сделать двумерные массивы куда сохранять состояние обоих полей, либо еще что , но не писать код в методах формы. это плохой тон  и ужас при переделке архитектуры


Двумерные массивы я использую, если захочу добавить кнопку сохранения и открытия конкретной игры. Как можно сохранить в двумерный массив расположение и активность управляющих кнопок, расположение игровых полей относительно края формы и т. п., короче - оформление?  И где я должна писать код оформления, если я хочу видеть все поля и кнопки сразу после загрузки файла? Что тогда пишут в методах формы? Вы имеете в виду вызов других методов, расположенных в стандартных модулях?

Цитата

прыгнуть с парашюта тоже смело, но смысл ? к тому же к C++ нужно подходить с хорошим знанием того что хочешь сделать , и главное, как будет делать.


Нет возражений. 











Автор: wester 14.3.2010, 22:00
Цитата

Что может быть проще перечисления в данном случае? Чем лучше List<T>? smile 

если я внимательно смотрел код, то там перечисление у тебя использовалось для хранения и изменения данных.
enum используется просто как перечисление дней недели или времен суток

Цитата

Ну и замечательно! Форма загружается один раз. Зачем перезагружать форму??? Что-бы начать новую игру, есть отдельный метод, он в самом конце Load(). 

гм, ну в данном случае немного просто не туда запихнута инициализация переменных  и полей, в этом случае наверно разницы никакой , просто немного затрудняет понимание того КАК ОНО ВООБЩЕ работает))
Цитата

Как можно сохранить в двумерный массив расположение и активность управляющих кнопок, расположение игровых полей относительно края формы и т. п., короче - оформление? 

можно сохранить во внешний файл расположение кораблей и прочее, например в XML
Цитата

И где я должна писать код оформления, если я хочу видеть все поля и кнопки сразу после загрузки файла?

можно в методе initialize , хотя опять таки стоит многое вынести из файла формы, что бы вся логика хранилась вне формы, а просто вызывалась по мере необходимости одной двумя строчками
Цитата

Вы имеете в виду вызов других методов, расположенных в стандартных модулях?

можно и на Ты)) это предложение вообще не понял. что есть стандартные модуль ?

Автор: platon2009 15.3.2010, 18:00
Цитата

если я внимательно смотрел код, то там перечисление у тебя использовалось для хранения и изменения данных.
enum используется просто как перечисление дней недели или времен суток


Перечисление является простейшим пользовательским типом. Если тебе не хватает встроенных типов, ты создаешь свой собственный и с успехом им пользуешся. А  перечисление дней недели или времен суток - это  доступные для всеобщего понимания перечисления, чтобы некоторым проще было понять -  что же такое перечисление. Используется  оно у меня не для хранения данных, а для определения свойства объекта моего класса.

Цитата

можно сохранить во внешний файл расположение кораблей и прочее, например в XML


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

Цитата

стоит многое вынести из файла формы, что бы вся логика хранилась вне формы, а просто вызывалась по мере необходимости одной двумя строчками


Где ты собираешься "хранить логику", если в модуле формы "хранить" нельзя, а что такое стандартный модуль - ты не знаешь?

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


Автор: wester 18.3.2010, 17:29
Цитата

Если тебе не хватает встроенных типов, ты создаешь свой собственный и с успехом им пользуешся.

да-да,я помню)

а не проще ли создать отдельный класс для сохранения статуса кораблей?
Цитата

Я говорю про оформление формы,

во внешний файл можно сохранить что угодно, даже состояние\оформление формы
Цитата

Где ты собираешься "хранить логику", если в модуле формы "хранить" нельзя, а что такое стандартный модуль - ты не знаешь?

1. в модуле формы позволяется ( ну по крайней мере считается хорошим тоном и большим удобством в дальнейшем) только вызывать методы из других классов, а не производить какие-то вычисления
2. а что такое стандартный модуль ? я пока вижу что в файле формы ~200 строк,строк которые вообще нужны только один раз , и подавляющие большинство из них это создание контролов-отрисовка, и реакция на действия юзера
первое можно было убрать в отдельный класс, предварительно подумав над архитектурой(прочитай любую книгу о хорошем коде,о действительно хорошем , а не ужасе под названием киррилица)
второе можно вынести в отдельный класс, куда передавать аргументы клика пользователя.

Цитата

Все это не то, и не стоит таких долгих обсуждений. 

тогда читаем книги , причем много .авторов подсказать ?
Цитата


Меня волнует сама игра. Все ли учтено для непредсказуемости игры компьютера?

ну создание goto уже стало началом конца... 
это тоже посоветовал автор учебника ??? это я отвлекся
я уже говорил что можно было сделать игру по какому - то алгоритму ?
хотя конечно смотреть на ряды goto почти в каждой 10 строке вселяет оптимизм смотрящему))

Цитата

Правильно ли я поступила, сделав классом отдельную клетку игрового поля, а не корабль?

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

само собой все мои слова относятся к тому если будешь переделывать проект серьезно, а не какие то косметические улучшения.
так как то что сейчас представляет сорцы даже не знаешь куда посылать код
то ли на баш, то ли на gavnokod.ru то ли авторам книги "совершенный код" для того что бы они улыбнулись
никаких обид, просто стоит писать сразу хорошо, даже если не хочется, это войдет в привычку , и дальше будет только легче


Автор: platon2009 19.3.2010, 14:39
Цитата

во внешний файл можно сохранить что угодно, даже состояние\оформление формы

 Зачем????

Цитата

а не проще ли создать отдельный класс для сохранения статуса кораблей?


Цитата

и реакция на действия юзера
первое можно было убрать в отдельный класс


Цитата

второе можно вынести в отдельный класс, куда передавать аргументы клика пользователя.


??? Что такое по твоему класс?


Цитата

авторам книги "совершенный код" для того что бы они улыбнулись


По моему над нами и так уже все улыбаются, причем над обоими.
Все равно, спасибо. Ты единственный, кто уделил мне минутку. Ты хороший программист, просто мне показалось по твоим замечаниям, что ты чего-то недосмотрел. Сложно вникать в чужую абракадабру,  тем более с кириллицей, тем более бесплатно, т.е по доброте душевной.  Еще раз спасибо за советы. Прощаюсь!!!!







Автор: wester 19.3.2010, 18:10
=)
я все еще на сленге с# разговариваю,
сlass - это просто определение своего типа данных http://msdn.microsoft.com/ru-ru/library/x9afc042.aspx
Цитата

Еще раз спасибо за советы. Прощаюсь!!!!

(: было приятно поговорить, пиши еще программы, обсудим.

Автор: qwert8734 29.3.2010, 10:11
Делайте сетевую версию, сам когда-то писал нечто подобное, со связью по компортам для зачета по программированию. Нет ничего лучше, чем играть с другим человеком вместо компа, да и самокопание в сетевом коде значительно повысит ваш класс, как разработчика.
А так- бесят MessageBoxы в большом количестве, не везде сообщения понятны с первого раза, в результате логика игры сразу не совсем понятна.
Очень много copy-paste. Надо бы вычистить это дело в процедуры с параметрами (палубность корабля, начальные координаты и т.д.).
Опять же GUI- программа расчитана только на одно разрешение, в результате кнопка размера окна в заголовке и таскание бордера дают неприглядный результат. По идее надо или подстраиваться под любое разрешение, масштабируя картинку, или сделать игру размерами с калькулятор - это же маленькая развлекалка, она и должна иметь соответствующее оформление и габариты.

Автор: platon2009 2.4.2010, 16:14
qwert8734, спасибо за внимание и критику. 

Честно говоря, не было цели уделять внимание "дружественному интерфейсу". Программу писала для самореализации, хотела суметь заставить компьютер грамотно "играть", т. е. стрелять в нужное место. На это затрачены все силы слабого интеллекта. Исправить несложно, нужно уделить время.

copy-paste - да, это неправильно, любая копия - это отдельная процедура. В процессе об этом думала, а мозг был на грани взрыва, в некоторых моментах не смогла себя заставить думать еще и над параметрами. 

Цитата

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


Дело в том, что я  - самоучка. Для сетевых версий нужны дополнительные знания, у меня их пока нет. Подскажите направление, литературу. Буду признательна.

Автор: qwert8734 3.4.2010, 11:47
Логику игры со временем добить все равно можно, если ставить такую цель и активно долбить в этом направлении. Вопрос- нужно ли? Есть более интересные задачи.
Писать красиво и очень структурно на Васике тоже конечно можно, но лучше тогда перейти на Паскаль и со временем научиться писать GUI на Delphi. Или уйти на C/C++ с возможным переходом потом на c#, кому уж что нравится. По крайней мере любой из них приучает к дисциплине, если руки конечно откуда надо растут.

С сокетами и VB можно кое-что накопать, набрав эти слова в гугле, там много чего интересного выходит. Может кто посоветеует из фанатов VB толковые книжки, через меня все проходило только ориентированным на Си. Апишные вызова можно перетащиь на VB, но это как раз вопрос к гуглу


PS чёй-то я не помню, чтобы нас в институте учили программировать под сокеты или писать драйвера, так что все из нас самоучки в какой-то области

Автор: platon2009 3.4.2010, 13:16
 Спасибо, qwert8734.

Автор: Pilger 3.4.2010, 22:40
Цитата

С сокетами и VB можно кое-что накопать, набрав эти слова в гугле, там много чего интересного выходит. Может кто посоветеует из фанатов VB толковые книжки, через меня все проходило только ориентированным на Си.


Это не VB, а VB.NET (разница гигантская) и тут принцип точно такой же, как и в C#. Это такой же объектно ориентированный язык с теми же библиотеками.

platon2009, игра функционирует нормально (удобство другой разговор) и компьютер действует продуманно. Что касается структуры, то тут, конечно, есть над чем поработать (в сл. проектах). 
Вам придется в любом случае еще подучить некоторые вещи, а пока код очень неудобен и непонятен (чем больше код похож на кашу, тем труднее понять. Никаких GoTo определенно быть не должно). Вам необходимо знать, какие доступны возможности, понять весь принцип. По коду видно, что Вы многие возможности классов и объектов, которые предоставляет VB.NET просто не знаете(а может пользоваться не привыкли) и соответственно не используете и из за этого усложняете себе весь процесс, как и код. Но так начинают все. Важно сперва понять доступные инструменты и тогда вы сможете более грамотно писать код.
Пока можно сказать, что всё успешно реализовано и все работает, но есть куда стремиться  smile.

Автор: platon2009 4.4.2010, 20:18
Pilger, огромное спасибо за участие.

Цитата

код очень неудобен и непонятен (чем больше код похож на кашу, тем труднее понять. Никаких GoTo определенно быть не должно). 


Возможно это связано с кириллицей и длинными названиями?. 
GoTo  - это ужасно, согласна. Использовала для разнообразия, тем более - это самое незначительное место программы, на процесс никак не влияет, только проверяет - честно ли ответил игрок.

Цитата

По коду видно, что Вы многие возможности классов и объектов, которые предоставляет VB.NET просто не знаете(а может пользоваться не привыкли) и соответственно не используете и из за этого усложняете себе весь процесс, как и код


Возможно я неправильно поступила, создав класс-поле, а не класс-корабль? Может стоило реализовать оба класса? Что конкретно я не использую? Учебник я прочитала от корки до корки, все помню и все понимаю. Помогите несколькими фразами, если это возможно. После вашего сообщения повисла в пространстве - куда идти? 

Автор: Pilger 4.4.2010, 22:38
Цитата

Возможно это связано с кириллицей и длинными названиями?. 


Это связано и не только с кириллицей.
Не давайте кнопкам и прочим контролам на форме такие имена, как "НоваяИгра", "УдалениеКораблей", "горизонтальный" и прочее. Впереди контрола должно присутствовать обозначение. Например если это кнопка, то btn, если label, то lbl. Например btnNewGame.
Должно быть больше классов, которые взаимодействуют друг с другом. Это могут быть как поле, так и корабль и часть корабля и даже игроки или информация по игре т.д., которые содержат друг друга. Не кидайте всё в одну большую кучу. Взаимодействие классов должно выглядеть понятно (сверху вниз). Даже отдельные участки кода стоит писать понятнее. Модули лучше убрать.

Перед тем, как кодить, не стоит сразу садиться и начинать. Сперва продумайте структуру. Не пытайтесь что то тут изменить, но MessageBox'ы все таки уберите  smile . Попробуйте теперь что нибудь новое с чистого листа.

Автор: platon2009 8.4.2010, 07:50
Спасибо, Pilger. Ваше сообщение одно из самых полезных для меня. Теоретически это все верно. 
Знаю, что больше времени нужно составлять план на бумаге, потом садиться за компьютер. Пыталась, но не получается пока. Более простые задания так и выполняла. Здесь же - сначала села и проверила одну мысль, за нее зацепилась другая, потом не смогла остановиться - так и пошло. Все думала - вернусь и все переделаю. Но когда игра заработала как надо - оставила все как есть. Нужен огромный опыт, чтобы составлять полноценный план для таких программ. Нужно работать, работать и работать и побольше примеров. Беда в том, что нет наставника. С названиями - да - полная беда. Я потом это поняла, но было поздно. Еще раз спасибо Вам за участие.

Автор: Partizan 8.4.2010, 10:47
Цитата

Все думала - вернусь и все переделаю. Но когда игра заработала как надо - оставила все как есть


гг ))) Встречал немало проектов, которые разрабатывались "профессионалами" по такому же принципу smile

Автор: platon2009 12.4.2010, 13:36
Стоит возгордиться или нет? Почему-то это приятно, не смотря на слово в кавычках.

Автор: Partizan 13.4.2010, 13:55
platon2009, это неправильный подход к разработке...тем не менее он встречается довольно часто...ибо программисты - народ ленивый...

Автор: azesmcar 13.4.2010, 14:05
Сын спрашивает отца-программиста: 
- Папа, а почему солнце встает на востоке?
- Ты это проверял?
- Да
- Работает?
- Да
- Каждый день работает?
- Да
- Тогда сынок, ради бога, ничего не трогай, ничего не меняй!

народная программистская мудрость smile 

platon2009
у меня что-то не так..во всяком случае мне так кажется
user posted image

Автор: wester 13.4.2010, 21:04
azesmcar, 
язык ОС не руcский ?

Автор: azesmcar 13.4.2010, 21:48
Цитата(wester @  13.4.2010,  21:04 Найти цитируемый пост)
язык ОС не руcский ? 

нет конечно smile еще этого не хватало

Автор: platon2009 15.4.2010, 20:44
Это связано с Unicode символами.  Надписи на клеточках - это текст, созданный в цикле при помощи 
Функции Chr, которая  по номеру возвращает символ. Должны быть напечатаны буквы от А (номер 192) до Й. Для не русских ОС буду использовать другие номера.


Автор: Forman 15.11.2010, 15:27
wester Вы уж сильно придираетесь, Вы указываете на недочеты в приложении platon2009 и забываете что это начинающий разработчик а не профессионал, Вы правы во всем, в этом сомнений нет, я сам давно занимаюсь программированием на многих языках в том числе и C++ и VB, с Вами я полностью согласен но Ваша критика больше напоминает слово "отстой" и вообще не стоит этим заниматься... Как говорится учатся на своих же ошибках и для первого раза довольно не плохо написано.
platon2009 - wester прав во всем, но Вы тоже должны уяснить важную вещь, использование кирилицы хоть и поддерживается но это считается плохим тоном программирования, даже вообще чуть ли не запрещенные методы, автор книги по которой вы учились, просто пытался объяснить общие принципы программирования для лучшего восприятия. К стати насчет 1С об этом не мало споров и на самом деле этим только все усложнили нежели упростили работу, так как настоящие программисты начинают плеваться и вообще идти на принцип что этим заниматься не будут а ламеры которые и так ничего не могут они и тут ничего путного не напишут, вот и получается что пишут на этой кирилице только что-то среднее между программистом и ламером.

Насчет того что перечисление классов

Public Enum ТипКорабля
        Нет_Корабля
        Корабль_4
        Корабль_3_1
        Корабль_3_2
        Корабль_2_1
        Корабль_2_2
        Корабль_2_3
        Корабль_1_1
        Корабль_1_2
        Корабль_1_3
        Корабль_1_4
        Убитый_корабль
        Убитый_корабль_4
        Убитый_корабль_3_1
        Убитый_корабль_3_2
        Убитый_корабль_2_1
        Убитый_корабль_2_2
        Убитый_корабль_2_3
        Убитый_корабль_1_1
        Убитый_корабль_1_2
        Убитый_корабль_1_3
        Убитый_корабль_1_4
    End Enum

Так тоже не пишут, программный код должен быть как можно более компактным и оптимизированным и хороший программист тот кто может выполнить поставленную задачу с минимальным кодом программы.

В остальном по больше практики и купите нормальную книгу smile и все хорошо будет если будет желание

Автор: eqinex95 7.3.2014, 12:55
можно взглянуть на алгоритм программы,если он имеется у вас?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)