Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2011, 21:13   #1
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию Распределение в массиве

Вот пишу игру, мафия называется.
Проблема с распределением ролей, может кто подскажет?
Есть массив:

$role=Array('Мирный житель','Комиссар','9'=>'Мафиози',' 10'=>'Босс мафии');
if($a>=7)$role[8]='Маньяк';
if($a>=9)$role[2]='Доктор';
if($a>=11)$role[3]='Шериф';
if($a>=12){$role[4]='Путана'; $role[5]='Бомж';}
if($a>=14){$role[6]='Самурай'; $role[11]='Шпион мафии';}
if($a>=15)$role[12]='Киллер мафии';
if($a>=16)$role[7]='Фанатик';

Где $a = кол-во игроков, и чем их больше тем больше выбор ролей. Должно быть где-то 40% простых Мирных жителей, 30% простых Мафиози и по одному из остальных. Как это сделать?
SPAHI4 вне форума Ответить с цитированием
Старый 26.06.2011, 22:13   #2
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Забавная задачка. Торопился, поэтому немного некрасиво решил, наверняка найдутся решения и по-прямее, но вот как-то так:
PHP код:
$must_roles = array (
    
'Комиссар'
    
'Босс мафии');
$random_roles = array (
    
'Маньяк'
    
'Доктор'
    
'Шериф');
$citizen_role 'Мирный житель';
$mob_role 'Мафиози';
$citizen_percentage 40;

$mob_percentage 30;
$players_count 10;

$players_roles = array ();
// All players are citizens as default
for ($i 0$i $players_count$i++) {
    
$players_roles[$i] = $citizen_role;
}

// Setting must roles
for ($i 0$i count($must_roles); $i++) {
    do
        
$tmp rand(0$players_count 1);
    while (
$players_roles[$tmp] != $citizen_role);
    
$players_roles[$tmp] = $must_roles[$i];
}


$nm_roles = array ();
$nm_roles_max_count intval($players_count * (100 $mob_percentage $citizen_percentage) / 100) - count($must_roles);
if (
$nm_roles_max_count 0) {
    
// Forming random roles array
    
if ($nm_roles_max_count >= count($random_roles)) {
        
$nm_roles $random_roles;
    } else {
        for (
$i 0$i $nm_roles_max_count$i++) {
            do
                
$t rand(0count($random_roles) - 1);
            while (
in_array($random_roles[$t], $nm_roles));
            
$nm_roles[] = $random_roles[$t];
        }
    }
    
// Setting random roles
    
for ($i 0$i count($nm_roles); $i++) {
        do
            
$tmp rand(0$players_count 1);
        while (
$players_roles[$tmp] != $citizen_role);
        
$players_roles[$tmp] = $nm_roles[$i];
    }
}


