@@ -3,6 +3,8 @@ module Update exposing (update)
3
3
import Msg exposing (Msg (..) )
4
4
import Model exposing (..)
5
5
import Material
6
+ import Extras
7
+ import Random.Pcg as Random exposing (Seed )
6
8
7
9
8
10
update : Msg -> Model -> ( Model , Cmd Msg )
@@ -22,7 +24,7 @@ update msg model =
22
24
, selected = Nothing
23
25
}
24
26
in
25
- if checkForAnyLines newModel then
27
+ if checkForAnyLines newModel. board then
26
28
( { newModel | turnState = Win }, Cmd . none )
27
29
else
28
30
( newModel, Cmd . none )
@@ -39,26 +41,63 @@ update msg model =
39
41
40
42
cpuTurn : Model -> Model
41
43
cpuTurn model =
44
+ case model. selected of
45
+ Just piece ->
46
+ case makeCpuMove piece model. board of
47
+ Just newBoard ->
48
+ let
49
+ newModel =
50
+ { model | board = newBoard }
51
+ in
52
+ if checkForAnyLines newModel. board then
53
+ { newModel | turnState = Loss }
54
+ else
55
+ newModel
56
+
57
+ Nothing ->
58
+ model
59
+
60
+ Nothing ->
61
+ model
62
+
63
+
64
+ makeCpuMove piece board =
42
65
let
43
- newModel =
44
- makeCpuMove model
66
+ moves =
67
+ getMoves piece board
45
68
in
46
- if checkForAnyLines newModel then
47
- { newModel | turnState = Loss }
48
- else
49
- newModel
69
+ Extras . find ( cpuWinningMove board) moves
70
+ |> Extras . orElseLazy ( \ () -> Extras . find ( nonLosingMove board) moves)
71
+ |> Extras . orElseLazy ( \ () -> Random . step ( Random . sample moves) ( Random . initialSeed 42 ) |> fst)
72
+ |> Maybe . map ( applyMove board)
73
+
74
+
75
+ applyMove : Board -> ( FloorId , SpaceId , Piece ) -> Board
76
+ applyMove board ( floorId, spaceId, Piece shape colour pattern ) =
77
+ board
78
+
79
+
80
+ getMoves : Piece -> Board -> List ( FloorId , SpaceId , Piece )
81
+ getMoves piece board =
82
+ []
83
+
84
+
85
+ cpuWinningMove : Board -> ( FloorId , SpaceId , Piece ) -> Bool
86
+ cpuWinningMove board ( floorId, spaceId, piece ) =
87
+ False
50
88
51
89
52
- makeCpuMove model =
53
- model
90
+ nonLosingMove : Board -> ( FloorId , SpaceId , Piece ) -> Bool
91
+ nonLosingMove board ( floorId, spaceId, piece ) =
92
+ False
54
93
55
94
56
- checkForAnyLines : Model -> Bool
57
- checkForAnyLines model =
58
- checkMultiFloorLines model . board
59
- |> andCheckFloor Top model . board
60
- |> andCheckFloor Middle model . board
61
- |> andCheckFloor Bottom model . board
95
+ checkForAnyLines : Board -> Bool
96
+ checkForAnyLines board =
97
+ checkMultiFloorLines board
98
+ |> andCheckFloor Top board
99
+ |> andCheckFloor Middle board
100
+ |> andCheckFloor Bottom board
62
101
63
102
64
103
checkMultiFloorLines : Board -> Bool
0 commit comments