;;; -*- Mode:LISP; Readtable:CL; Base:10 -*- (defun CHOOSE-CARD (hand card-led) (let ((suit-led (get-suit card-led)) (pip-count-led (get-pips card-led))) (cond ((singleton-p hand suit-led) ;no choice (get-card suit-led hand)) ((void-p hand suit-led) ;complete choice (let ((singleton-suits ;which suits are singletons? (subset #'(lambda (suit) (singleton-p hand suit)) all-suits)) ) (t ;can choose from >1 cards in suit (defstruct (HAND (:type (:named-list) (defvar NORTH (make-instance 'hand)) (defvar SOUTH (make-instance 'hand)) (defvar EAST (make-instance 'hand)) (defvar WEST (make-instance 'hand)) (defvar ALL-PLAYERS (list NORTH EAST SOUTH WEST)) (defvar EACH-SUIT '(2 3 4 5 6 7 8 9 10 J Q K A)) (defvar ALL-SUITS '(OF-SPADES OF-DIAMONDS OF-HEARTS OF-CLUBS)) (defvar *ALL-CARDS* (loop for suit in all-suits collect (loop for each-card in each-suit collect (list each-card suit)))) (defun DEAL-HAND () (let ((all-cards (lexpr-funcall 'append *all-cards*))) ;flatten the list of cards into a single list of 52 elements (dotimes (i 52.) (let ((player (nth (remainder i 4.) all-players)) (card (nth (random (- 52 i)) all-cards))) (setq all-cards (remove (car (setq player (cons card (eval player)))) all-cards)) (format t "~%Assigning card ~A to ~A. Deck Length = ~A" card player (length all-cards))))))