Как стать автором
Обновить

Комментарии 14

интересное применение пхп :)
Обработка возможных ошибок ( хотя не знаю игру совсем, могу ошибаться), может занять разов в пять больше чем сам скрипт.
Проверено практикой.
Обработка ошибок? И даже не помогут исключения throw Exception, try catch? И проверки на isset?
Ну если действительно в несколько раз больше займёт, тогда, решать: нужна ли эта обработка или нет… И если нужна, то уж делать тогда ее качественно.
Заголовок спойлера
И кстати да, вспомнил, так сказать по безопасности, на настоящем (рабочем) сервере указать
error_reporting(0);

а то если появится ошибка на клиенте могут показаться данные, не желательные к показу…
  • скорость уже отлаженных алгоритмов на таблицах 50млн комбинаций/сек. а здесь 5к?
    чем больше скорость, тем больше розыгрышей в монте-карло.
  • здесь, вроде как, не учитываются старшие карты.
    у меня пара, у него пара — побеждает из нас тот, у кого старше оставшиеся карты, сначала первая, а если равны, то вторая и затем третья. таких комбинаций в холдеме 4824, а не просто пара, каре или стрит.

допустим, напишем на этом алгоритме подсказчик для неопытного игрока.
просто "у вас 2 пары" — это он сможет понять и сам через полчаса знакомства с правилами игры — пользы никакой.
а вот "у вас 2 пары. ваша комбинация выиграет X% игр против N игроков" — уже надо будет и монте-карло и точный учёт старших карт.

Код конечно оставляет желать :). Видно что программируете вы совсем недавно. Впрочем все мы там были, нужно просто развиваться дальше. Рад что вы довели какую-то задачу до конца и помню свои восторги на этой стадии изучения программирования :).

Начнем с начала. В колоде 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;
}

и так далее можно упростить практически весь код.

Так ведь 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
Спасибо. Очень конструктивный комментарий. Буду следовать вашим советам.
Про shuffle я слышала еще от одного человека. Воспользуюсь, если 2 умных человека советуют.
можно написать свою используя mt_rand, там всего-то строки 4.

*Только не mt_rand, а random_int. Небольшое уточнение.

Короче и красивее, не значит удобнее. При обработке «не изменяемых данных» — это хорошо, когда данные генерирует человек или другой источник, вроде json получаемый, то данные могут случайно или нарочно поменяться, поэтому if, к примеру, очень удобно, вставил новое и всё. Пример другой:
$arr = array_slice($arr_description, 0, 42);
$description = implode(" ", $arr);
if (count($arr_description) > 42) {$description .= '...';};
А в 54 карты (с двумя джокерами) холдем играется?
Нет, холдем играется без джокеров.
Как-то давно писали покер сервер на PHP. Там была вся логика Техасского Холдема. И сравнение карт, и подсказки и все-все-все… Не особо то и сложно было. Эх… хорошие времена были :)
У Вас слишком сложная логикая для стрита.
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;
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории