45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
1 | |
Программа для игры в покер28.02.2013, 13:15. Показов 10632. Ответов 46
Метки нет (Все метки)
Никак не могу понять суть ооп.
До прихода в с++ програмировал на С микроконтроллеры. Там всё просто. Есть начало программы, и пишеш инструкции последовательно чтоб устройство работало так, как задумано. Используя регистры, прерывания и тп. Сейчас же выучив немного С++ пытаюсь написать консольное приложение для игры в покер сам с собой. Написал функцию сравнения рук в покере. Даже написал обьект "Автомат игры" для безлимитного холдема для 2-10 чел. (переписывал много много раз) Последняя редакция подкупает своей лаконичностью. В этом обьекте нет "представления" типа ников игроков, аватарок и тп. Нет функции рисования игры в консоле и ввода от пользователя ходов. Вопрос как мне организовать программу чтоб было красиво (понятно) и расширяемо и тп. Вобщем как это делают нормальные програмисты? Вот у меня есть main(). Это точка входа. (в визуал С++ я так её и не нашол когда пытался ) Далее по логике я создаю экземпляры классов какие мне надо в программе. Что дальше? Бесконечный цикл ожидания когда пользователь нажмёт кнопку? И вызов соответствующих функций какихто классов?
0
|
28.02.2013, 13:15 | |
Ответы с готовыми решениями:
46
Программа-бот для игры в покер. Моделирование игры в покер ИИ для игры в покер Клиент-сервер для игры покер |
01.03.2013, 23:36 | 21 |
1) ТС не пользуется компилятором для МК (по крайней мере для своего покера).
2) Об STL вообще речи не шло. Тем более о компиляции "где угодно". ("где угодно" это намёк на микроконтроллеры? - см п.1.)
0
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||
02.03.2013, 00:24 [ТС] | 23 | |||||
Это не моя прихоть, это мой компилятор так пишет. А namespace std не понимает.
Microsoft Visual C++ 2005 Expres Edition Микроконтроллеры (точнее компиляторы для них) не поддержуют С++ и уж точно не поддерживают его полностью. Програмирую на С. ни namespace ни stdafx.h там не надо вовсе (нет никаких "стандартных" потоков ввода вывода), да и память считается в единицах килобайт и нельзя сувать туда всё подряд. Контроллеры младших семейств не имеют даже команды простого умножения байта на байт. И потому по привычке стараюсь использовать операции битового сдвига на С и избегаю деления и работы с плавающей точкой (хотя современному процессору вроде пофиг что делить или умножать всё равно 1 такт) Добавлено через 8 минут Проэлюстрирую вышесказанное моей функцией перевода руки в холдеме в число. Тоесть сила каждой возможной руки однозначно определяется 1м числом типа long (4 байта)
Но эта функция - одно из произведений за которое я реально горд. Вот она будет работать даже на самом маленьком контроллере и очень очень быстро
0
|
02.03.2013, 00:56 | 24 | |||||
в настройках созданного проекта это можно отключить(отключить precompiled headers). А чтобы студия изначально не создавала stdafx нужно создавать в ней проект как empty project.
Добавлено через 2 минуты Эта экономия на спичках в МК может быть ещё и оправдана с учётом его ограниченной памяти, но вообще для такого используют структуры и не парятся. Впрочем, если очень хочешь поэкономить на битах существуют битовые поля. Добавлено через 9 минут Согласись, так понятнее.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
02.03.2013, 01:04 | 25 |
0
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
02.03.2013, 01:05 [ТС] | 26 |
я хорошо знаком с циклами
в данном конкретном случае побитовый подход оправдал себя на все 100% и дело вовсе не в пару байтах памяти. А в принципе. Принципиально используя структуры не получится уместить силу руки в 1 число. Прийдётся делать классы классы классы, и в конечном итоге некий класс руки и перегружать для него операторы сравнения. В итоге для определения победителя из 6ти человек уйдёт в 100 (не преувеличиваю ни капли) раз больше времени у процессора(современного) чем при моей функции. А в покере чтоб посчитать чтото методом монтекарло это очень очень очень критично. Для несовременного процессора вся функция будет выполнена быстрее раз в 10 чем поделить 2 целых числа друг на друга. и раз в 100 быстрее чем поделить 2 числа с плавающей точкой.
0
|
02.03.2013, 01:19 | 27 |
http://habrastorage.org/storag... 43b9f3.jpg
Добавлено через 1 минуту битовые поля. слышал про такое?
0
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
02.03.2013, 01:29 [ТС] | 28 |
Слышал.
- не уверен что будет более читаемо - не уверен что компилятор не поступит с моими записями какимто извращённым способом (и буду потом искать где алгоритм тормозит пол жизни) - я даже не уверен что там есть операторы сдвига. Да и вопрос зачем????? Ведь оператор сдвига ничем не хуже чем сложение, вычиитание, деление. мало того, он даже появился в програмировании раньше Зачем пытатся имитировать работу простейших операторов (проще только инкримент) с помощью битовых полей и тп. Это всё равно что пытатся придумать свою реальзацию оператора сложения для целых чисел. как то через класс целого числа
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
02.03.2013, 01:35 | 29 |
Я повторю свой вопрос- а зачем? На фига эти все выкрутасы? Какая разница уйдёт на расчёт миллиард лет или 100 миллиардов?
0
|
02.03.2013, 01:46 | 30 | ||||||||||
пока что я вижу, что ты имитируешь работу структур и битовых полей с помощью своих выкрутасов.
троллейбус_из_буханки.жпг Добавлено через 5 минут ой, правда?
0
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
02.03.2013, 01:52 [ТС] | 31 |
Ну смотря что считать. Например если даны карманные карты 4х игроков, они все алин и надо посчитать % выигрыша каждого или мат ожидание выигрыша. Для нормальной точности надо скажем 10000 раздач.
Обычный покерный калькулятор. У меня на эту операцию (из жизни) уходит менее 1с. Ждать 100с мало кто станет если это онлайн калькулятор к примеру. Я пока не могу обосновать на 100% что это очень критично, но в любом случае быстрее лучше чем медленнее. Видел много других реализаций сравнения рук. Скажу что они никак не более читабельны. Добавлено через 3 минуты Ну вот прочёл же, а говоришь не читабельно В этом моменте да, можно написать короче.
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|||||||||||
02.03.2013, 03:13 | 32 | ||||||||||
В принципе верно, но не совсем. Достаточно большой проект принято разделять и влавствовать чуть ли не до бесконечности. То есть по сути появляется большое количество модулей разделённых относительно кода (но не работы - они могут работать и параллельно). У каждого модуля есть своя "точка входа" и своя "точка выхода".
Наглая ложь! Я хоть и пару месяцев кодил на асме, но что Linux, что Windows даёт полный доступ к любым прерываниям и регистрам. Как же другие приложения? Насколько я помню, регистров не мало + запоминаются состояния. К тому же шанс того, что система тебя вытолкнет из работы вне вызова какого-нибудь прерывания довольно мал, так что в принципе содержимому в регистрах можно доверять. И именно поэтому во времена Pentium II-III-IV винда могла очень легко "залипнуть". Ну в принципе да, на практике - иначе. ЯВУ позволяют обойтись без... такого цикла
Но на самом деле, это именно цикл. В цикле программа методично превреяет, не были нажаты определённые кнопки и как на их нажатие реагировать (изменять ход течения программы). Вот-вот... Мне вообще кажется, что в этом мире только от силы полтора человека понимают суть ООП. Остальные умеют лишь пользоваться им... ООП - совокупность методов, методик построения ПО. Нельзя взять и понять ООП. Для этого, имхо, может потребоваться десятки лет практики и тонны прочитанной литературы. Но если грубо, то во времена WWII не было даже ассемблера и всё кодилось прямо в двоичных (максимум - десятиричных) кодах. Приход ассемблера внёс первый уровень абстракции - мнемоники. Потом парни из AT&T решили создать хорошую ОС. Но это было сложно и вдобавок они сделали Си. В общем-то, первый ужасный и в то же время очень мощный системый ЯВУ. Хотя, скорее ЯСУ (среднего уровня), но не суть - это всё мелочи. Впоследствии, ОС'ы становились более громозкими, их API разрасталось, усложнялось, расслаивалось; ПО стало более комплексное и куда более сложное... Си стало не хватать и появился Си++ - улучшенный Си, на что намекает инкремент, или Си с классами в раннем варианте. И если сначала комманды были представлены цифрами, потом их обозвали буквами, в Си их стало возможным объединить в функции, то в Си++ класс - аггрегатор функций на основе используемых данных! Это самая обычная эволюция (есть неизвестная революция - функциональные ЯП, но... слишком она неизвестная). Ну вот, собственно и ответ. Как организовывать программу? Всё просто - пишем коды. Когда видим, что функция стала слишком большой, делаем больше функций. В идеале функции должны быть длиной 10-15 символов (хотя краткость - сестра таланта, не забываем), а размером - 5-6 строк максимум (содержательных, офк). Так же и с классами - видем, что он ожирел - время рефакторинга. Разделяем сначала данные на классы (семантически, офк), после чего переписываем методы классов. Из вредных советов, имхо: + должна быть структурка (или класс) GameState, массив этих GameState'ов и указатель на текущий. У них должны быть методы, вроде updateState()... + игрок человек и игрок компьютер не должны быть разделены классом - это одна сущность и не стоит плодить их по напрасну, лучше проверять тип внутри update() и либо ждать ввода, либо ходить самому каким-то образом. + бумага - лучший друг человека; она всё стерпит, а если писать карандашом - долго прослужит... хотя если есть комманда, white-board всё же лучше. Это всё мнение человека (кроме исторических фактов, офк) и оно не претендует быть истинной в первой инстанции. Добавлено через 2 минуты Алсо, рекомендую [перевод]. Добавлено через 10 минут Не знаю о чём Вы, но Си++11 сейчас вообще никто полностью не поддерживает, а Си++ начала двухтысячных прекрасно транслируется в Си99 код. Тем более, что древние компиляторы именно так и делали Си++ -> Си -> ассемблер -> бинарник. По поводу алгоритма? Что за сила руки? Есть вполне определённые алгоритмы рассчёта вероятности выигрыша. Нужно всего лишь посмотреть на свою руку, посчитать (читай, найти) лучшую комбинацию (что очень легко считается с помощью деревьев) и определить вероятность, что у противника рука слабее (с рассчётом на вылетевшие карты, размер колоды и возможности на флопе, тёрне и ривере получить что-нибудь интересное. Это не так просто с точки зрения математики, но с точки зрения кода это довольно просто. Добавлено через 6 минут Простите, что!? Причём здесь невозможность откомпилировать на микро- контроллер или процессор и прекомпилированные хэдеры?
0
|
02.03.2013, 03:52 | 33 |
к регистрам да. К прерываниям. Ну попробуй запиши что-нибудь по вектору прерываний реального процессора. Да вообще хоть к какому-то реальному устройству получи доступ под Windows.
Добавлено через 1 минуту и какой компилятор для микроконтроллеров их использует? Добавлено через 2 минуты При чём тут компиляторы Си++ для микроконтроллеров? Они вообще существуют такие? Не, может и есть, кто знает, но как-то я не встречал их пока. Добавлено через 1 минуту это ещё что?
0
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|
02.03.2013, 12:00 | 34 |
Я видел мощные проекты на C++ для cortex в Keile. Я конечно не вникал особо в чем там ограничения для C++, но мне это никак не мешало в работе.
Тут нужно религиозно верить, либо не верить в ООП(C++). Просто те исходники, которые я писал на C мне никак не пригодились в будующем.(может коряво писал)
0
|
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
|
|
02.03.2013, 12:10 | 35 |
Ничего сложного в precompiled headers нет и это зависит только от компилятора. Все современные компиляторы поддерживают такие заголовки, впрочем, насчёт микроконтроллеров не знаю, проекты там может быть и небольшие и библиотек мало, так что не знаю...
и какой компилятор для микроконтроллеров их использует? Если честно, то не знаю. Знаю, что можно (можно было в какой-то степени) транслировать Си++ код в Си. Отсюда, я так думаю, можно и в микроконтроллер запихать Си++ проект. Правда если микроконтроллер 8-ми битный, то есть шанс поймать проблем. World War II, вестимо. Добавлено через 4 минуты Вот только не надо начинать холивар. С ООП проще поддерживать большие проекты, а Си быстрее (впрочем, не намного) и даёт больший контроль над компьютером (или микроконтроллером). Да и вообще тема пошла в оффтопик =(
0
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|||||||||||
02.03.2013, 12:28 | 36 | ||||||||||
приведу пример своего класса Figures
файл #include "AsteriskFigures.h"
0
|
03.03.2013, 03:05 | 37 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
По поводу начала темы вставлю свои пять копеек. Может я несколько неправильно понял, но в самом топике автор говорит не о сложности самого ООП, а о сложности разработки GUI-приложений. Исхожу из того, что автору все-таки нужно добиться результата, и судя по опыту программирования микроконтроллеров, разобраться в том, что и как происходит.
Abstract Почему? Вообще, когда я увидел название топика, я подумал, что какой-то [n]-классник в очередной раз пытается написать бота к покерстарзу/паразиду/леону/титану/ftt/ge/другое (подчеркнуть нужное, что там сейчас популярно?). Ну и сообщение в духе Имхо, основной вопрос nefton-а заключается в последней строчке: Программист-системщик разбирается в написании удобного пользовательского интерфейса: это, на самом деле, очень интересно. И системное программное обеспечение, и прикладное, и разработка и даже проектирование UI: все интересно. Ну а то, что старые подходы не меняются, и хочется досконально разобраться в том, как все устроено, а не тупо(?) делать так, как предлагает компилятор/система/IDE/платформа: это возводит в квадрат интерес в написании развернутого (насколько смогу) ответа. Возможно, конечно, я щас лишь напугаю, или оттолкну чем-то, в интересе изучения всего этого, хотя может оно и не нужно никому. Не знаю. Но все-таки я постараюсь объяснить принципы, по которым строится и как работает GUI-приложение, насколько удалось разобраться в этом мне. Ну и, если повезет, постараюсь намекнуть, почему разработку GUI и ООП вообще реально перепутать. Поскольку буков многа, а я скромный по натуре, думаю, всем будет лучше, если я все это дело засуну под спойлер. Кликните здесь для просмотра всего текста
Intro Начну с того, что любое GUI-приложение можно разработать на чистом си, без плюсов. Да какой там си. Ассемблер тоже годится! Достаточно скачать FASM (http://flatassembler.net/), и заглянуть в примеры, чтобы убедиться, что вполне себе рабочий GUI можно писать даже на нем. // Сразу скажу, что с иксами непосредственно я не работал, и на низком уровне писал только на WinAPI. Поэтому отталкиваюсь от него. В иксах же, как известно, добавляется еще и клиент/серверное взаимодействие, и, наверное, еще что-то, так что модель WinAPI, пожалуй, самый простой вариант. Пробуем написать приложение, выводящее форму на экран и делает что-то при нажатии на левую кнопку мыши. Начало стандартное:
Не по теме: заранее извиняюсь за K&R, знаю, что бОльшая часть сишников уважают ANSI-стиль Ну и что же теперь? Известно, что при нажатии мышки возникает некоторое прерывание, обработчик которого, разумеется, находится в ОС. ОС также занимается обработкой прерываний при перемещении мышки, поэтому она точно может знать, в какой позиции экрана находится курсор. То есть при нажатии клавиши мышки, ОС сама по себе запросто определяет, какая клавиша была нажата (берется с аппаратуры), и позиция курсора. Чтобы понять, на каком элементе, и в каком окне произошло нажатие, нужно, чтобы ОС знала, где располагаются эти элементы. Для этой цели ОС должна предоставлять функции регистрации некоторых прямоугольников, которые будут чем-то вроде "областей нажатия": при нажатии мышки на этом прямоугольнике, система должна запоминать, что в этом прямоугольнике клавиша была нажата. Поэтому, определим структуру:
Наглядное применение нашего "свежесозданного" апи, с применением for( ; ; ):
В книге Таненбаума "Операционные системы. Разработка и реализация" упоминалось, что у каждого процесса есть некий флаг загруженности. То есть если программа была прервана операционной системой (кстати, делается это по таймеру, или IRQ0, при вытесняющей многозадачности), то ей нетрудно догадаться, что программа то еще работает! С другой стороны, если программа сама передала управление в ОС, сказав: "щас мне нечего делать. я жду ввода", ОС не зачем вхолостую тратить драгоценные такты на десятки, да или сотни даже таких процессов. Значит, после создания Rect-а, программа должна передать управление в ОС специальным образом, и тогда флаг занятости будет установлен в 1, а планировщик не будет передавать управление нашей программе. При этом, из самой очереди планировщика ее можно не исключать, ведь ОС в любой момент может сбросить флаг занятости, и тогда ему нужно будет вновь передавать управление в нашу программу. Не по теме: Будь благословенен каждый, кто дочитал до сюда и все понял. Как жеж такое сделать? На самом деле все просто до безумия. Если подумать, когда жеж должно передаваться управление в программу, если та ожидает, что пользователь нажмет на мышку в окошке? Правильно: тогда, когда пользователь нажмет на мышку в этом окошке! А от мышки управление, как уже говорилось, поступает непосредственно к ОС: возникает некое прерывание. точно также от клавиатуры (для PS/2 это IRQ1), точно также при любом движении мышки/сенсорника, или любого другого устройства ввода (и не только). при этом, ОС отдает управление некоторому системному процессу. Не по теме: Это необходимо, т.к. сами прерывания должны обрабатываться моментально, ибо когда обрабатывается одно прерывание, по-хорошему, не может возникнуть другое. В итоге, скажем, если реализовать логику поиска среди всех зарегистрированных прямоугольников на экране именно в обработчике прерывания от мышки, то в это время будут теряться все "сообщения" от клавиатуры и от других устройств, вплоть до жесткого диска, который тоже вызывает некоторый IRQ в начале/конце записи/чтения блока данных. С учетом того, что логика поиска нужного прямоугольника по заданной точке может занять не один десяток килотактов, то может "потеряться" приличное количество прерываний. Системный процесс реализует алгоритм поиска точки внутри заданного массива прямоугольников (все они зарегистрированы в системе, и этот системный процесс имеет доступ по крайней мере, на чтение этого массива). Определяет нужный прямоугольник, и .... Что? Правильно! Нужен некоторый идентификатор процесса, к которому привязываются все создаваемые в нем прямоугольники! А еще лучше, если у каждого прямоугольника будет указатель на процесс, ну или хотябы его идентификатор. Так. Теперь уж точно хватит прямоугольников. Прямоугольник, имеющий какой то непонятный идентификатор на что-то вообще левое -- разве это прямоугольник? Назовем эту нашу штуку, имеющую размер, позицию, и ID процесса, окном (Window). Не по теме: На самом деле, в винапи, да я думаю, и в других подобных апи, определяется абстракция "приложение" (Application), к которому можно привязать n-ое количество этих окон. Window-ы привязываются к Application-у, а тот, уже, в свою очередь, связан с некоторым процессом в системе. После того, как системный процесс определил нужное окно, он считывает из его структуры id процесса и сбрасывает его флаг занятости. Планировщик через какое-то время передает управление этому процессу. Процесс обрабатывает нажатие мышки и снова должен вызвать функцию ожидания клика, или завершиться. Получаем код типа:
Остаются "сущие пустяки": разобраться, как можно одновременно обрабатывать и клики мышки, и нажатия клавиш на клавиатуре, и какие-нибудь таймеры, "прокрутку" "колесиком" ну и прочее и прочее... Я как-то уже упоминал слово "событие". Так вот. Всем этим нажатиям, движениям, прокруткам, таймерам, можно дать одно название: все это является событием (Event). Все эти события берутся от операционной системы. А откуда они берутся в операционной системе, было описано выше, на примере с кликом. События бывают разные, и описать его, например, так:
Кликните здесь для просмотра всего текста
Пример все с той же клавиатурой: при нажатии на клавишу передается только сама клавиша. На самом деле этого мало. Хотя, в принципе, конечно, этого достаточно, но удобнее, если нажатие по Ctrl или Alt или Shift не вызывало никаких событий, а всего лишь меняло бы некоторые флаги. А вот уже при нажатии на букву или цифру(например), мы получили бы целое, "большое" сообщение: с битовой маской зажатых клавиш-модификаторов. Также, CapsLock-и, ScrollLock-и, и NumLock-и должны автоматически менять нажатую клавишу внутри операционки, а в сообщении должна быть указана уже измененная клавиша.
Поэтому тут логично применить наследование (да-да, то самое, из ООП). Варианты возможной реализации я нашел тут: http://stackoverflow.com/quest... tance-in-c. Но здесь я намеренно не буду их употреблять, ибо и так уже многа букав:
Не по теме: Разумеется, код упрощен до безумия. Смысл его только в том, чтобы показать принцип, на самом низком уровне, доступном программисту. Как оно от аппаратуры приходит "в жизнь":), ну приблизительно. Не учтены по крайней мере переходы из ring0 в ring3, и наоборот, еще __declspec(naked) не поддерживает, скажем, gcc под x86 (и x86_64, разумеется, тоже). хотя как-то мною был сделан на 70% рабочий патч, исправляющий это. Кроме того, я никогда не находил информации о том, как в действительности работать с мышью. Видел только несколько реализаций на основе int 33h, но разумеется, тут это не прокатит, хотя бы потому что это софтвеерное досовское прерывание:) доки по юсб не осилил, ну а 2ой ps/2 не нашел из каких портов читать. в этом я, разумеется, каюсь, но на сами принципы это никак не влияет Затем, с этими событиями и обработкой сообщений все становится крайне просто:
Вот. ну а по поводу библиотек разработки, помоему у qt самый низкий порог вхождения, плюс собственная неплохая гуи, плюс кроссплатформенность. На нем же, пожалуй, хорошо учиться основным паттернам проектирования. Впрочем, теми же качествами обладает и wxWidgets, но он немного посложнее сам по себе, и его, говорят, сложнее портировать на некоторые платформы. Из плюсов wx: огромное количество поддерживаемых языков (в т.ч. луа, хаскель и эрланг, к примеру). Visual Studio тяжелый, работает только под винду, из достоинств разве что отладка поприятнее в чем-то. Если вдруг понадобится распространять приложение, то у qt LGPL лицензия (нельзя изменять саму библиотеку и при этом не открывать код. при динамической компоновке код своего приложения можно никогда никому не показывать и продавать до тех пор, пока налоговая не возмет за одно место), у wx -- BSD подобная (делай вообще все что хочешь, желательно только лишь положить текст самой лицензии в папку с приложением, хотя и это не очень-то и обязательно). Ну а VS работает со своими runtime библиотеками, устанавливающимися на целевой машине, отдельно. там разумеется лицензий 0, так как попросту лицензировать нечего, тем более что компилятор бесплатный. По поводу расширяемости программы. Нужно так прикинуть, насколько оно должно быть расширяемо (ну например, если это только для того, чтобы играть с другими игроками, по сети, на одном столе, и расширять нужно только всякие там карты, анимации движения, -- это одно. или все же может захотеться когда-нибудь сделать возможность игры МТТ, -- это другое). Нужно это для того, чтобы определить API (Application Programming Interface: тот функционал (интерфейс), который будет доступен плагинам) программы. Есть технологии плагинов с разделяемыми библиотеками и скриптовые. В первом случае на тех же плюсах создается длл-ка, которой при инициализации передается некий объект, содержащий реализацию функций API. Она этот указатель на этот объект сохраняет, во внутренней переменной, а потом им пользуется, когда нужно что-то сделать в контексте основной программы. Для полного щастья для разделения интерфейса/реализации API используется паттерн "мост", либо банально массив(или сложная структура) указателей на функции (неужели после первой части звучит ужасающе? вот пример, как это делается). Во втором случае, программа содержит в себе реализацию небольшой виртуальной машины для скриптового языка. При этом она (программа) также передает ей (виртуальной машине) некий объект, содержащий реализацию того, что можно сделать с основной программой. машина регистрирует у себя этот объект под некоторым именем (в самих виртуальных машинах чуть менее чем всегда используются строки, для именования переменных, это все сильно резко упрощает). Далее, когда основная программа решила, что пора бы уже поработать плагину, она дает ВМ (виртуальной машине) соответсвующее указание: мол запусти-ка скриптик из такого-то файла. и та запускает, и этому скрипту разумеется, передается то самое API в том самом глобальном объекте, которым всегда ему можно будет воспользоваться, чтобы совершить действия с основной программой (пример). По первому варианту все ясно с деталями реализации (плюсы, компиляция, dll/so). По второму: реализаций ВМ полно. По большому счету, кроме синтаксиса языка, они различаются только производительностью. Так вот, в этом плане наиболее удачные, на данный момент, реализации -- это Google V8 и LuaJIT. Есть и еще несколько, если синтаксис этих ну совсем не катит Не по теме: приведенные ссылки -- это именно встраиваемые языки, то есть относительно легко прикручивающиеся к другим программам. в действительности, их тысячи Для сведения, Google V8 наоптимизировали по самое небалуйся, и результат сопоставим по скорости даже с тем же си, в вычислительных задачах (!!!), по крайней мере на одном ядре. Хотя никто не мешает все трудоемкие операции перенести в плюсы, тем более, что раз уж на нем пишется приложение, это будет сделать очень и очень просто. Так что, я бы в первую очередь при выборе скриптового языка обратил бы внимание на то, насколько мне понравился его синтаксис, и насколько интересно мне его будет изучать (если придется). По поводу алгоритма подсчета вероятности на вскрытии. Когда-то сам думал, что эта задача решается только моделированием. Но вот только пока сочинял эту хрень, я придумал следующий алгоритм. Весь алгоритм делится на две возможности:
Conslusion Вообще, лично я бы на вашем месте подумал о реализации всего этого дела на html5+javascript(canvas). Недавно как раз познакомился с Google Closure Library, крутая штука. Производительность у canvas очень неплохая (ибо аппаратное ускорение, в большинстве современных браузеров), и есть несколько неплохих библиотек для него (пока что мне больше всех понравился fabric.js, хотя в той же GCL есть Canvas, пока еще с ним не разобрался). Хотя, скорее всего, можно обойтись для начала и без canvas-а, там и так можно сделать прикольную анимацию, и кучу красивостей. А сервер бы реализовал на эрланге. Но это конечно, только лишь мое личное предпочтение, ибо я, по большей части, web-программист, хоть и не фронтэндер (пхп-шник, разумеется). Просто прельщает возможность, скажем, зайти на сайт, и ничего не устанавливая, поиграть в онлайне с кем угодно. Не по теме: так, стоп, разве такого еще нет? гуглить стремно, не хочу, ато вдруг получится что зря все писал:)
6
|
03.03.2013, 03:17 | 38 |
Черт. примеры-то забыл!
Простая реализация плагинной системы через шаред-либрариз: attach1.zip Реализация через ВМ скриптового языка: attach2.zip Для запуска без перекомпиляции требуются рантайм либы Qt5 (QtCore5.dll, QtScript5.dll, QtGui5.dll, QtWidgets5.dll) и mingwwm[чета там].dll. Должно компилиться под 4ую версию. Не включил их потому что не понимаю, зачем их запускать. главное код. просто убедиться что все работает, разве что можно. Еще, если интересна вдруг станет эта тема, могу более подробно объяснить, в картинках (uml диаграммы), как и что работает в общем случае, просто надо отыскать свой диплом первый
0
|
XRuZzz
|
03.03.2013, 12:21
#39
|
Не по теме: это стоило оформить в качестве статьи(в каком нибудь блоге например), и в этой теме дать на неё ссылку, а теперь если аналогичный вопрос будет задан на киберфоруме или на другом сайте, придётся давать ссылку на эту тему.
0
|
nefton
|
03.03.2013, 12:41
[ТС]
Программа для игры в покер
#40
|
Не по теме: У каждого поста вроде есть ссылка. Не по теме: Попробую как то накидать схему приложения (в фотошопе???), а то можно обобщать обобщать и в конечном итоге всегда один и тот же вопрос - в чём смысл жизни :)
0
|
03.03.2013, 12:41 | |
Определение ранга комбинации рук для игры Покер Как купить премиум набор для игры в покер Массив карт для игры в покер используя Struct Какой движок выбрать для написания игры в покер Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |