I had the solution. Just show thinking when its AI's turn and the game is 
not over. :D



Vào 03:07:59 UTC+7 Thứ Ba, ngày 11 tháng 10 năm 2016, [email protected] đã 
viết:
>
> The AnimationFrame works perfectly. Thank you :D 
> I have another question came in mind. How do you think can we make the 
> view display, for example "Thinking", while the minimax algorithm is being 
> executed?
>
> Thank you a lot for your help. :D
>
> Vào 00:11:59 UTC+7 Thứ Ba, ngày 11 tháng 10 năm 2016, OvermindDL1 đã viết:
>>
>> Most callbacks in a browser, such as the timeout used for Time, is 
>> throttled to 4ms and behaves strangely below 16ms, if you want to execute 
>> as fast as possible then you should use an AnimationFrame subscription. 
>>  Time subscriptions should only be used for 500ms or larger or so, any less 
>> and it starts to act odd.
>>
>> You should probably still do a test to make sure it is the ai turn in 
>> your update for `AIMove` though, the browser can cache and send events 
>> 'later' than you expect as well.
>>
>> On Monday, October 10, 2016 at 11:06:07 AM UTC-6, [email protected] 
>> wrote:
>>>
>>> I just found a problem with using subscription though. I tried replace 
>>> second with millisecond, while the minimax was executing (about less than a 
>>> second)  the program keep calling more AIMove.
>>>
>>>
>>> subscriptions model =
>>>   if (gameIsNotFinished model && model.turn == AIToMove) then
>>>     Time.every millisecond AIMove
>>>
>>>
>>> Vào 23:54:21 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, OvermindDL1 đã 
>>> viết:
>>>>
>>>> The example he put above is fine:  :)
>>>> ```
>>>> subscriptions : Model -> Sub Msg
>>>> subscriptions model =
>>>>   if (gameIsNotFinished model && model.turn == AIToMove) then
>>>>     Time.every second AIMove
>>>>   else
>>>>     Sub.none
>>>> ```
>>>> Though if you want it in another function you can do that too (useful 
>>>> to batch functionality together):
>>>> ```
>>>> subAITick : Model -> Sub Msg
>>>> subAITick model =
>>>>   if (gameIsNotFinished model && model.turn == AIToMove) then
>>>>     Time.every second AIMove
>>>>   else
>>>>     Sub.none
>>>>
>>>> subscriptions : Model -> Sub Msg
>>>> subscriptions model =
>>>>   subAITick
>>>> ```
>>>> Or if you have other subscriptions too, batching them together:
>>>> ```
>>>>
>>>> subscriptions : Model -> Sub Msg
>>>> subscriptions model =
>>>>   Sub.batch
>>>>     [ subAITick
>>>>     ; otherSubscriptionsHere
>>>>     ]
>>>> ```
>>>>
>>>>
>>>> On Monday, October 10, 2016 at 10:48:34 AM UTC-6, [email protected] 
>>>> wrote:
>>>>>
>>>>> Can you show code example :D I'm quite new to Elm and javascript. 
>>>>>
>>>>> Vào 23:45:45 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, OvermindDL1 đã 
>>>>> viết:
>>>>>>
>>>>>> Yep, just call it from the subscriptions callback then.
>>>>>>
>>>>>>
>>>>>> On Monday, October 10, 2016 at 10:36:58 AM UTC-6, [email protected] 
>>>>>> wrote:
>>>>>>>
>>>>>>> This is quite a good idea. But can we define our own function that 
>>>>>>> can return a Sub Msg?
>>>>>>>
>>>>>>> Vào 20:41:40 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, Wouter In t 
>>>>>>> Velt đã viết:
>>>>>>>>
>>>>>>>> (disclaimer: I am also quite new to Elm) 
>>>>>>>> I always try to avoid creating my own Cmd: there is usually a 
>>>>>>>> better, less bug-prone way to achieve this (e.g. with resursive update 
>>>>>>>> calls).
>>>>>>>>
>>>>>>>> That said: I can see the logic in having a Msg originating from a 
>>>>>>>> "real" player, and another Msg from your AI player.
>>>>>>>>
>>>>>>>> What you could do, is make a subscription to Time, that is only 
>>>>>>>> active if it is the AI's turn to move.
>>>>>>>> That way, you get a) a delay before the AI makes a move + b) you do 
>>>>>>>> not need to create your own command
>>>>>>>> Whenever it is the user's turn, or as soon as the game is over, the 
>>>>>>>> subscription is turned off.
>>>>>>>>
>>>>>>>> Something like this:
>>>>>>>>
>>>>>>>> subscriptions : Model -> Sub Msg
>>>>>>>> subscriptions model =
>>>>>>>>   if (gameIsNotFinished model && model.turn == AIToMove) then
>>>>>>>>     Time.every second AIMove
>>>>>>>>   else
>>>>>>>>     Sub.none
>>>>>>>>
>>>>>>>> You would of course have to define your own functions to check if 
>>>>>>>> the game is still playing (no winner and no draw) and if it is the 
>>>>>>>> AI's 
>>>>>>>> turn to play.
>>>>>>>>
>>>>>>>

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to