Комментарии 14
интересное применение пхп :)
+2
Обработка возможных ошибок ( хотя не знаю игру совсем, могу ошибаться), может занять разов в пять больше чем сам скрипт.
Проверено практикой.
Проверено практикой.
0
Обработка ошибок? И даже не помогут исключения throw Exception, try catch? И проверки на isset?
Ну если действительно в несколько раз больше займёт, тогда, решать: нужна ли эта обработка или нет… И если нужна, то уж делать тогда ее качественно.
Ну если действительно в несколько раз больше займёт, тогда, решать: нужна ли эта обработка или нет… И если нужна, то уж делать тогда ее качественно.
Заголовок спойлера
И кстати да, вспомнил, так сказать по безопасности, на настоящем (рабочем) сервере указать
а то если появится ошибка на клиенте могут показаться данные, не желательные к показу…
error_reporting(0);
а то если появится ошибка на клиенте могут показаться данные, не желательные к показу…
0
- скорость уже отлаженных алгоритмов на таблицах 50млн комбинаций/сек. а здесь 5к?
чем больше скорость, тем больше розыгрышей в монте-карло. - здесь, вроде как, не учитываются старшие карты.
у меня пара, у него пара — побеждает из нас тот, у кого старше оставшиеся карты, сначала первая, а если равны, то вторая и затем третья. таких комбинаций в холдеме 4824, а не просто пара, каре или стрит.
допустим, напишем на этом алгоритме подсказчик для неопытного игрока.
просто "у вас 2 пары" — это он сможет понять и сам через полчаса знакомства с правилами игры — пользы никакой.
а вот "у вас 2 пары. ваша комбинация выиграет X% игр против N игроков" — уже надо будет и монте-карло и точный учёт старших карт.
0
Код конечно оставляет желать :). Видно что программируете вы совсем недавно. Впрочем все мы там были, нужно просто развиваться дальше. Рад что вы довели какую-то задачу до конца и помню свои восторги на этой стадии изучения программирования :).
Начнем с начала. В колоде 52 карты, и вы случайно генерируете карту и пытаетесь ее вставить в колоду, если ее там еще нет. Это очень неэффективно. Представьте сколько раз придется генерировать последнюю карту пока попадется правильная. Гораздо правильнее генерировать полностью колоду и потом только ее перемешивать.
Например, сохраняя совместимость с вашим кодом, это могло бы выглядеть примерно так (пишу прямо тут в редакторе, так что могут быть опечатки):
Если то что функция shuffle использует псевдослучайные числа, можно написать свою используя mt_rand, там всего-то строки 4.
Далее, pokerFlush создает 4 массива и использует 4 ветки кода для работы с ними. Было бы гораздо удобнее создать массив из 4 массивов и просто обращаться по индексу масти.
и так далее можно упростить практически весь код.
Начнем с начала. В колоде 52 карты, и вы случайно генерируете карту и пытаетесь ее вставить в колоду, если ее там еще нет. Это очень неэффективно. Представьте сколько раз придется генерировать последнюю карту пока попадется правильная. Гораздо правильнее генерировать полностью колоду и потом только ее перемешивать.
Например, сохраняя совместимость с вашим кодом, это могло бы выглядеть примерно так (пишу прямо тут в редакторе, так что могут быть опечатки):
function cardsCreation()
{
$arrayCards = [];
for($suit = 0; $suit < 4; $suit++) {
for($card = 2; $card <= 14; $card++) {
$arrayCards[] = $suit * 100 + $card;
}
}
shuffle($arrayCards);
return $arrayCards;
}
Если то что функция shuffle использует псевдослучайные числа, можно написать свою используя mt_rand, там всего-то строки 4.
Далее, pokerFlush создает 4 массива и использует 4 ветки кода для работы с ними. Было бы гораздо удобнее создать массив из 4 массивов и просто обращаться по индексу масти.
function pokerFlush(array $arrayCards) {
$suits = array_fill(0, 4, []);
foreach ($arrayCards as $card) { //создаю 4 массива, содержащих разные масти исходного массива
$suit = floor($card / 100);
$suites[$suit][] = $card;
}
//и 4 огромных ифа тоже станут не нужны
for($suit = 0; $suit < 4; $suit++) {
if (count($suits[$suit]) >= 5) {
...
return $result;
}
}
return 0;
}
и так далее можно упростить практически весь код.
+2
Так ведь cardsCreation
генерирует 7 карт, а не 52. Так что не так уж и много раз последнюю карту подбирать))
хотя вместо
if (1 == $multiplier) { //если множитель равен 1, добавляю к числу 100
$card = $card + 100;
} else if (2 == $multiplier) { //если множитель равен 2, добавляю к числу 200
$card = $card + 200;
} else if (3 == $multiplier) { //если множитель равен 3, добавляю к числу 300
$card = $card + 300;
}
можно было написать
$card = $card + 100*$multiplier
0
Спасибо. Очень конструктивный комментарий. Буду следовать вашим советам.
0
Про shuffle я слышала еще от одного человека. Воспользуюсь, если 2 умных человека советуют.
0
можно написать свою используя mt_rand, там всего-то строки 4.
*Только не mt_rand
, а random_int
. Небольшое уточнение.
+1
Короче и красивее, не значит удобнее. При обработке «не изменяемых данных» — это хорошо, когда данные генерирует человек или другой источник, вроде json получаемый, то данные могут случайно или нарочно поменяться, поэтому if, к примеру, очень удобно, вставил новое и всё. Пример другой:
$arr = array_slice($arr_description, 0, 42);
$description = implode(" ", $arr);
if (count($arr_description) > 42) {$description .= '...';};
0
А в 54 карты (с двумя джокерами) холдем играется?
0
Как-то давно писали покер сервер на PHP. Там была вся логика Техасского Холдема. И сравнение карт, и подсказки и все-все-все… Не особо то и сложно было. Эх… хорошие времена были :)
-1
У Вас слишком сложная логикая для стрита.
1) обрезаем данные до «только номинала» (array_map + остаток от деления на 100)
2) удаляем повторы номиналов (array_unique)
3) сортируем по убыванию
4) если под индексом 0 карта == туз добавляем в конец единицу
5) цикл который проверит пятерки карт. Смысла тут проверять каждую нет. Если карты идут «подрят» и повторов нет, то разница между [i] и [i+4] всегда равна 4.
1) обрезаем данные до «только номинала» (array_map + остаток от деления на 100)
2) удаляем повторы номиналов (array_unique)
3) сортируем по убыванию
4) если под индексом 0 карта == туз добавляем в конец единицу
5) цикл который проверит пятерки карт. Смысла тут проверять каждую нет. Если карты идут «подрят» и повторов нет, то разница между [i] и [i+4] всегда равна 4.
function straight ( array $cards ) {
// убираем масти
$tmp = array_map(function ( $card ) {
return $card % 100;
});
// убираем пары
$tmp = array_unique($tmp);
// сортируем
rsort($tmp);
// добавляем туз как 1 в конец
if ( $tmp[0] == 14 ) {
$tmp[] = 1;
}
// проверяем разницу между текущей и +4 картой
// цикл закончится если индекс карты +4 выходит за пределы массива номиналов
for ( $i=0; $i+4<count($tmp); $i++ ) {
if ( abs($tmp[$i] - $tmp[$i+4]) == 4 ) {
// с этой карты начинается стрит
return $tmp[$i];
// наерное вам нужно будет уммножить на 1e+8
}
}
return 0;
}
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Расчет приоритета комбинаций в техасском холдеме (покере) на PHP