private void observeResultingState(TicTacToe game) {
		if (!learn)
			return;
		
		// reward received
		double reward = 0.0;
		if (game.hasEnded() && game.isDraw() == false) {
			if (game.getWinner() == this)
				reward += 1;
			else
				reward -= 1;
		}

		// observe resulting state
		NeuralData newState = new BasicNeuralData(game.getState());
		Double best = 0.0;
		List<Move> possible = game.getPossibleMoves();
		for (Move action : possible) {
			final NeuralData output = networks.get(action).compute(newState);
			
			if (best == null || output.getData(0) > best) {
				best = output.getData(0);
			}
		}
		
		// adjust the neural network
		double qTarget = (1 - learningRate) * qOutput + learningRate * (reward + best);
		
		NeuralDataSet trainingSet = new BasicNeuralDataSet(
			new double[][]{ state }, 
			new double[][] { {qTarget} }
		);
		final Train train = new Backpropagation(networks.get(selectedMove), trainingSet, 0.2, 0.9);
		train.iteration();
	}