use float64
This commit is contained in:
@@ -22,7 +22,7 @@ func Generate(cfg ...func(*MapSetting)) (Map, error) {
|
||||
freePlanets := ms.NobodysPlanets()
|
||||
|
||||
createPlanets := func(ps PlanetSetting) error {
|
||||
return m.CreatePlanets(ps.Count(freePlanets), float32(ps.MinDistanceHW), RandIFn(ps.MinSize, ps.MaxSize), RandIFn(ps.MinResource, ps.MaxResource))
|
||||
return m.CreatePlanets(ps.Count(freePlanets), float64(ps.MinDistanceHW), RandIFn(ps.MinSize, ps.MaxSize), RandIFn(ps.MinResource, ps.MaxResource))
|
||||
}
|
||||
|
||||
// 1. Place Giant planets
|
||||
@@ -37,18 +37,18 @@ func Generate(cfg ...func(*MapSetting)) (Map, error) {
|
||||
|
||||
// 3. Place players' Home Worlds
|
||||
for player := 0; player < int(ms.Players); player++ {
|
||||
coord, err := m.NewCoordinate(float32(ms.HWMinDistance))
|
||||
coord, err := m.NewCoordinate(float64(ms.HWMinDistance))
|
||||
if err != nil {
|
||||
return Map{}, fmt.Errorf("%s: hw new_coordinate: %s", ms, err)
|
||||
}
|
||||
planet := NewPlanet(coord, float32(ms.HWSize), float32(ms.HWResources))
|
||||
planet := NewPlanet(coord, float64(ms.HWSize), float64(ms.HWResources))
|
||||
m.HomePlanets[player] = PlanetarySystem{HW: planet, DW: make([]Planet, ms.DWCount)}
|
||||
for dw := 0; dw < int(ms.DWCount); dw++ {
|
||||
p := rand.Float64()*(float64(ms.DWMaxDistance)-float64(ms.DWMinDistance)) + float64(ms.DWMinDistance)
|
||||
phi := rand.Float64() * 360
|
||||
x := float32(p * math.Cos(phi))
|
||||
y := float32(p * math.Sin(phi))
|
||||
dwPlanet := NewPlanet(Coordinate{x, y}, float32(ms.DWSize), float32(ms.DWResources))
|
||||
x := p * math.Cos(phi)
|
||||
y := p * math.Sin(phi)
|
||||
dwPlanet := NewPlanet(Coordinate{x, y}, float64(ms.DWSize), float64(ms.DWResources))
|
||||
m.HomePlanets[player].DW[dw] = dwPlanet
|
||||
}
|
||||
}
|
||||
|
||||
+11
-11
@@ -16,13 +16,13 @@ type Map struct {
|
||||
}
|
||||
|
||||
type Coordinate struct {
|
||||
X, Y float32
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
type Planet struct {
|
||||
Position Coordinate
|
||||
Size float32
|
||||
Resources float32 // Сырьё
|
||||
Size float64
|
||||
Resources float64 // Сырьё
|
||||
}
|
||||
|
||||
type PlanetarySystem struct {
|
||||
@@ -43,7 +43,7 @@ func NewMap(width, height, players uint32) (*Map, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (m *Map) CreatePlanets(num int, deadZoneRadius float32, size, resources func() float32) error {
|
||||
func (m *Map) CreatePlanets(num int, deadZoneRadius float64, size, resources func() float64) error {
|
||||
for range num {
|
||||
coord, err := m.NewCoordinate(deadZoneRadius)
|
||||
if err != nil {
|
||||
@@ -59,7 +59,7 @@ func (m *Map) AddPlanet(planet Planet) {
|
||||
m.FreePlanets = append(m.FreePlanets, planet)
|
||||
}
|
||||
|
||||
func (m Map) NewCoordinate(deadZoneRaduis float32) (Coordinate, error) {
|
||||
func (m Map) NewCoordinate(deadZoneRaduis float64) (Coordinate, error) {
|
||||
if x, y, err := m.plotter.RandomFreePoint(deadZoneRaduis); err != nil {
|
||||
return Coordinate{}, fmt.Errorf("NewCoordinate: RandomFreePoint: %s", err)
|
||||
} else {
|
||||
@@ -67,7 +67,7 @@ func (m Map) NewCoordinate(deadZoneRaduis float32) (Coordinate, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func NewPlanet(c Coordinate, size, resources float32) Planet {
|
||||
func NewPlanet(c Coordinate, size, resources float64) Planet {
|
||||
return Planet{
|
||||
Position: c,
|
||||
Size: size,
|
||||
@@ -75,14 +75,14 @@ func NewPlanet(c Coordinate, size, resources float32) Planet {
|
||||
}
|
||||
}
|
||||
|
||||
// RandI returns a random float32 value between min and max
|
||||
func RandI(min, max float32) float32 {
|
||||
return min + rand.Float32()*(max-min)
|
||||
// RandI returns a random float64 value between min and max
|
||||
func RandI(min, max float64) float64 {
|
||||
return min + rand.Float64()*(max-min)
|
||||
}
|
||||
|
||||
// RandIFn is a wrapper for the [RandI] func
|
||||
func RandIFn(min, max float32) func() float32 {
|
||||
return func() float32 {
|
||||
func RandIFn(min, max float64) func() float64 {
|
||||
return func() float64 {
|
||||
return RandI(min, max)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,35 +10,35 @@ import (
|
||||
)
|
||||
|
||||
type Plotter struct {
|
||||
factor float32
|
||||
factor float64
|
||||
clearFn func()
|
||||
circleFn func(x, y int, r float32)
|
||||
circleFn func(x, y int, r float64)
|
||||
freeCountFn func() int
|
||||
freeNumberToCoordFn func(int) (int, int, error)
|
||||
}
|
||||
|
||||
func NewPlotter(width, height uint32, factor float32) (Plotter, error) {
|
||||
func NewPlotter(width, height uint32, factor float64) (Plotter, error) {
|
||||
return NewBitmapPlotter(NewBitmap(width, height, factor), factor)
|
||||
}
|
||||
|
||||
func NewBitmap(width, height uint32, factor float32) bitmap.Bitmap {
|
||||
func NewBitmap(width, height uint32, factor float64) bitmap.Bitmap {
|
||||
return bitmap.NewBitmap(AsPlotterSize(width, height, factor))
|
||||
}
|
||||
|
||||
func NewBitmapPlotter(bm bitmap.Bitmap, factor float32) (Plotter, error) {
|
||||
func NewBitmapPlotter(bm bitmap.Bitmap, factor float64) (Plotter, error) {
|
||||
if factor > 1 || factor <= 0 {
|
||||
return Plotter{}, fmt.Errorf("factor should be: 0 > F <= 1")
|
||||
}
|
||||
return Plotter{
|
||||
factor: factor,
|
||||
clearFn: bm.Clear,
|
||||
circleFn: func(x, y int, r float32) { bm.Circle(x, y, r, true) },
|
||||
circleFn: func(x, y int, r float64) { bm.Circle(x, y, r, true) },
|
||||
freeCountFn: bm.FreeCount,
|
||||
freeNumberToCoordFn: bm.GetFreeN,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (p Plotter) RandomFreePoint(deadZoneRaduis float32) (float32, float32, error) {
|
||||
func (p Plotter) RandomFreePoint(deadZoneRaduis float64) (float64, float64, error) {
|
||||
fsCount := p.freeCountFn()
|
||||
if fsCount == 0 {
|
||||
return 0, 0, errors.New("RandomFreePoint: no free space left")
|
||||
@@ -51,22 +51,22 @@ func (p Plotter) RandomFreePoint(deadZoneRaduis float32) (float32, float32, erro
|
||||
if deadZoneRaduis > 0 {
|
||||
p.plotDeadZone(x, y, deadZoneRaduis)
|
||||
}
|
||||
planetX := float32(x)*p.factor + rand.Float32()*p.factor
|
||||
planetY := float32(y)*p.factor + rand.Float32()*p.factor
|
||||
planetX := float64(x)*p.factor + rand.Float64()*p.factor
|
||||
planetY := float64(y)*p.factor + rand.Float64()*p.factor
|
||||
return planetX, planetY, nil
|
||||
}
|
||||
|
||||
func (p Plotter) MarkDeadZone(x, y float32, radius float32) {
|
||||
func (p Plotter) MarkDeadZone(x, y float64, radius float64) {
|
||||
p.plotDeadZone(int(x/p.factor), int(y/p.factor), radius)
|
||||
}
|
||||
|
||||
func (p Plotter) plotDeadZone(x, y int, radius float32) {
|
||||
func (p Plotter) plotDeadZone(x, y int, radius float64) {
|
||||
p.circleFn(x, y, radius/p.factor)
|
||||
}
|
||||
|
||||
func (p Plotter) Clear() { p.clearFn() }
|
||||
|
||||
func AsPlotterSize(width, height uint32, factor float32) (uint32, uint32) {
|
||||
func AsPlotterSize(width, height uint32, factor float64) (uint32, uint32) {
|
||||
if factor > 1 || factor <= 0 {
|
||||
return width, height
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ func TestNewPlotter(t *testing.T) {
|
||||
func TestAsPlotterSize(t *testing.T) {
|
||||
for _, tc := range []struct {
|
||||
w, h uint32
|
||||
f float32
|
||||
f float64
|
||||
ew, eh uint32
|
||||
}{
|
||||
{10, 10, 0, 10, 10},
|
||||
@@ -46,7 +46,7 @@ func TestAsPlotterSize(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRandomFreePoint(t *testing.T) {
|
||||
var factor float32 = 0.25
|
||||
var factor float64 = 0.25
|
||||
var w, h uint32 = 20, 20
|
||||
bm := plotter.NewBitmap(w, h, factor)
|
||||
p, err := plotter.NewBitmapPlotter(bm, factor) // 80x80
|
||||
@@ -58,7 +58,7 @@ func TestRandomFreePoint(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Errorf("expect: no error getting random point, got: %s", err)
|
||||
}
|
||||
if x > float32(w) || y > float32(w) {
|
||||
if x > float64(w) || y > float64(w) {
|
||||
t.Errorf("expect: point coordinates within map size %dx%d, got: x=%f y=%f", w, h, x, y)
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func TestRandomFreePoint(t *testing.T) {
|
||||
t.Errorf("expect: no error when radius is zero, got: %s", err)
|
||||
}
|
||||
|
||||
_, _, err = p.RandomFreePoint(float32(w + h)) // guaranteed to mark whole area dead zone
|
||||
_, _, err = p.RandomFreePoint(float64(w + h)) // guaranteed to mark whole area dead zone
|
||||
if err != nil {
|
||||
t.Errorf("expect: no error getting random point, got: %s", err)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"math"
|
||||
)
|
||||
|
||||
const defaultFactor float32 = 0.1
|
||||
const defaultFactor float64 = 0.1
|
||||
|
||||
type MapSetting struct {
|
||||
Players uint32
|
||||
@@ -20,7 +20,7 @@ type MapSetting struct {
|
||||
|
||||
GiantPlanets PlanetSetting
|
||||
BigPlanets PlanetSetting
|
||||
OthersMinDistance float32
|
||||
OthersMinDistance float64
|
||||
NormalPlanets PlanetSetting
|
||||
RichPlanets PlanetSetting
|
||||
Asterioids PlanetSetting
|
||||
@@ -44,11 +44,11 @@ func (ms MapSetting) NobodysPlanets() uint32 {
|
||||
|
||||
type PlanetSetting struct {
|
||||
MinDistanceHW uint32
|
||||
MinSize float32
|
||||
MaxSize float32
|
||||
MinResource float32
|
||||
MaxResource float32
|
||||
Probability float32
|
||||
MinSize float64
|
||||
MaxSize float64
|
||||
MinResource float64
|
||||
MaxResource float64
|
||||
Probability float64
|
||||
}
|
||||
|
||||
func (ps PlanetSetting) Count(freePlanets uint32) int {
|
||||
|
||||
Reference in New Issue
Block a user