From 77d344a42fef1a49418a899708db073a394a066e Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Fri, 14 Feb 2025 23:22:49 +0000 Subject: Implement a package for some game mechanics Currently can deal some hands and redeal some cards. --- src/game.lisp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/game.lisp (limited to 'src') diff --git a/src/game.lisp b/src/game.lisp new file mode 100644 index 0000000..e9f234f --- /dev/null +++ b/src/game.lisp @@ -0,0 +1,47 @@ +;;; game.lisp - 2025-02-14 + +;; 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 . + +;;; Commentary: + +;; Game mechanic code. + +;;; Code: + +(in-package :cantedraw.game) + +(fn deal-cards (n deck) (-> (fixnum cardset) (cons cardset cardset)) + (destructuring-bind (hand . rest) (split n deck) + (cons (sort hand #'card<) rest))) + +(fn deal-hands (n deck) (-> (fixnum cardset) (cons list cardset)) + (if (< (length deck) (* 5 n)) + (error "Require at least ~a cards for ~a hands, but have ~a cards!" + n (* 5 n) (length deck))) + (loop :for i :from 1 :to n + :for (hand . rest) = (deal-cards 5 deck) :then (deal-cards 5 rest) + :collect hand :into x + :finally (return (cons x rest)))) + +(fn redeal-hand (hand indices deck) (-> (cardset list cardset) + (cons cardset cardset)) + (cond + ((null indices) (cons hand deck)) + ((= 5 (length indices)) (deal-cards 5 deck)) + (t + (destructuring-bind (new-cards . deck) + (deal-cards (length indices) deck) + (--> it + (remove-at-indices indices hand) + (append it new-cards) + (sort it #'card<) + (cons it deck)))))) -- cgit v1.2.3-13-gbd6f