Recommend
2 
 Thumb up
 Hide
4 Posts

Zombies!!!» Forums » Strategy

Subject: When to play bullets rss

Your Tags: Add tags
Popular Tags: [View All]
Nils Fagerburg
Belgium
flag msg tools
Avatar
mbmbmbmbmb
There are several different strategies for playing bullets in this game:
1 Always play bullets if you need to and can. (alwaysStrat)
2 Wait until you only have one life left to play bullets. (keepForEndStrat)
3 Only play one bullet at a time (i.e. on a 3). (onlyOneStrat)
4 Only play one bullet at a time until you only have one life then play as many as you can/need. (saneOnlyOneStrat)

It seems obvious that 2 and 3 are bad strategies, but to find out whether 1 or 2 was the best (and whether there is a difference between the two) I wrote a quick Python script to crunch the numbers.

It simulates fighting an infinite number of zombies, starting with 3 lives and 3 bullets and counts how many turns the player survives when playing one of the strategies. This is repeated 1 million times for each strategy and the average survival length is calculated. This simplified model doesn't take into account finding new bullets or using cards.

It turns out that you will live about a third of a turn longer if you only use bullets when you roll a 3 or when you only have 1 heart left.

Results (average turns to death):
onlyOneStrat 8.642001
saneOnlyOneStrat 9.630278
alwaysStrat 9.314041
keepForEndStrat 8.744654


Here's the code if anyone wants to try out other strategies.
Code:
from __future__ import division
from random import randint


def d6():
return randint(1, 6)


def alwaysStrat(roll, life, bullets):
if roll < 4 and roll + bullets >= 4:
return 4 - roll
return 0


def onlyOneStrat(roll, life, bullets):
if roll == 3 and bullets > 0:
return 1
return 0


def keepForEndStrat(roll, life, bullets):
if life == 1:
return alwaysStrat(roll, life, bullets)
return 0


def saneOnlyOneStrat(roll, life, bullets):
if life == 1:
return alwaysStrat(roll, life, bullets)
return onlyOneStrat(roll, life, bullets)


def play(bulletUseStrat):
life, bullets, turns = 3, 3, 0
while life > 0:
turns += 1
roll = d6()
bu = bulletUseStrat(roll, life, bullets)
bullets -= bu
if roll + bu < 4:
life -= 1
return turns

times = 1000000
for name, strat in [(k, v) for k, v in locals().items() if "Strat" in k]:
print "%s %f" % (name, sum(play(strat) for i in xrange(times)) / times)
5 
 Thumb up
1.00
 tip
 Hide
  • [+] Dice rolls
Mark McG
Australia
Penshurst
NSW
flag msg tools
Avatar
mbmbmbmbmb
nice to see the statistical results support my hunch.
 
 Thumb up
 tip
 Hide
  • [+] Dice rolls
Kevin Riddle

Oklahoma
msg tools
mbmbmbmbmb
interesting
 
 Thumb up
 tip
 Hide
  • [+] Dice rolls
Danny Stevens
Australia
Brisbane
Queensland
flag msg tools
Games: Design 'em, rewrite 'em, play 'em!
Avatar
mbmbmbmbmb
A common rule variant is to base movement on the number of heart tokens you have plus a constant or a dice roll. Under those circumstances protecting your life tokens becomes a higher priority than conserving bullets.
 
 Thumb up
 tip
 Hide
  • [+] Dice rolls
Front Page | Welcome | Contact | Privacy Policy | Terms of Service | Advertise | Support BGG | Feeds RSS
Geekdo, BoardGameGeek, the Geekdo logo, and the BoardGameGeek logo are trademarks of BoardGameGeek, LLC.