Карточная игра "Дурак" с использованием ООП

Делись идеей, получай поддержку и критику!
Ответить
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Карточная игра "Дурак" с использованием ООП

Сообщение Kosist »

Уважаемые форумчане! Предлагаю на ваш суд программу - простая карточная игра "Дурак" против компьютера, но написанная на :labview: с использованием ООП. В качестве основного класса, который здесь используется - это массив Reference на контрол PictRing. А методы, которые здесь используются в основном - это установление тех или иных свойств этих контролов (размер, положение, значение, и т.д.) с помощью функций работы с массивами, и функции с палитры Application Control.
Заинтересованный рассказами о преимуществах ООП в темах, которые поднимались на этом портале, я и решил попробовать так написать эту программу. В принципе, мне понравилось - очень легко и удобно создавать методы (а по-сути - те же sub :vi: , но с уже готовым простым обработчиком ошибок), и удобно исползовать inheritance классов. Правда, я понимаю, что в данном случае может быть, и не очень рационально было использовать ООП, но эти классы и методы можно использовать при написании похожих программ-игр: например, при написании пасьянсов (может, у кого-то будет такое ОДЗ по :labview: =)) )
Интересно было бы узнать ваше мнение по поводу этой программы - правильно ли вообще понята концепция ООП; с удовольствием прислушаюсь к любой критике.
Вложения
Дурак - LabVIEW 2010.rar
Версия LabVIEW 2010
(754 КБ) 422 скачивания
Дурак - LabVIEW 8.5.rar
Версия LabVIEW 8.5
(682.05 КБ) 257 скачиваний
Мы делили апельсин - много наших полегло...
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение AndreyDmitriev »

Почти хорошо, но есть пара замечаний

Во-первых, до тех пор, пока LabVIEW не будет поддерживать юникод, пользоваться русским языком в названиях контролов, комментариях и т.п. не следует. Я, понимаю, это удобно, но я вижу всё это в виде "кракозябров" (у меня Windows немецкий). Конечно, я могу настроить систему и шрифты, но при этом у меня умляуты начнут отображаться русскими буквами.

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

В-третьих, тридцать шесть ссылок на карты - это "некошерно". Тут есть два варианта - либо получить эти референсы программно, обойдя в цикле все контролы на панели (это самый простой метод), и отобрав карты по имени, либо сделать темплейт VI для одной карты и размножить его в памяти, а затем позиционировать передние панели вместо контролов (это чуть сложнее, но даст более гибкую архитектуру - можно будет одним махом перейти от 36-ти карт к 52-м, например)

Классы имеет смысл засунуть в основной кластер (чтобы он не занимал столько места на диаграмме можно его свернуть, либо положить в SubVI) - к чему иметь кучу сдвиговых регистров, можно обойтись одним.

Всё, что находится слева от While цикла можно положить в "Init"

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

Ну и входами/выходами ошибок Вы не пользуетесь совсем.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение Kosist »

Спасибо за замечания! :thank:
Со всеми замечаниями я полностью согласен, но очень заинтересовало
В-третьих, тридцать шесть ссылок на карты - это "некошерно". Тут есть два варианта - либо получить эти референсы программно, обойдя в цикле все контролы на панели (это самый простой метод), и отобрав карты по имени, либо сделать темплейт VI для одной карты и размножить его в памяти, а затем позиционировать передние панели вместо контролов (это чуть сложнее, но даст более гибкую архитектуру - можно будет одним махом перейти от 36-ти карт к 52-м, например)

Если я правильно понимаю, то можно создать обьект этого класса, или какого-нибудь контрола, а потом динамически вызывать? То есть, как например в C : создается класс, потом его обьект, а потом, например, в цикле можно создать 100 его копий с заданными свойствами. А как это можно организовать в :labview: ? Подскажите, пожалуйста. :think:
Мы делили апельсин - много наших полегло...
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение mzu2006 »

В добавление ко всему сказанному AndreyDmitriev по части ООП дизайна

Зачем вообще нужны производные классы от CardReference.lvclass? Например, обратите внимание, что private data дочерних классов не используются в программе вообще. Возможно, имеет место путаница с понятиями "класс"<->"объект", "инстанциация"<->"наследование" ...

Идея управлять массивом ссылок на объекты лицевой панели через класс - хорошая, годная идея. :super:
Аватара пользователя
Chupakabra

Tutorials
professional
professional
Сообщения: 360
Зарегистрирован: 21 янв 2009, 10:50
Награды: 1
Версия LabVIEW: 2015
Откуда: Москва
Поблагодарили: 4 раза
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение Chupakabra »

Кстати о классах, а можно ли создавать статические члены класса, в LabVIEW?
Аватара пользователя
Oleg B.

Activity Professionalism
leader
leader
Сообщения: 674
Зарегистрирован: 25 сен 2011, 11:30
Награды: 2
Версия LabVIEW: 5 .. 2021
Откуда: Israel
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение Oleg B. »

Посмотрел Вашу работу.
Закрытой карте Вы присваиваете значение 37.
ИМХО, в класс нужно добавить флаг видимости карты и по этому флагу показывать её изображение или "рубашку".
Значение карты в таком случае остается неизменным и отпадет необходимость каждый раз искать её значение, перелопачивая весь массив.
veni, vidi, phallomorphi
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение Kosist »

