diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-15 15:37:16 +0000 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-15 15:37:16 +0000 |
commit | 4ded442dd47babd9f3c0163ffe274f92d0e153a7 (patch) | |
tree | fda96e74fe286dc895a32549917005b939fd213a /src | |
parent | 2323b5e0ed564c215741c869da4b487d56b76502 (diff) | |
download | cantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.tar.gz cantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.tar.bz2 cantedraw-4ded442dd47babd9f3c0163ffe274f92d0e153a7.zip |
Player handler package
This package defines a player data structure, collections of players,
and different interactions you can have with them:
- Extracting attributes (destructors)
- Checking if they're bankrupt or can bet
- Modifying a collection to adjust the balance of any one
player (including errors in case that isn't possible)
Diffstat (limited to 'src')
-rw-r--r-- | src/player.lisp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/player.lisp b/src/player.lisp new file mode 100644 index 0000000..7979b25 --- /dev/null +++ b/src/player.lisp @@ -0,0 +1,72 @@ +;;; player.lisp - 2025-02-15 + +;; Copyright (C) 2025 Aryadev Chavali + +;; This program is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +;; FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for +;; details. + +;; You may distribute and modify this code under the terms of the GNU General +;; Public License Version 2, which you should have received a copy of along with +;; this program. If not, please go to <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Player management - in particular, financing and hand management. + +;;; Code: + +(in-package :cantedraw.player) + +(defun playerp (x) + (and (typep (car x) 'fixnum) + (typep (cadr x) 'fixnum) + (typep (caddr x) 'cardset))) + +(deftype player () `(and cons (satisfies playerp))) + +(deftype players () 'list) + +(fn player-id (player) (-> (player) fixnum) + (car player)) + +(fn player-balance (player) (-> (player) fixnum) + (cadr player)) + +(fn player-hand (player) (-> (player) cardset) + (caddr player)) + +(fn player-exists? (id players) (-> (fixnum players) boolean) + (assoc id players)) + +(fn player-bankrupt? (player) (-> (player) boolean) + (<= (cadr player) 0)) + +(fn player-can-bet? (min-bet player) (-> (fixnum player) boolean) + (>= (cadr player) min-bet)) + +(fn player-pay (id amount players) (-> (fixnum fixnum players) players) + (let ((p (assoc id players))) + (cond + ((not (typep p 'player)) + (error "Player [~a] does not exist.")) + ((not (player-can-bet? amount p)) + (error "Player [~a] has $~a but needs to pay ~a." + id (player-balance p) amount)) + (t + (destructuring-bind (id balance cards) p + (setf (cdr (assoc id players)) + (list (- balance amount) cards))))) + players)) + +(fn player-receive (id amount players) + (-> (fixnum fixnum players) players) + (let ((p (assoc id players))) + (if (not (typep p 'player)) + (error 'error-player-nonexistent + :id id)) + (destructuring-bind (id balance cards) p + (setf (cdr (assoc id players)) + (list (+ balance amount) cards))) + players)) |