Shuffle Cards NetLogo Model

Produced for the book series "Exercises for Artificial Intelligence";

Author: W. J. Teahan; Publisher: Ventus Publishing Aps.

powered by NetLogo

view/download model file: Shuffle-Cards.nlogo

WHAT IS IT?

This model shows how you can create a pack of cards using turtle shapes and then shuffle them using the shuffle command.


WHAT IS ITS PURPOSE?

It's purpose is to illustrate that a lot can be done using just turtle shapes.


HOW IT WORKS

The model uses three breeds of turtle agents to represent each card in the pack. These are: cards, suits and ranks. Each of these agents has a particular shape which is used to visually depict a card in the pack when it is shown. The card turtle agent owns a suit (e.g. clubs, spades, diamonds and hearts; this is represented by a suit turtle agent) and two ranks (e.g. Ace, King, represented by two rank turtle agents). These ranks appear at the top and bottom of a card - each of these is the 180 degrees rotation of the other.

Each card in the pack is created as separate agents (card, card-suit, card-rank-1 and card-rank-2) and this is then stored in a global list called the pack.


HOW TO USE IT

Select the slider values you want, then press the Shuffle button to display a shuffled deck of cards.


THE INTERFACE

The model's Interface button and sliders are defined as follows:

- Shuffle: This button clears the environment, creates a new pack, then shuffles it, displaying the result in the environment.

- card-size: This is the size of each card.

- suit-size: This is the size of each suit depicted in the middle of each card.

- rank-size: This is the size of each rank depicted to the top left and bottom right of each card.


THINGS TO NOTICE

Notice the extra shapes that have been added to the shapes library for the model by running the Turtles Shapes Editor in the Tools menu of the Interface. You will find a number of shapes added - these begin with "number: ..." and "suit: ...".

Notice how the card shape has been drawn using the shapes editor. Click on the outside of the card to verify that the thin outside line exists in the shape specification.

Notice the order that the agent positions are specified using the setxy command in the shuffle-pack-of-cards procedure for the three types of agents that are used to depict each card. The order is the card agent drawn first, followed by the card-suit, card-rank-1 and card-rank-2 agents. This ensures that the card agent appears underneath the other three agents and does not obscure them.


THINGS TO TRY

Try changing the values of the sliders to see what happens.

Try commenting out the last line of the setup procedure (set pack shuffle-pack-of-cards pack -90 30) to see what happens.

Have a go at improving the letter and number shapes that are used to specify the card rank.


EXTENDING THE MODEL

Create a model that can be used to play a card game. One trick that you can use is to hide the cards in the environment (using the hide-turtle command) and only show them when required. (See the Shuffle and Deal model to see how this could be done).


NETLOGO FEATURES

The shuffle command in NetLogo makes shuffling the pack of cards very easy.


RELATED MODELS

See the Shuffle and Deal model.


CREDITS AND REFERENCES

To refer to this model in publications, please use:

Teahan, W. J. (2010). Shuffle and Deal NetLogo model.
Exercisaes for Artificial Intelligence. Ventus Publishing Aps.


PROCEDURES

; Shuffle Cards model.
;
; Shuffles a pack of cards.
;
; Written by William John Teahan (2010)
;
; Copyright 2009 William John Teahan. All Rights Reserved.

breed [cards card]   ; a pack of cards
breed [suits suit]   ; clubs, spades, diamonds, hearts
breed [ranks rank]   ; Ace, King, Queen, Jack, Ten, ...

cards-own
[ card-suit          ; an agent: the card's suit
  card-rank-1        ; an agent: the rank of the card shown top-left e.g. Ace, King, Queen, Jack, Ten, ...
  card-rank-2        ; an agent: the rank of the card shown bottom-right e.g. Ace, King, Queen, Jack, Ten, ...
]

globals
[ pack               ; the pack of cards
]

to setup
; Setups the model.
  
  clear-all

  let this-card nobody
 
  ask patches
  [
    set pcolor 89 ;; make background full of light cyan coloured patches
  ]

  set pack create-pack-of-cards -90 30
  set pack shuffle-pack-of-cards pack -90 30
end

to-report create-pack-of-cards [start-x start-y]
; Creates and reports a list of cards in sorted order.

  let x 0
  let y 0
  let this-suit nobody
  let this-card nobody
  let this-pack []

  set y start-y  
  foreach ["suit: clubs" "suit: spades" "suit: hearts" "suit: diamonds"]
  [
    set x start-x
    set this-suit ?
    foreach ["card: Ace" "card: King" "card: Queen" "card: Jack" "number: Ten"
             "number: Nine" "number: Eight" "number: Seven" "number: Six"
             "number: Five" "number: Four" "number: Three" "number: Two"]
    [
      set this-card create-card this-suit ? x y
      set this-pack fput this-card this-pack
      set x x + 15 
    ]
    set y y - 22
  ]  
  
  report this-pack
end

to-report shuffle-pack-of-cards [this-pack start-x start-y]
; Shuffles the pack of cards, and returns it.

  set pack shuffle pack ; randomise the pack

  ; also need to reset the x, y co-ordinates
  let x start-x
  let y start-y
  let p 0
  foreach pack
  [
    if (p mod 13 = 0) and (p != 0)
      [ set x start-x
        set y y - 22
      ]
    ask ?
    [
      setxy x y
      ask card-suit
      [ setxy x y ]
      ask card-rank-1
      [ setxy x - 4 y + 6]
      ask card-rank-2
      [ setxy x + 4 y - 6 ]
    ] ; reset x and y positions for the card
    set x x + 15
    set p p + 1
  ]
  
  report pack
end  

to dump-pack-of-cards [this-pack]
; Dumps the pack of cards (for debugging purposes).

  print this-pack
end

to-report card-colour [this-shape]
; Reports the colour of the card whose suit is specified
; by this-shape.

  ifelse (this-shape = "suit: clubs") or (this-shape = "suit: spades")
    [ report black ]
    [ report red ]
end

to-report create-card [this-card-suit this-card-rank x y]
; Creates and returns a new card with the suit specified
; by this-shape and places it at co-ordinates (x,y).

  let this-card nobody
  let this-suit nobody
  let this-rank-1 nobody
  let this-rank-2 nobody

  let this-colour card-colour this-card-suit
  
  create-suits 1
  [
    set this-suit self
    set size suit-size
    
    set shape this-card-suit
    set color this-colour
    setxy x y
  ]

  create-ranks 1
  [
    set this-rank-1 self
    set size rank-size
    
    set shape this-card-rank
    set heading 0
    set color this-colour
    setxy x - 4 y + 6
  ]

  create-ranks 1
  [
    set this-rank-2 self
    set size rank-size
    
    set shape this-card-rank
    set heading 180
    set color this-colour
    setxy x + 4 y - 6
  ]

  create-cards 1
  [
    set this-card self
    set size card-size
    set shape "card"
    set color white
    set card-suit this-suit
    set card-rank-1 this-rank-1
    set card-rank-2 this-rank-2
    setxy x y
  ]

  report this-card
end
;
; Copyright 2010 by William John Teahan.  All rights reserved.
;
; Permission to use, modify or redistribute this model is hereby granted,
; provided that both of the following requirements are followed:
; a) this copyright notice is included.
; b) this model will not be redistributed for profit without permission
;    from William John Teahan.
; Contact William John Teahan for appropriate licenses for redistribution for
; profit.
;
; To refer to this model in publications, please use:
;
; Teahan, W. J. (2010).  Shuffle-Cards NetLogo model.
;   Artificial Intelligence. Ventus Publishing Aps
;