But if I do it this way, it's gonna return both the player's move and the 
AI's move at the same time. What I want to have is that the game displays 
the player's move THEN call minimax function on current model and THEN 
display the AI's move

Vào 06:41:14 UTC+7 Thứ Tư, ngày 12 tháng 10 năm 2016, Luke Westby đã viết:
>
> It's a common misunderstanding that every discrete change to a model must 
> originate from a different message. In general messages are for expressing 
> what is allowed to happen in your application as a result of outside 
> behavior like user input and server responses, whereas you want to run your 
> AI as a direct, immediate result of your user making a move. What you 
> should do instead is write two functions, toggleAtIndex : Int -> Model -> 
> Model which handles the model changes under Toggle indexToToggle, and runAi 
> : Model -> Model, which handles the call to miniMax. Then in your single 
> Toggle message branch, call them both in the right order:
>
>
> toggleAtIndex indexToToggle model =
>   { model | board = move indexToToggle model.turn model.board }
>
> runAi model =
>   fst (miniMax model 0)
>
> update msg model =
>   case msg of
>     Toggle indexToToggle ->
>       ( model
>           |> toggleAtIndex indexToToggle
>           |> runAi
>       , Cmd.none
>       )
>
>
> On Monday, October 10, 2016 at 2:23:51 AM UTC-5, hoang...@gmail.com wrote:
>>
>> I wrote an TicTacToe AI game. I published it here. 
>> https://tronyeu0802.github.io/TicTacToe-elm/
>>
>> Currently, when you make a move, the game will calculate an AI move then 
>> the browser will display both your move and the AI move at the same time. I 
>> did this by create and perform a task that always succeeds with the AIMove 
>>   message. 
>>
>> update msg model =
>>
>>     case msg of
>>
>>         Toggle indexToToggle ->
>>
>>                 ( { model
>>
>>                     | board = move indexToToggle model.turn model.board
>>
>>                   }
>>
>>                 , Task.perform (\_ -> Debug.crash "This failure cannot 
>> happen.") identity (Task.succeed AIMove)
>>
>>                   --Cmd.Extra.message AIMove
>>
>>                 )
>>
>>
>>         AIMove ->
>>
>>             ( fst (miniMax model 0)
>>
>>             , Cmd.none
>>
>>             )
>>
>>
>>  How can I display the player's move, then the AI's move after that?
>>
>> I'm thinking that this could be done by subscribing to the number of 
>> available moves left. If this is even then do an AI move else do nothing.
>>
>> I'm very new to ELM , I hope you teach better ways to achieve this. :D 
>> Thank you
>>
>>

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to