# SyntaxBomb - Indie Coders

## Languages & Coding => Blitz Code Archives => Algorithms => Topic started by: BlitzBot on June 29, 2017, 12:28:43 AM

Title: [bb] CalculateDice by * [ 1+ years ago ]
Post by: BlitzBot on June 29, 2017, 12:28:43 AM
Title : CalculateDice
Author : *
Posted : 1+ years ago

Description : This function will generate a value for you from a dice string you give it for example "2D6+10" would return between 12 and 22.

Code :
Code: BlitzBasic
1. ;Attack dice system
2. SeedRnd MilliSecs()
3. Global AttackDice\$ = "4D10*2D3";"50+D6+D20+D100-D20+1000"       ;minimum is -17 (1+1+1-1), Maximum is 125 (6+20+100-20)
4.
5. Global cy=0
6. Global Min=1000
7. Global Max=0
8.
9. For a=0 To 65535
10.         C= CalculateDice( AttackDice\$ )
11.         If C<Min Then Min=C
12.         If C>Max Then Max=C
13. Next
14.
15. Repeat
16.         cy=0
17.         Cls
18.         Text 10, cy, CalculateDice( AttackDice\$ )
19.         Text 50, cy, "Min:"+Min
20.         Text 150, cy, "Max:"+Max
21.         WaitKey
22. Until KeyDown( 1 )=1
23. End
24.
25. Function CalculateDice( DiceString\$ )
26.         Local Modifier\$ = "+"
27.         Local Dice\$ = ""
28.         Local DiceModValue=1                                            ;example 2D6 this var would be 2
29.         Local DiceValue=0                                                       ;example 2D6 this var would be rand( 1, 6 )
30.         Local IsDice=False                                                      ;true if this is a dice calculation
31.         Local Char\$=""
32.         Local Value=0
33.         Local TempValue=0
34.
35.         If Len( DiceString\$ )<1 Then Return                     ;empty strings just exit the function
36.
37.         For DicePos=1 To Len( DiceString\$ )
38.                 Char\$ = Upper\$( Mid\$( DiceString\$, DicePos, 1 ) )
39.                 Dice\$ = Dice\$ + Char\$
40.                 If Char\$="+" Or Char\$ = "-" Or Char\$="*" Or Char\$="/" Or DicePos=Len( DiceString\$ )
41.                         DiceModValue=1
42.                         ;we hit a calculation
43.                         DPos = Instr( Dice\$, "D" )
44.                         If DPos=0
45.                                 ;its just a standard value
46.                                 TempValue = Dice\$
47.
48.                                 Select Modifier\$
49.                                 Case "+":       Value = Value +TempValue
50.                                 Case "-":       Value = Value -TempValue
51.                                 Case "*":       Value = Value *TempValue
52.                                 Case "/":       Value = Value /TempValue
53.                                 End Select
54.                         Else
55.                                 ;its a dice calculation
56.                                 IsDice=True
57.                                 If DPos>1 Then DiceModValue = Left\$( Dice\$, DPos-1 )
58.                                 DiceValue = Right\$( Dice\$, Len( Dice\$ )-DPos )
59.
60.                                 ;add the dice so 50D80 would run for 50 cycles
61.                                 For DK=1 To DiceModValue
62.                                         ;use a temporary value as multiplication would multiply the whole value
63.                                         ;rather than just was it needed to be multiplied by
64.                                         TempValue = TempValue + Rand( 1, DiceValue )
65.                                 Next
66.
67.                                 Select Modifier\$
68.                                 Case "+":       Value = Value +TempValue
69.                                 Case "-":       Value = Value -TempValue
70.                                 Case "*":       Value = Value *TempValue
71.                                 Case "/":       Value = Value /TempValue
72.                                 End Select
73.                         EndIf
74.
75.                         Dice\$=""
76.                         TempValue=0
77.                         ;adjust modifier here as it has to affect the next calculation
78.                         If DicePos<Len( DiceString\$ ) Then Modifier\$ = Char\$
79.                 EndIf
80.         Next
81.
82.         Return Value
83. End Function