1
- namespace MattEland.FSharpGeneticAlgorithm.Logic
1
+ module MattEland.FSharpGeneticAlgorithm.Logic.World
2
2
3
3
open System
4
4
open MattEland.FSharpGeneticAlgorithm .Logic .Actors
5
5
open MattEland.FSharpGeneticAlgorithm .Logic .WorldPos
6
6
7
- module World =
7
+ let getRandomPos ( maxX : int32 , maxY : int32 , getRandom ): WorldPos =
8
+ let x = getRandom maxX
9
+ let y = getRandom maxY
10
+ newPos x y
8
11
9
- let getRandomPos ( maxX : int32 , maxY : int32 , random : Random ): WorldPos =
10
- let x = random.Next( maxX) + 1
11
- let y = random.Next( maxY) + 1
12
- newPos x y
12
+ let buildItemsArray ( maxX : int32 , maxY : int32 , getRandom ): Actor array =
13
+ [| { Pos = getRandomPos( maxX, maxY, getRandom); ActorKind = Squirrel false }
14
+ { Pos = getRandomPos( maxX, maxY, getRandom); ActorKind = Tree }
15
+ { Pos = getRandomPos( maxX, maxY, getRandom); ActorKind = Doggo }
16
+ { Pos = getRandomPos( maxX, maxY, getRandom); ActorKind = Acorn }
17
+ { Pos = getRandomPos( maxX, maxY, getRandom); ActorKind = Rabbit }
18
+ |]
19
+ let hasInvalidlyPlacedItems ( items : Actor array , maxX : int32 , maxY : int32 ): bool =
20
+ let mutable hasIssues = false
13
21
14
- let buildItemsArray ( maxX : int32 , maxY : int32 , random : Random ): Actor array =
15
- [|
16
- createSquirrel ( getRandomPos( maxX, maxY, random))
17
- createTree ( getRandomPos( maxX, maxY, random))
18
- createDoggo ( getRandomPos( maxX, maxY, random))
19
- createAcorn ( getRandomPos( maxX, maxY, random))
20
- createRabbit ( getRandomPos( maxX, maxY, random))
21
- |]
22
+ for itemA in items do
23
+ // Don't allow items to spawn in corners
24
+ if ( itemA.Pos.X = 1 || itemA.Pos.X = maxX) && ( itemA.Pos.Y = 1 || itemA.Pos.Y = maxY) then
25
+ hasIssues <- true
22
26
23
- let hasInvalidlyPlacedItems ( items : Actor array , maxX : int32 , maxY : int32 ): bool =
24
- let mutable hasIssues = false
27
+ for itemB in items do
28
+ if itemA <> itemB then
25
29
26
- for itemA in items do
27
- // Don't allow items to spawn in corners
28
- if ( itemA.Pos.X = 1 || itemA.Pos.X = maxX) && ( itemA.Pos.Y = 1 || itemA.Pos.Y = maxY) then
29
- hasIssues <- true
30
+ // Don't allow two objects to start next to each other
31
+ if isAdjacentTo itemA.Pos itemB.Pos then
32
+ hasIssues <- true
33
+
34
+ hasIssues
30
35
31
- for itemB in items do
32
- if itemA <> itemB then
36
+ let generate ( maxX : int32 , maxY : int32 , getRandom ): Actor array =
37
+ let mutable items : Actor array = buildItemsArray ( maxX , maxY , getRandom )
33
38
34
- // Don't allow two objects to start next to each other
35
- if isAdjacentTo itemA.Pos itemB.Pos then
36
- hasIssues <- true
37
-
38
- hasIssues
39
+ // It's possible to generate items in invalid starting configurations. Make sure we don't do that.
40
+ while hasInvalidlyPlacedItems( items, maxX, maxY) do
41
+ items <- buildItemsArray( maxX, maxY, getRandom)
39
42
40
- let generate ( maxX : int32 , maxY : int32 , random : Random ): Actor array =
41
- let mutable items : Actor array = buildItemsArray( maxX, maxY, random)
43
+ items
42
44
43
- // It's possible to generate items in invalid starting configurations. Make sure we don't do that.
44
- while hasInvalidlyPlacedItems( items, maxX, maxY) do
45
- items <- buildItemsArray( maxX, maxY, random)
45
+ type World =
46
+ { MaxX : int
47
+ MaxY : int
48
+ Squirrel : Actor
49
+ Tree : Actor
50
+ Doggo : Actor
51
+ Acorn : Actor
52
+ Rabbit : Actor }
53
+ member this.Actors = [| this.Squirrel; this.Tree; this.Doggo; this.Acorn; this.Rabbit |]
54
+ let makeWorld maxX maxY random =
55
+ let actors = generate( maxX, maxY, random)
56
+ { MaxX = maxX
57
+ MaxY = maxY
58
+ Squirrel = actors.[ 0 ]
59
+ Tree = actors.[ 1 ]
60
+ Doggo = actors.[ 2 ]
61
+ Acorn = actors.[ 3 ]
62
+ Rabbit = actors.[ 4 ] }
46
63
47
- items
64
+ let getCharacterAtCell ( x , y ) ( world : World ) =
65
+ let actorAtCell =
66
+ world.Actors
67
+ |> Seq.tryFind( fun actor -> actor.Pos.X = x && actor.Pos.Y = y)
48
68
49
- type World ( maxX : int32 , maxY : int32 , random : Random ) =
50
- let actors = generate( maxX, maxY, random)
51
- member this.Actors = actors
52
- member this.MaxX = maxX
53
- member this.MaxY = maxY
54
-
55
- member this.Squirrel = actors.[ 0 ]
56
- member this.Tree = actors.[ 1 ]
57
- member this.Doggo = actors.[ 2 ]
58
- member this.Acorn = actors.[ 3 ]
59
- member this.Rabbit = actors.[ 4 ]
60
-
61
- member this.GetCharacterAtCell ( x , y ) =
62
- let mutable char = '.'
63
- for actor in this.Actors do
64
- if actor.Pos.X = x && actor.Pos.Y = y then
65
- char <- actor.Character
66
- char
69
+ match actorAtCell with
70
+ | Some actor -> getChar actor
71
+ | None -> '.'
0 commit comments