You did it very well !
My next step is to make the code iterative, the problem:
I will run this on smartphones (iOS, Android) where i cann't use multi-threading. One challange i will be facing is to somehow update the screen while the CPU is "thinking".
My first idea is to call screen-updates from the Negmax-function "periodically" without losing too much CPU-time for the A.I.