I once wrote a tic-tac-toe game that had a simplistic way of learning, but it's not as interesting as a neural net would be.
It kept an array of integer values, which provide a score for each possible move for each possible game situation. There's few enough possible game situations that the resulting array isn't too big. The program remembers each move that was made in the current game. If the computer player loses, then each move it made is considered a bad move and the score is adjusted by -1. If the computer player wins, the score is adjusted by +1. If its a draw, the score is not changed.
I ended up tweaking this a few times. One change I made was I gave the later moves more of the blame for the outcome, and earlier moves didn't get scored as harshly. I also changed the deltas so instead of -1 and +1, it ended up being some other range of values (depending on the blame given to each move). It worked out okay, but the computer player never got really good, but it entertained my niece and nephew (young kids). As you can imagine, it learns very slowly and in a very mechanical way, so I put some randomness in it to make it less predictable. It saved the learning information to a file. It might be amusing to have a program like this play against itself. It would also need some mechanism to keep the scoring values from saturating the limits of the data type.