|
|
|
|
|
|
|
|
|
|
|
package main |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
"fmt" |
|
|
|
|
|
"math/rand" |
|
|
|
|
|
"sort" |
|
|
|
|
|
"time" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
type Class struct { |
|
|
|
|
|
Name string |
|
|
|
|
|
HitDie int |
|
|
|
|
|
StatPriority []string |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type Player struct { |
|
|
|
|
|
Name string |
|
|
|
|
|
Class Class |
|
|
|
|
|
Stats map[string]int |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func roll(x, y int) []int { |
|
|
|
|
|
rolls := make([]int, x) |
|
|
|
|
|
for i := 0; i < x; i++ { |
|
|
|
|
|
rolls[i] = (rand.Intn(y) + 1) |
|
|
|
|
|
} |
|
|
|
|
|
return rolls |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func sum(ary []int) int { |
|
|
|
|
|
s := 0 |
|
|
|
|
|
for _, v := range ary { |
|
|
|
|
|
s += v |
|
|
|
|
|
} |
|
|
|
|
|
return s |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func stats() []int { |
|
|
|
|
|
rolls := make([]int, 6) |
|
|
|
|
|
for i := 0; i < 6; i++ { |
|
|
|
|
|
thisRoll := roll(4, 6) |
|
|
|
|
|
for k, v := range thisRoll { |
|
|
|
|
|
// fmt.Println(thisRoll) |
|
|
|
|
|
for v == 1 { |
|
|
|
|
|
// fmt.Println("Replacing 1") |
|
|
|
|
|
newv := roll(1, 6) |
|
|
|
|
|
thisRoll[k] = newv[0] |
|
|
|
|
|
v = newv[0] |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
sort.Ints(thisRoll) |
|
|
|
|
|
top3 := make([]int, 3) |
|
|
|
|
|
copy(top3, thisRoll[1:]) |
|
|
|
|
|
rolls[i] = sum(top3) |
|
|
|
|
|
} |
|
|
|
|
|
return rolls |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func main() { |
|
|
|
|
|
barb := Class{"Barbarian", 12, []string{"Int", "Wis", "Cha", "Dex", "Con", "Str"}} |
|
|
|
|
|
rand.Seed(time.Now().UnixNano()) |
|
|
|
|
|
fmt.Println("=== Generated D&D character ===") |
|
|
|
|
|
rolls := stats() |
|
|
|
|
|
fmt.Println("Rolls: ", rolls) |
|
|
|
|
|
sort.Ints(rolls) |
|
|
|
|
|
ply := Player{"Bob", barb, make(map[string]int)} |
|
|
|
|
|
for k, v := range barb.StatPriority { |
|
|
|
|
|
ply.Stats[v] = rolls[k] |
|
|
|
|
|
} |
|
|
|
|
|
fmt.Println(ply) |
|
|
|
|
|
} |