Создание матрицы карт (покер)
Всем привет!
Мои друзья покеристы раскрывают некоторые секреты игры в покер для заработка на ней в интернете*. Дабы лучше освоить методический материал, и кроме того, подтянуть свои навыки программирования, я решил разработать онлайн-сервис, который бы показывал возможности игры тех или иных рук ("рука" - это те две карты, что сдаются игроку перед раздачей). В покере много вариантов игр, но мы сосредоточились на конкретном - spin&go. Суть его в том, что участвуют три человека - 3max, и HU - (handsup), когда остаются 2 игрока, побеждает один, а игра движется очень быстро за счет быстрого увеличения уровней блайндов (о блайндах и вообще о покере лучше прочитать отдельно, так как тут нет возможности все объяснить). Еще одно, что необходимо упомянуть перед постановкой задачи, это позиции. У нас их три (BU- button, SB - small blind, BB - big blind) и каждый раунд они передвигаются по кругу. В зависимости от позиции, количества игроков за столом и полученных карт в руке, мы играем одной из четырех ключевых опций: fold (пас), call ("сухой" вход в игру), raise (повышение ставки) и all-in (ставим на кон все свои фишки). Общая стратегия - сыграть с более лучшей рукой, чем у оппонентов или же поставить такую ставку, что бы оппоненты играли в пас, отдав банк нам. Что бы знать как играть в какой позиции и с какими картами, мои друзья составили специальные чарты (в экселе), которые я и хочу развернуть на своем сайте. Я уже сделал первый прототип, где можно переключать свою позицию, выбирать размер стека ("стэк" - количество фишек при игроке) и в соответствии с этим отображается тот или иной чарт. http://pokergo.su/v1/ Тот уровень низкого программирования, что вы наблюдаете на этом сайте - это и есть я :p Сам оцениваю себя как новичка, но хочу развиваться в сторону ООП, и надеюсь с этим проектом и с вашей помощью продвинуться в этом направлении. Итак, задача! Проект: покерные чарты онлайн. Элементы: матрица карт (пустой чарт) и контроллеры (кнопки). Действия: контроллеры должны динамично выделять те или иные руки в матрице карт. Пример: ![]() На этом чарте выделены руки, которые мы играем на позиции BU с размером нашего стека от 20бб и больше (игра начинается с 25бб у каждого игрока). Красным выделены те, что играем повышением, зеленым - те, что играем в PUSH (all-in), синим - call, (фиолетовый цвет не считаем). Все что без цвета - в пас. Обратите внимание на то, как составлена матрица, это стандарт в покерном мире. Она делится пополам на две части - одномастные руки и разномастные, по диагонали располагаются парные карты. Собственно это первая часть задачи - генерация подобной матрицы. За сим я вынужден передать пальму лидерства вам, так как мои знания в ООП явно меньше чем в покере :) Нам нужно сгенерировать все эти руки, что бы в дальнейшем каждой из них можно было управлять по средствам контроллеров. Как визуально собрать это в html - наверное самая легкая подзадача, лучше обычными дивами по-порядку друг за другом, дальше по средствам CSS я придам нужный вид матрице, но это потом. Очень сложная для генерации матрица (имхо), и самый простой способ что я вижу, это просто вручную забить все в HTML с навешиванием айдишников на каждый для дальнейшего контроля. Но этот подход из прошлого века мне претит, я чувствую, что должны быть более изящные способы. Возможно, будет удобно, если каждая рука будет описана в виде объекта, в котором будут указаны все необходимые свойства. Такой пример: sAK = { 'name': 'AKs', 'is_suited': 'true', 'is_pair': 'false' } oKQ = { 'name': 'KQo', 'is_suited': 'true', 'is_pair': 'false' } pQQ = { 'name': 'QQ', 'is_suited': 'false', 'is_pair': 'true' } Поправьте меня, если я думаю не в том направлении, но мне кажется, что тут же - для каждой руки, будет уместно описать и поведение в тех или иных контрллерах. pQQ = { 'name': 'QQ', 'is_suited': 'false', 'is_pair': 'true', 'players_3max' : { 'position_BU': { 'bb20': 'call', 'bb15': 'raise', 'bb10': 'push', 'bb5': 'push', }, 'position_BB': { 'bb20': 'raise', 'bb15': 'raise', 'bb10': 'push', 'bb5': 'push', }, 'position_SB': { 'bb20': 'raise', 'bb15': 'push', 'bb10': 'push', 'bb5': 'push', } }, 'players_HU' : { 'position_BU': { 'bb20': 'call', //и тд }, 'position_SB': { 'bb20': 'raise', //и тд }, } Так как я слаб в ООП (читал кое-что), то и не могу точно предположить, что подобная архитектура будет удачной. Как лучше создавать все эти сущности - руками или хитрым циклом, я не знаю. Как контроллеры будут работать с ними - тоже слабо представляю. Важно то, что приложение должно быть расширяемым, будет больше контроллеров и больше опций для каждой руки, поэтому сейчас важно создать устойчивую базу. В дальнейшем подобный проект может стать популярным, если у посетителей будет возможность создания и сохранения собственных чартов. Вот собственно все на пока, надеюсь на помощь, на советы, на javascript :) (Примечание: "проф.покер", это когда вы играете математически правильно на протяжении тысяч игр и имеете с этого 0-10% прибыли с оборота, за счет игроков, которые играют на удачу или же просто не правильно). |
JoeCocker,
Вы почти хорошо описали, но не ту информацию. Вы должны правильно сформулировать ТЗ (техническое задание). Вы так и не объяснили, что такое O, а что такое S. Я предполагаю, что это одномастные и неодномастные, но какая буква чему соответствует я не знаю. Насколько я понял, вам нужно создать объект, но вы хотя бы скажите что у него должно быть из параметров, не в примерах а как есть. Ну и плюс дальнейшее развитие, значит им надо и методы описывать, а о них ни слова вы не сказали. Попробую подумать над этим, как я это вижу, но ничего не обещаю. Вот ещё вопрос. Что именно нужно с пользователем делать? Он выбирает только свою позицию и стак и тогда ему нужно просто вывести картинку см раскрашенными клеточками или же он выбирает руку позицию и стак, но тогда по идеи нужно делать какой-то макет сравнения, что прямо таки будет хреновато, потому что там условий тьма тьмущая в придачу ещё зависимые друг от друга. Вообще, это работа достаточно большая и я не думаю, что кто-то на форуме за спасибо её всю будет делать, а если вам нужно какая-то конкретика, то здесь уже помогут без вопросов (в переносном смысле, вопросы почти всегда возникают=) ). |
Да, s - это suited, они все располагаются в верхней части.
С ТЗ всегда все сложно :) Это либо пятитомник надо писать, либо додумывать по ходу дела. Мне больше нравиться второй вариант, что-то вроде agile-методологии разработки. Первый этап разработки - это матрица рук. Нужно выстроить их по порядку как на картинке. Методы не могу описать, так как не умею ими пользоваться. Только знаю, что это могут быть функции в объекте. По нажатию на кнопки (контроллеры), состояние объектов (рук) меняется (назначаются цвета в чарте-матрцие). Еще раз повторю, что я не спец в программировании, и уж тем более не архитектор ПО, поэтому не могу предоставить грамотное ТЗ, но надеюсь, что в наших дискуссиях родится истина. |
JoeCocker,
Друг, вот я начал набрасывать. Я считаю вот как у тебя задача есть на данный момент я бы сделал вот так. Создал бы на html все эти блоки, в css прописал бы стили для всех случаев, а за счет изменение кнопок позиции и стака уже бы тупо менял бы классы. Вот такой вариант устраивает? |
Это я для себя выложил.
домой приду продолжу, но если вы сами поймете мою задумку, то очень хорошо) <!DOCTYPE html> <html lang="en"> <head> <script src="http://code.jquery.com/jquery-1.11.1.js"></script> <meta charset="UTF-8"> <title>Document</title> </head> <scrit src="http://code.jquery.com/jquery-latest.min.js"></script> <style> p{ border: 1px solid black; width: 50px; height: 50px; display: table-cell; text-align: center; vertical-align: middle; } .blue{ background-color: blue; } .purple{ background-color: #AD009F; } .red{ background-color: red; } .green{ background-color: green; } </style> <script> </script> <body> <div id="position"> <input type="radio" name="position" checked="true">BU</input> <input type="radio" name="position">SB</input> <input type="radio" name="position">BB</input> </div> <div id="stack"> <input type="radio" name="stack">5BB</input> <input type="radio" name="stack">10BB</input> <input type="radio" name="stack">15BB</input> <input type="radio" name="stack" checked="true">20BB</input> </div> <div> <div id="line1"><p id="v14140">AA</p><p id="v14122">AKs</p><p id="v14122">AQs</p><p id="v14112">AJs</p><p id="v14102">ATs</p><p id="v1492">A9s</p><p id="v1482">A8s</p><p id="v1472">A7s</p><p id="v1462">A6s</p><p id="v1452">A5s</p><p id="v1442">A4s</p><p id="v1432">A3s</p><p id="v1422">A2s</p></div> <div id="line2"><p id="v14131">AKо</p><p id="v13130">KK</p><p id="v13122">KQs</p><p id="v13112">KJs</p><p id="v13102">KTs</p><p id="v1392">K9s</p><p id="v1382">K8s</p><p id="v1372">K7s</p><p id="v1362">K6s</p><p id="v1352">K5s</p><p id="v1342">K4s</p><p id="v1332">K3s</p><p id="v1322">K2s</p></div> <div id="line3"><p id="v14121">AQo</p><p id="v13121">KQo</p><p id="v12120">QQ</p><p id="v12112">QJs</p><p id="v12102">QTs</p><p id="v1292">Q9s</p><p id="v1282">Q8s</p><p id="v1272">Q7s</p><p id="v1262">Q6s</p><p id="v1252">Q5s</p><p id="v1242">Q4s</p><p id="v1232">Q3s</p><p id="v1222">Q2s</p></div> <div id="line4"><p id="v14111">AJo</p><p id="v13111">KJo</p><p id="v11121">QJo</p><p id="v11110">JJ</p><p id="v11102">JTs</p><p id="v1192">J9s</p><p id="v1182">J8s</p><p id="v1172">J7s</p><p id="v1162">J6s</p><p id="v1152">J5s</p><p id="v1142">J4s</p><p id="v1132">J3s</p><p id="v1122">J2s</p></div> <div id="line5"><p id="v14101">ATo</p><p id="v13101">KTo</p><p id="v12101">QTo</p><p id="v11101">JTo</p><p id="v10100">TT</p><p id="v1092">T9s</p><p id="v1082">T8s</p><p id="v1072">T7s</p><p id="v1062">T6s</p><p id="v1052">T5s</p><p id="v1042">T4s</p><p id="v1032">T3s</p><p id="v1022">T2s</p></div> <div id="line6"><p id="v1491">A9o</p><p id="v1391">K9o</p><p id="v1291">Q9o</p><p id="v1191">J9o</p><p id="v1091">T9o</p><p id="v990">99</p><p id="v982">98s</p><p id="v972">97s</p><p id="v962">96s</p><p id="v952">95s</p><p id="v942">94s</p><p id="v932">93s</p><p id="v922">92s</p></div> <div id="line7"><p id="v1481">A8o</p><p id="v1381">K8o</p><p id="v1281">Q8o</p><p id="v1181">J8o</p><p id="v1081">T8o</p><p id="v981">98o</p><p id="v880">88</p><p id="v872">87s</p><p id="v862">86s</p><p id="v852">85s</p><p id="v842">84s</p><p id="v832">83s</p><p id="v822">82s</p></div> <div id="line8"><p id="v1471">A7o</p><p id="v1371">K7o</p><p id="v1271">Q7o</p><p id="v1171">J7o</p><p id="v1071">T7o</p><p id="v971">97o</p><p id="v871">87o</p><p id="v770">77</p><p id="v762">76s</p><p id="v752">75s</p><p id="v742">74s</p><p id="v732">73s</p><p id="v722">72s</p></div> <div id="line9"><p id="v1461">A6o</p><p id="v1361">K6o</p><p id="v1261">Q6o</p><p id="v1161">J6o</p><p id="v1061">T6o</p><p id="v961">96o</p><p id="v861">86o</p><p id="v761">76o</p><p id="v660">66</p><p id="v652">65s</p><p id="v642">64s</p><p id="v632">63s</p><p id="v622">62s</p></div> <div id="line10"><p id="v1451">A5o</p><p id="v1351">R5o</p><p id="v1251">Q5o</p><p id="v1151">J5o</p><p id="v1051">T5o</p><p id="v951">95o</p><p id="v851">85o</p><p id="v751">75o</p><p id="v651">65o</p><p id="v550">55</p><p id="v542">54s</p><p id="v532">53s</p><p id="v522">52s</p></div> <div id="line11"><p id="v1441">A4o</p><p id="v1341">K4o</p><p id="v1241">Q4o</p><p id="v1141">J4o</p><p id="v1041">T4o</p><p id="v941">94o</p><p id="v841">84o</p><p id="v741">74o</p><p id="v641">64o</p><p id="v541">54o</p><p id="v440">44</p><p id="v432">43s</p><p id="v422">42s</p></div> <div id="line12"><p id="v1531">A3o</p><p id="v1331">K3o</p><p id="v1231">Q3o</p><p id="v1131">J3o</p><p id="v1031">T3o</p><p id="v931">93o</p><p id="v831">83o</p><p id="v731">73o</p><p id="v631">63o</p><p id="v531">53o</p><p id="v431">43o</p><p id="v330">33</p><p id="v322">32s</p></div> <div id="line13"><p id="v1421">A2o</p><p id="v1321">K2o</p><p id="v1221">Q2o</p><p id="v1121">J2o</p><p id="v1021">T2o</p><p id="v921">92o</p><p id="v821">82o</p><p id="v721">72o</p><p id="v621">62o</p><p id="v521">52o</p><p id="v421">42o</p><p id="v321">32o</p><p id="v220">22</p></div> </div> </body> </html> |
Думаю, что ID лучше назначать со смыслом:
o75 = разномастные 75 sKQ = одномастные KQ |
Это самый простой вариант и совсем не ООП, хотелось бы получить новый опыт :victory:
|
Rise,
Чтобы высчитывать потом значения больше меньше. JoeCocker, 1) там итак уникальные значения. 1ая(ые) цифры старшая карта вторая (ые) младшая последняя цифра 0 - пара 1- разномасть 2 - одномастные. Буквы заменены цифрами для сравнения. Получаем значения id обрезаем первый символ и сравниваем значения. Больше N но меньше M ставим класс такой-то и так далее. 2) Вы хотите новый опыт, при этом чтобы писали другие? Как то не вяжется. 3) Да это самый простой вариант, так как задачу вы нормально не поставили, а для решения такой задачи как я сказал это то, что надо. Хотите другое, сформулируйте тз. |
Конечно я бы хотел сам сделать, но мне не хватает инструментария. Есть чуйка что на реакте такие приложения в самый раз делать.
Или другой фреймворк подходящий? |
Часовой пояс GMT +3, время: 04:31. |