for (
$i 0$i intval($players_count $mob_percentage 100); $i++) {
    do
        
$tmp rand(0$players_count 1);
    while (
$players_roles[$tmp] != $citizen_role);
    
$players_roles[$tmp] = $mob_role;

Надо только заполнить обязательные/случайные роли (обязательные будут проставлены в игре обязательно, случайные - только если будет место, и на скольких место будет, стольких и возьмут. Например, если играют 20 человек, то будет 30% = 6 мафиози, 40% = 8 - граждан, комиссар и бос мафии, всего 6+8+2=16 человек. И ещё 4 случайно выбранные необязательные роли.

Защиту от дурака не делал, поэтому не советую использовать скрипт на маленьких количествах игроков - может намертво подвиснуть.
graymaster вне форума Ответить с цитированием
Старый 26.06.2011, 22:35   #3
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию

хм, спасибо. А как это под вывод из бд подогнать?
SPAHI4 вне форума Ответить с цитированием
Старый 27.06.2011, 12:02   #4
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

а что надо выводить из БД и как оно там лежит ?
graymaster вне форума Ответить с цитированием
Старый 27.06.2011, 14:17   #5
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию

выводятся юзеры, подавшие заявку регистрации на игру.
SPAHI4 вне форума Ответить с цитированием
Старый 27.06.2011, 14:34   #6
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

А роли вы будете записывать в БД ?
Если да, то (предположим, у вас есть массив ай-ди пользователей, которые подтвердии участие) - вы пробегаете по массиву ай-ди и просто с каунтером по массиву готорых уже ролей, и делаете апдейт на каждого пользователя.
Либо дублируете присвоение ему роли (а это в том скрипте, что я тут выложил, происходит 1 раз, не считая инициализации всех в мирных граждан), это даже красивее получится.

Если не будете писать в БД (что есть странно, но осуществимо) - то у вас будет 2 массива (в любом случае) - первый - это результаты запроса из БД вида
PHP код:
$players=array(
0=>array("NAME"=>"Vasya","ID"=>5,"PASSWORD"=>"81dc9bdb52d04dc20036dbd8313ed055"),
1=>array("NAME"=>"Petya","ID"=>7,"PASSWORD"=>"81dc9bdb52d04dc20036dbd8313ed055"),
2=>array("NAME"=>"Ivan","ID"=>8,"PASSWORD"=>"81dc9bdb52d04dc20036dbd8313ed055"),
/*...*/
/*...*/
); 
и второй - это сгенерированные роли
PHP код:
$players_roles=array(
0=>'Мирный житель',
1=>'Мафиози',
2=>'Комиссар',
/*...*/
/*...*/
); 
Вы можете их свести к одному массиву добавив к первому второй вот как-то так
PHP код:
foreach($players as $key=>$player_data) {
$players[$key]['ROLE']=$players_roles[$key];

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

Последний раз редактировалось graymaster; 27.06.2011 в 14:36.
graymaster вне форума Ответить с цитированием
Старый 27.06.2011, 14:56   #7
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию

Спасибо большое, попробую.
SPAHI4 вне форума Ответить с цитированием
Старый 27.06.2011, 17:10   #8
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию

Решил действовать своим способом, т.к. в вышеизложенном несоблюдается баланс ролей. Проблема: везде роли в базе 0 (мирный житель)
PHP код:
<?
function role($a=null){
$role=Array('Мирный житель','Комиссар','10'=>'Мафиози','11'=>'Босс мафии');
if(
$a>=6)$role[9]='Маньяк';
if(
$a>=8)$role[3]='Доктор';
if(
$a>=10)$role[4]='Шериф';
if(
$a>=11){$role[5]='Путана'$role[6]='Бомж';}
if(
$a>=13){$role[7]='Самурай'$role[12]='Шпион мафии';} 
if(
$a>=14)$role[13]='Киллер мафии';
if(
$a>=16)$role[8]='Фанатик';
return 
$role;
}
role($countreg);
function 
get_role($rol=null){
global 
$role$countreg;
$rand_keys array_rand($role);
$rand=$rand_keys[0];
$how=mysql_result(mysql_query("select count (*) from `user` where `m_role` = '$rand';"),0);

if(
$how==0)return $rand;
else if(
$how && $rand != '0' && $rand!='10') return get_role();
else if(
$rand == '0' && $how <= $countreg*0.4) return $rand;
else if(
$rand == '10' && $how <= $countreg*0.3) return $rand;
else if(
$rand == '0' && $how $countreg*0.4) return get_role();
else if(
$rand == '10' && $how $countreg*0.3) return get_role();
else return 
get_role();
}
?>

Последний раз редактировалось SPAHI4; 27.06.2011 в 18:12.
SPAHI4 вне форума Ответить с цитированием
Старый 27.06.2011, 18:17   #9
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

А что такое "баланс ролей" ?
/* В "мафию" играл когда-то в далёком детстве, и из правил помню только самый базис */
graymaster вне форума Ответить с цитированием
Старый 27.06.2011, 18:30   #10
SPAHI4
Пользователь
 
Регистрация: 08.06.2011
Сообщений: 10
По умолчанию

Ну, если например шериф(убивает мафа) и киллер(убивает) миров взаимозаменяемы, то победа одной из сторон более возможна. Вот, прошу исправить ошибку в той функции

Последний раз редактировалось SPAHI4; 27.06.2011 в 20:49.
SPAHI4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрическое распределение papoose Помощь студентам 0 21.05.2011 20:43
(BC 3.1) Распределение памяти! Lawliet32 Помощь студентам 8 28.12.2009 23:49
распределение по массиву SuBwooFer JavaScript, Ajax 2 31.08.2009 10:48
Распределение памяти Jeni Общие вопросы Delphi 6 31.03.2008 19:59