Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> битовый массив, хранение карт с помощью флагов(битов) 
:(
    Опции темы
krinart
Дата 28.11.2008, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



хочу сделать карточную онлайн игру, для чего нужно хранить в БД карты игроков. Вроде придумал неплохой способ - битовый массив, где каждой карте сообветствует свой бит, и если она у игрока есть, значит этот бит=1. Так как карт 36, соответственно нужно в БД хранить число <= (2^36-1). 

Но почемуто иногда выскакивают отрицательные числа в самом алгоритме, не пойму почему
приведу код

Код

// список розданных карт      -    пустой
$card= array();
        
        // обнулим массив карт пользователей
        $users= array("1" => "0", "2" => "0", "3" => "0", "4" => "0", "5"=>"0");
        
        srand();
        
        // проход по количеству карт
        for($i= 0; $i<$NCards; $i++)
        {
            // проход по количеству игроков
            for($j= 1; $j<=4; $j++)
            {
                $f= 1;
                while($f)
                {
                    // выберем наугад одну карту
                    $c= rand(0, 35);                    
                    
                    // если её ещё ниукого нету
                    if(! in_array($c, $card))
                    {
                        $f= 0;
                    }
                }
                // добавим её в список отданых
                $card[]= $c;
                
                // отдадим её одному из игроков
                $users[$j] |= (1<<$c);
            }
        }    
        
        // запомним козырь  -   последняя отданная карта
        $users[5] = (1<<$c);


подскажите, в чём проблема
PM MAIL ICQ   Вверх
ZlojEzh
Дата 28.11.2008, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 10
Всего: 15



http://ua.php.net/int
Код

The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.

какие у Вас значения PHP_INT_SIZE и PHP_INT_MAX?

Добавлено через 1 минуту и 24 секунды
да, похоже, и при стандратных 32 bits signed, крайний бит будет управлять знаком
PM MAIL ICQ   Вверх
krinart
Дата 28.11.2008, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



ZlojEzh, а где это посмотреть? ни в php.ini ни в phpinfo() ничего такого нет
PM MAIL ICQ   Вверх
ZlojEzh
Дата 28.11.2008, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 10
Всего: 15



это константы
просто print PHP_INT_SIZE
PM MAIL ICQ   Вверх
krinart
Дата 28.11.2008, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



PHP_INT_SIZE =4
PHP_INT_MAX= 2147483647 

я начинаю догадываться... а как их корректно изменить, чтобы всё заработало?
мне нужно 36 бит
PM MAIL ICQ   Вверх
ZlojEzh
Дата 28.11.2008, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 10
Всего: 15



сомневаюсь, что это меняется

да и вообще, битовый массив в php - это как-то странно
заведите массив boolean'ов
потери в производительности даже замерить будет сложно )
PM MAIL ICQ   Вверх
krinart
Дата 28.11.2008, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



ZlojEzh, а как это вобще сделать? подскажите где можна почитать про массив boolean
PM MAIL ICQ   Вверх
solenko
Дата 28.11.2008, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



krinart, если все таки хочется хранить массив битов, то можно просто разбить карты на два числа -- красное/черное. 18 бит поместятся на любой системе.

Вопрос -- а зачем вам вообще хранить карты в базе? Пользователи могут разлогинится, потом вернутся и продолжить игру?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
krinart
Дата 29.11.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



solenko, дело в том что игра будет не с компьютером, а с другими игроками и сделана при помощи AJAX'a. Вот и придётся всю информацию хранить в базе для обмена с другими игроками. А за совет - спасибо, наверно придётся так и сделать
PM MAIL ICQ   Вверх
krinart
Дата 29.11.2008, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



неужели никак невозможно сделать одним массивом? очень уж некрасиво получается дальше, когда для описания хода, то есть одной карты, нужно добавлять ещё один бит, чтобы хранить к какому цвету относится карта... и такая же ситуация возникает при сохранении козыря... вобщем несколько некрасивый способ, хотелось бы чтото более элегантное   smile 
PM MAIL ICQ   Вверх
solenko
Дата 29.11.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



krinart, вы не ответили на мой вопрос. Игда между жувумя игроками != игру можно продолжить по прошествии дня/недели/окончанию_сессии.
Это я к тому что зачем писать в базу? SESSION будет гораздо убоднее. Кроме того, зачем именно битовая карта? Чеи обусловлена такая экономия места в базе и нужно ли это. Искать по текущему раскладу вы явно не будете, так почему не хранить все тот же сериализованный массив?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
krinart
Дата 29.11.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



использование битовой карты обусловлено её удобством. Для сравнения карт, не нужно знать достоинства карт, с помощью сдвигов можно узнать масть и просто сравнить как числа. 

А насчёт SESSION.. ведь всё равно придётся один раз записать в базу, при раздаче. Чтобы потом все смогли "забрать" свои карты, после чего уже можно и в сессии хранить. Да и ходы тоже придётся писать в базу, чтобы к этой информации имели доступ несколько пользователей. Или я неправильно понял саму идею?
PM MAIL ICQ   Вверх
ksnk
Дата 29.11.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



solenko, сессия вряд-ли будет удобнее. В конце концов игру можно отложить на пол-часа.  Просто не ходить. За это время сессия сдохнет, а запись в базе - не обязательно smile К тому-же сессия предназначена для идентификации одного игрока. Разделение сессии между 2-мя игроками представляется идеологически неверным решением ...

Добавлено через 1 минуту и 36 секунд
krinart, удобство битовой карты для php, imho, несколько преувеличено. 
Можно еще, к примеру, заюзать строку из 36 символов...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krinart
Дата 29.11.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



ksnk, а как же быть со сдвигами? или php настолько всеяден что даже такое сможет?  smile 
PM MAIL ICQ   Вверх
ksnk
Дата 29.11.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



krinart, а зачем вообще используются сдвиги? Чтобы узнать масть? Как, можно поинтересоваться?

Можно составить список задач программы-дилера и подобрать подходящий способ хранения данных.

- новая игра
-- раздать карты
- продолжение игры
-- проверка корректности хода игрока
--- карта, которой сделан ход у противника есть
--- ход не противоречит правилам игры
-- вывод резльтатов хода
- окончание игры
-- поздравление победителя





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1562 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.