public void mousePressed(MouseEvent e) {
		Card selectedCard;
		int selectedCardRow;
		int selectedCardCol;
		int randomPosition;

		if (noMoreTableCards || noMoreAvailableMoves) {
			return;
		}

		Point pressPt = e.getPoint();
		Point rowColOfSelectedCard = getRowColOfSelectedCard(pressPt);

		if (rowColOfSelectedCard != null) {
			selectedCardRow = rowColOfSelectedCard.x;
			selectedCardCol = rowColOfSelectedCard.y;
			selectedCard = cards[selectedCardRow][selectedCardCol];

			if (haveValueDifferenceOfOne(userCard, selectedCard)) {
				userCard.setValue(selectedCard.getValue());
				userCard.setSuit(selectedCard.getSuit());

				selectedCard.setHasBeenRemoved(true);
				numberRemoved++;

				cards[selectedCardRow][selectedCardCol] = null;
				revealNeighbouringCards(selectedCard.getCardArea(),
						selectedCardRow);
				// stage 9
				userScore += pointsToAdd;
				pointsToAdd++;
			}
		}

		if (cardStack.size() > 0 && packCardHasBeenPressed(pressPt)) {
			randomPosition = (int) (Math.random() * cardStack.size());
			userCard = cardStack.remove(randomPosition);

			setUpCardPosition(userCard, cardWidth * 8, cardHeight * 5, true);

			// stage 9
			pointsToAdd = 1;
			userScore -= 5;
		}

		if (noMoreTableCards()) {
			noMoreTableCards = true;
		} else if (userIsStillAbleToWin(userCard) == false) {
			noMoreAvailableMoves = true;
		}

		repaint();
	}