diceroller.py: Refactored Dice object into its own library under lib/
This commit is contained in:
parent
9f740180a8
commit
796a26c3b3
3 changed files with 87 additions and 80 deletions
78
diceroller.py
Executable file
78
diceroller.py
Executable file
|
@ -0,0 +1,78 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# Command-line dice roller
|
||||
|
||||
import sys
|
||||
sys.path.append('lib/')
|
||||
|
||||
from dice import Dice
|
||||
import random
|
||||
import argparse
|
||||
|
||||
|
||||
# This takes command-line input as dice description strings
|
||||
# and builds a list of Dice objects
|
||||
def parse_input(args):
|
||||
dice_list = []
|
||||
for arg in args:
|
||||
dice_list.append(Dice.from_str(arg))
|
||||
|
||||
return dice_list
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description='Roll dice based on descriptions passed in on the command line', formatter_class=argparse.RawTextHelpFormatter)
|
||||
parser.add_argument('--repeat', '-r', metavar='N', type=int, default=1, help='repeat the given rolls N times')
|
||||
parser.add_argument('--verbose', '-v', action='store_true', help='print detailed information about each roll')
|
||||
parser.add_argument('dice', nargs=argparse.REMAINDER, help="""
|
||||
Dice are input in the following form:
|
||||
|
||||
XdY[modifiers]
|
||||
|
||||
This will roll X Y-sided dice and apply the specified modifiers.
|
||||
|
||||
Modifiers can be any of the following (where N and M are integers):
|
||||
|
||||
(+|-)N Add or subtract N from the total
|
||||
lN Drop the lowest-rolling N dice from the total
|
||||
hN Drop the highest-rolling N dice from the total
|
||||
rN[xM] Any dice that roll <= N will be rerolled.
|
||||
If the optional 'xM' option is specified, dice will be rerolled a maximum of M times.
|
||||
Otherwise each die will be rerolled until the result is > N
|
||||
|
||||
Examples:
|
||||
|
||||
1d20+5 roll 1 twenty-sided die, and add 5 to the result
|
||||
6d6l1h1 roll 6 six-sided dice, and drop both the highest and the lowest roll
|
||||
4d6l1r2x1 roll 4 six-sided dice. Any dice rolling a 1 or 2 will be rerolled once.
|
||||
If the result is still 1 or 2 it is kept. The lowest die is dropped from the result
|
||||
""")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
settings = parse_args()
|
||||
dice_list = parse_input(settings.dice)
|
||||
|
||||
for i in range(settings.repeat):
|
||||
for dice in dice_list:
|
||||
ret = dice.roll()
|
||||
|
||||
if settings.verbose:
|
||||
drop_info = ''
|
||||
reroll_info = ''
|
||||
|
||||
if ret['dropped']:
|
||||
drop_info = ' [dropped {}]'.format(','.join(['{}'.format(x) for x in ret['dropped']]))
|
||||
if ret['rerolled']:
|
||||
reroll_info = ' [rerolled {}]'.format(','.join(['{}'.format(x) for x in ret['rerolled']]))
|
||||
|
||||
print('{dice}: {rolls}{drop}{reroll} {total}'.format(dice=dice, rolls=ret['rolls'], total=ret['total'], drop=drop_info, reroll=reroll_info))
|
||||
|
||||
else:
|
||||
print('{dice}: {total}'.format(dice=dice, total=ret['total']))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue