MOCHET [7] 
26.07.2018 01:00
 0просмотров 15 0

Способы раздачи карт


По правилам столицы в начале игры у каждого так:
• 2 шахты, 5 руды
• 2 монастыря, 5 маны
• 2 казармы, 5 отрядов

Когда начинается игра, у первого игрока (тот который ходит первым) по 7 ресурсов каждого типа (5+2).

Сейчас интересно узнать как можно играть в самом первом ходу.

Итак есть 7 ресурсов каждого типа.
И есть 102 карты.

Не сложно посмотреть, что всего 62 карты со стоимостью <= 7
62/102*100% = 60.78% от общего количества
Иными словами это и есть вероятность того что нам попадаёт карта со стоимостью <= 7 единиц ресурса.

Внимание
Так как неизвестен алгоритм раздачи карт на сервере, то я предлагаю здесь три варианта, где считаю, что один из них может быть использован на сервере.

Если начать выбирать какая карта хорошая, а какая нет - т.е. какой картой человек точно не будет играть в первом ходу, то естественно количество карт будет уже не 62 (со стоимостью <=7 ресурса), а намного меньше.
Вопрос как обьективно определить ценность какой-то карты в начале игры здесь пока что не рассматривается. Так для начала нужен какой-то scoring для карт на основе которого и можно будет отталкиваться.
Чтобы не усложнять рассчёты пока я не использую никакой scoring (оценку) карт, а беру карты такими как они и есть. Естественно это не совсем соответствует реальности.

Цель данной статьи в первую очередь посмотреть на возможные механизмы раздачи,



Вариант раздачи карт #1


Представим себе, что карты раздают так:
1) сначала 6-7 карт игроку #1
2) потом из оставшихся выдают карты игроку #2

Идея: берём из колоды карту, потом мешаем, и рандомно снова выбираем карту, потом снова рандомно выбираем и так далее.

Формула


И должно действовать правило: a + b = c

У игрока #1: 6 карт на руках

Вероятность, что из них Х карт со стоимостью <= 7:
X: %
0: 0.2850532
1: 3.0297083
2: 12.8341808
3: 27.7495801
4: 32.3136557
5: 19.2224824
6: 4.5653396

У игрока #1: 7 карт на руках

Вероятность, что из них Х карт со стоимостью <= 7:
X: %
0: 0.1009563
1: 1.2886780
2: 6.7379449
3: 18.7165136
4: 29.8452515
5: 27.3319671
6: 13.3155737
7: 2.6631147

Таблица для игрока #1



Если 6 карт
E(X) = 0.002850532*0 + 0.030297083*1 + 0.128341808*2 + 0.277495801*3 + 0.323136557*4 + 0.192224824*5 + 0.045653396*6 = 3.647059 -> 3 карты
Ожидаемое число карт со стоимостью <= 7: 3 карты

Если 7 карт
E(X) = 4.254902 -> 4 карты
Ожидаемое число карт со стоимостью <= 7: 4 карты

Таблица для игрока #2

Тут всё зависит от того какие карты попались игроку #1 (а именно сколько каких).
Формула тоже немного меняется, т.к. количество доступных карт уменьшается.
Формула есть в коде в конце этой блогостатьи.

Для увеличения размера картинки кликните по ней. Она откроется в новом табе в более высоком качестве.
Альтернативная ссылка (плохое качество)

Таблица читается так:
• Первая строчка: Сколько карт у первого игрока, со стоимостью <= 7. Если у первого игрока 6 карт, то последняя колонка отпадает (перед трёмя "mean")
• Вторая строчка: Сколько карт у вас 6 или 7. "D" значит difference (разница). Эта строчка вспомогательная и является "шапкой" для строчек с данными ниже
• Предпослендяя колонка (не "D", а "7") перед трёмя колонками "mean" также значит, что у обеих игроков по 7 карт.

Количество карт (стоимость <= 7) у обеих игроков

Вывод

Если иметь 7-ую карту (золотая колода), то вероятность иметь как минимум 5 карт со стоимостью <= 7 (которыми мы сможем сыграть прямо в первом ходу), увеличивается практически в двое.

Если у вас все карты со стоимостью >7 и вы ничем не можете играть в первом своём ходу, то поздравляю! - вы невероятно везучий и выиграли в рулетке! ;)

Вердикт: Такой механизм раздачи карт маловероятен.



Вариант раздачи карт #2


Теперь представим себе, что карты раздаются поочерёдно.
При этом каждый раз из колоды рандомно выбираем карту и снова мешаем колоду.
Примерно также как при первом варианте, только теперь поочерёдно.

игрок 1 -> получает карту 1
игрок 2 -> получает карту 1
игрок 1 -> получает карту 2
игрок 2 -> получает карту 2
игрок 1 -> получает карту 3
игрок 2 -> получает карту 3
...
игрок 1 -> получает карту 6
игрок 2 -> получает карту 6
игрок 2 -> получает карту 7

У каждого игрока по 7 карт



Здесь слишком замороченные рассчёты. Нет желания считать  
Не думаю что на сервере такое используют.

Вердикт: Такой механизм раздачи карт маловероятен.



Вариант раздачи карт #3


Самый реалистичный вариант. Спасибо ред-анту за идею. :)

Мешаем колоду. Получаем массив с рандомными числами (0...102)
Пример: 4,5,42,101,0,99,21,17,59,41,33,4,87,...
Напрямую через индекс выбираем карты первому игроку
Потом даём карты второму.

Вероятность у первого и второго игрока одинаковая.
Т.е. механизм раздачи никак не влияет - нет различия кто ходит первым или вторым.

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

$cards = range(0, 101);
shuffle($cards);
$cards_player_1 = array_slice($cards, 0, 6);
$cards_player_2 = array_slice($cards, 6, 6);




Идеи и примечания


• О том как можно навредить противнику, который начинает игру вторым и усложнить его старт (early game), можно обговорить в другой раз. Если вредить второму игроку (украсть у него ресурсы), то количество возможных карт, которыми он сможет в этом ходу сыграть, может резко упасть.



Детально начальные условия и условия для победы можно посмотреть здесь:
http://www.heroeswm.ru/help.php?section=39#cards

Все карты из таверны
http://help.ordenmira.ru/arcomage/cards.htm (карты на русском)



Вариант раздачи карт #1

code




# for first player
f <- function(x,y){choose(62,x)*choose(40,y-x)/choose(102,y)*100}

# for second player
a <- function(x){
    d<-c()
    for(i in 1:length(x)){
        d<-c(d, sum(x[i:length(x)]))
    }
    return(d)
}

p <- function(x){
    gsub("\\.", ",", paste(x, "%", sep=""))
}

f2 <- function(x1,c1,x2,c2){
    choose((62-x1),x2)*choose((40-c1+x1),(c2-x2))/choose((102-c1),c2)*100
}

d<-c()

for(i in 0:7){
    d<-cbind(d, p(a(f2(i,7,1:6,6))))
}

Возможность комментировать доступна после регистрации