mzu2006 писал(а): mzu2006 від Вчора, 01:41
В добавление ко всему сказанному AndreyDmitriev по части ООП дизайнаЗачем вообще нужны производные классы от CardReference.lvclass? Например, обратите внимание, что private data дочерних классов не используются в программе вообще. Возможно, имеет место путаница с понятиями "класс"<->"объект", "инстанциация"<->"наследование" ...
mzu2006, спасибо за отзыв! Насчет путаниц - то вполне возможно, что я что-то напутал. Просто разбирался в большей мере самостоятельно и по примерам, так что может что-то недопонял.

Oleg B., спасибо за отзыв! Но Ваше замечание не совсем понятно. Просто так как в :labview: есть свойство (да и не только у него) следующего характера: если создано несколько контролов, и эти контролы наложить друг на друга, то последний по времени создания будет перекрывать все остальные. А так как карты ложатся друг на друга, их "берут" со стола, то в игроков будут контролы карт с разным значением их времени создания (или номера индекса их reference в основном классе). Поэтому, когда делается ход, нужно чтобы карта, которой отбивались, лежала сверху. Для этого и сравниваются индексы reference, и в случае необходимости, карты "меняются" как позицией, так и значением. И по-любому нужно записывать эти новые значения, и при клике на карту искать значение карты с учетом этих изменений. Вот поэтому у компьютера карты и имеют значение рубашки 37. Если их оставлять так, как они есть, а сверху накрывать другими, которые могут быть видны или нет, то тогда нужно будет все равно отслеживать индекс "реальной карты" компьютера - той, которую закрывает карта с рубашкой. Плюс ко всему - если комп будет "брать" карты, нужно будет сдвигать и его карты, и те, что сверху, и добавлять верхние карты - а неизвестно, сколько их будет. Вот как-то такие мои мысли по этому поводу.
Еще раз спасибо, что посмотрели на программу. :thank:
Мы делили апельсин - много наших полегло...
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение mzu2006 »

Chupakabra писал(а):можно ли создавать статические члены класса, в LabVIEW?
функции - это просто :vi: - элементы библиотеки класса без терминалов класса.
переменные - LV2Globals, члены класса, например.

роекомендую: http://labviewportal.org/viewtopic.php?f=23&t=3010 - самый первый документ.
Аватара пользователя
Oleg B.

Activity Professionalism
leader
leader
Сообщения: 674
Зарегистрирован: 25 сен 2011, 11:30
Награды: 2
Версия LabVIEW: 5 .. 2021
Откуда: Israel
Контактная информация:

Re: Карточная игра "Дурак" с использованием ООП

Сообщение Oleg B. »

Kosist писал(а):
mzu2006 писал(а): mzu2006 від Вчора, 01:41
В добавление ко всему сказанному AndreyDmitriev по части ООП дизайнаЗачем вообще нужны производные классы от CardReference.lvclass? Например, обратите внимание, что private data дочерних классов не используются в программе вообще. Возможно, имеет место путаница с понятиями "класс"<->"объект", "инстанциация"<->"наследование" ...
mzu2006, спасибо за отзыв! Насчет путаниц - то вполне возможно, что я что-то напутал. Просто разбирался в большей мере самостоятельно и по примерам, так что может что-то недопонял.

Oleg B., спасибо за отзыв! Но Ваше замечание не совсем понятно. Просто так как в :labview: есть свойство (да и не только у него) следующего характера: если создано несколько контролов, и эти контролы наложить друг на друга, то последний по времени создания будет перекрывать все остальные. А так как карты ложатся друг на друга, их "берут" со стола, то в игроков будут контролы карт с разным значением их времени создания (или номера индекса их reference в основном классе). Поэтому, когда делается ход, нужно чтобы карта, которой отбивались, лежала сверху. Для этого и сравниваются индексы reference, и в случае необходимости, карты "меняются" как позицией, так и значением. И по-любому нужно записывать эти новые значения, и при клике на карту искать значение карты с учетом этих изменений. Вот поэтому у компьютера карты и имеют значение рубашки 37. Если их оставлять так, как они есть, а сверху накрывать другими, которые могут быть видны или нет, то тогда нужно будет все равно отслеживать индекс "реальной карты" компьютера - той, которую закрывает карта с рубашкой. Плюс ко всему - если комп будет "брать" карты, нужно будет сдвигать и его карты, и те, что сверху, и добавлять верхние карты - а неизвестно, сколько их будет. Вот как-то такие мои мысли по этому поводу.
Еще раз спасибо, что посмотрели на программу. :thank:
Хочу сказать, что я не изучал Ваш код досконально.
Отметил то, что сразу бросилось в глаза.
А поразило неимоверное количество вызовов функции "Поиск в массиве"
Думаю,что следовало сделать класс более сложным(с большим количеством полей), чтобы избежать или хотя-бы сократить поиски в массивах.
Маленькое замечание - Вы используете автоиндексацию при разборке массивов ( на входе в цикл), но совершенно её не используете для сборки массивов (на выходе из цикла).
О том, что классы целесообразно поместить в "главный" кластер, чтобы избежать транзитных проводов от края до края уже кто-то заметил.
В стянутом коде я это сделал - программа работает, а код выглядит намного аккуратнее.
veni, vidi, phallomorphi
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Проекты»