With version 0.5, the apprentice playing engine has improved somewhat. Making a winning move always gets a score of INT_MAX, and making a losing move always gets a score of INT_MIN. The improved playing engine cost me some computing power, but I've also been playing with gprof which should negate that effect somewhat. With version 0.4, gma is now split into two separate programs: a) The user interface b) The computer player The programs communicate through stdin/stdout. The user interface part gives orders to the computer player: 1) Here's your opponent's move: X Y 2) Here's your move: X Y 3) Make your move. 4) You win. 5) You lose. Note that the UI sends only the required numbers, separated by spaces; i.e. if the UI wants to tell a computer player about its opponent's move at (42,42), it sends the following line: 1 42 42 The computer player responds to #3 with a whitespace separated coordinate pair. After order #4 and #5, the user interface waits for each player to terminate before continuing. It is the responsibility of the user interface to: * Handle human players * Send each move to the other player * Check if a player has won The name of the user interface program should indicate the type of UI: A console UI should be named gma-console A gtk+ UI should be named gma-gtk+ A qt UI should be named gma-qt The name of the computer player should be suffixed with ".gmaplayer"; i.e. "apprentice.gmaplayer" is a fine name for the self-learning player.