package main import ( "fmt" "math/rand" "os" "strconv" "strings" "time" ) var r *rand.Rand func main() { parm := "1d20" if len(os.Args) > 0 { if len(os.Args) == 2 { parm = os.Args[1] } else if len(os.Args) == 3 { parm = os.Args[1] + "d" + os.Args[2] } } if strings.HasPrefix(parm, "d") { parm = "1" + parm } r = rand.New(rand.NewSource(time.Now().UnixNano())) num, sides, times := parseParm(parm) for i := times; i > 0; i-- { if times > 1 { fmt.Printf("%d: ", times-i+1) } fmt.Println(roll(num, sides)) } } func parseParm(p string) (int, int, int) { var pts []string if strings.Contains(p, "d") { pts = strings.Split(p, "d") } var num, sides int if len(pts) > 0 { num = atoi(pts[0]) } times := 1 if len(pts) > 1 { if strings.Contains(pts[1], "x") { thesepts := strings.Split(pts[1], "x") if len(thesepts) > 1 { sides = atoi(thesepts[0]) times = atoi(thesepts[1]) } } else { sides = atoi(pts[1]) } } return num, sides, times } func roll(num, sides int) int { ret := 0 for ; num > 0; num-- { ret += r.Intn(sides) + 1 } return ret } func atoi(a string) int { ret, err := strconv.Atoi(a) if err != nil { fmt.Println("Error parsing value:", a) os.Exit(1) } return ret }