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.
