| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > битовый массив |
| Автор: krinart 28.11.2008, 01:56 | ||
| хочу сделать карточную онлайн игру, для чего нужно хранить в БД карты игроков. Вроде придумал неплохой способ - битовый массив, где каждой карте сообветствует свой бит, и если она у игрока есть, значит этот бит=1. Так как карт 36, соответственно нужно в БД хранить число <= (2^36-1). Но почемуто иногда выскакивают отрицательные числа в самом алгоритме, не пойму почему приведу код
подскажите, в чём проблема |
| Автор: ZlojEzh 28.11.2008, 02:03 | ||
http://ua.php.net/int
какие у Вас значения PHP_INT_SIZE и PHP_INT_MAX? Добавлено через 1 минуту и 24 секунды да, похоже, и при стандратных 32 bits signed, крайний бит будет управлять знаком |
| Автор: krinart 28.11.2008, 02:09 |
| ZlojEzh, а где это посмотреть? ни в php.ini ни в phpinfo() ничего такого нет |
| Автор: ZlojEzh 28.11.2008, 02:13 |
| это константы просто print PHP_INT_SIZE |
| Автор: krinart 28.11.2008, 02:24 |
| PHP_INT_SIZE =4 PHP_INT_MAX= 2147483647 я начинаю догадываться... а как их корректно изменить, чтобы всё заработало? мне нужно 36 бит |
| Автор: ZlojEzh 28.11.2008, 03:05 |
| сомневаюсь, что это меняется да и вообще, битовый массив в php - это как-то странно заведите массив boolean'ов потери в производительности даже замерить будет сложно ) |
| Автор: krinart 28.11.2008, 04:09 |
| ZlojEzh, а как это вобще сделать? подскажите где можна почитать про массив boolean |
| Автор: solenko 28.11.2008, 08:30 |
| krinart, если все таки хочется хранить массив битов, то можно просто разбить карты на два числа -- красное/черное. 18 бит поместятся на любой системе. Вопрос -- а зачем вам вообще хранить карты в базе? Пользователи могут разлогинится, потом вернутся и продолжить игру? |
| Автор: krinart 29.11.2008, 00:30 |
| solenko, дело в том что игра будет не с компьютером, а с другими игроками и сделана при помощи AJAX'a. Вот и придётся всю информацию хранить в базе для обмена с другими игроками. А за совет - спасибо, наверно придётся так и сделать |
| Автор: krinart 29.11.2008, 04:33 |
| неужели никак невозможно сделать одним массивом? очень уж некрасиво получается дальше, когда для описания хода, то есть одной карты, нужно добавлять ещё один бит, чтобы хранить к какому цвету относится карта... и такая же ситуация возникает при сохранении козыря... вобщем несколько некрасивый способ, хотелось бы чтото более элегантное |
| Автор: solenko 29.11.2008, 08:27 |
| krinart, вы не ответили на мой вопрос. Игда между жувумя игроками != игру можно продолжить по прошествии дня/недели/окончанию_сессии. Это я к тому что зачем писать в базу? SESSION будет гораздо убоднее. Кроме того, зачем именно битовая карта? Чеи обусловлена такая экономия места в базе и нужно ли это. Искать по текущему раскладу вы явно не будете, так почему не хранить все тот же сериализованный массив? |
| Автор: krinart 29.11.2008, 13:37 |
| использование битовой карты обусловлено её удобством. Для сравнения карт, не нужно знать достоинства карт, с помощью сдвигов можно узнать масть и просто сравнить как числа. А насчёт SESSION.. ведь всё равно придётся один раз записать в базу, при раздаче. Чтобы потом все смогли "забрать" свои карты, после чего уже можно и в сессии хранить. Да и ходы тоже придётся писать в базу, чтобы к этой информации имели доступ несколько пользователей. Или я неправильно понял саму идею? |
| Автор: ksnk 29.11.2008, 13:47 |
| solenko, сессия вряд-ли будет удобнее. В конце концов игру можно отложить на пол-часа. Просто не ходить. За это время сессия сдохнет, а запись в базе - не обязательно Добавлено через 1 минуту и 36 секунд krinart, удобство битовой карты для php, imho, несколько преувеличено. Можно еще, к примеру, заюзать строку из 36 символов... |
| Автор: krinart 29.11.2008, 14:00 |
| ksnk, а как же быть со сдвигами? или php настолько всеяден что даже такое сможет? |
| Автор: ksnk 29.11.2008, 14:19 |
| krinart, а зачем вообще используются сдвиги? Чтобы узнать масть? Как, можно поинтересоваться? Можно составить список задач программы-дилера и подобрать подходящий способ хранения данных. - новая игра -- раздать карты - продолжение игры -- проверка корректности хода игрока --- карта, которой сделан ход у противника есть --- ход не противоречит правилам игры -- вывод резльтатов хода - окончание игры -- поздравление победителя |
| Автор: krinart 29.11.2008, 14:32 | ||
| ksnk, насчёт программы-дилера это и так понятно, над ним сейчас и работаю. А вот по поводу способа хранения данных... Масть можно узнать заданной карты сравнивая с маской 255 (8 единиц) и сдвигая вправо, например так
В данном случае в $card хранится 1 карта, то есть в дсс только одна единица. И как только эта единица появится в первых восьми разрядах, значит можно определить масть. Таким образом в конце цикла будет известна масть в $m а в $card будет храниться достоинство карты. Это всё удобно, единственный вопрос, можно ли заставить php хранить такое число, ведь $card должно иметь как минимум 36 битов, а лучше и 37 - для джокера, но это уже другая история... |