import GUI in "%oot/lib/GUI"
 
class Card
 
 
    export setCard, getCard, Selected, getSelected, Suit, Rank, setSuit,
 
        printCard
 
 
    var card : string
 
    var selected : boolean := false
 
 
    %Procedure : setCard
 
    %Input : none
 
    %Output: card
 
    %Purpose : give card a value
 
    %Parameters : the name of the card
 
 
    procedure setCard (c : string)
 
        card := c
 
    end setCard
 
 
    %Function : getCard
 
    %Input : none
 
    %Output: card
 
    %Purpose : get the value of card
 
 
    function getCard : string
 
        result card
 
    end getCard
 
 
    procedure Selected
 
        selected := true
 
    end Selected
 
 
    function getSelected : boolean
 
        result selected
 
    end getSelected
 
 
    %Function : Suit
 
    %Input : none
 
    %Output: suit of the card
 
    %Purpose : to find the suit of card
 
 
    function Suit : int
 
        var suit : int
 
        if index (card, "d") = 2 then
 
            suit := 1
 
        elsif index (card, "c") = 2 then
 
            suit := 2
 
        elsif index (card, "h") = 2 then
 
            suit := 3
 
        elsif index (card, "s") = 2 then
 
            suit := 4
 
        end if
 
        result suit
 
    end Suit
 
 
    %Function : Rank
 
    %Input : none
 
    %Output: Rank of the card
 
    %Purpose : to find the rank of card
 
    %Paramenter : card
 
 
    function Rank : int
 
        var rank : int
 
        if index (card, "a") = 1 then
 
            rank := 1
 
        elsif index (card, "2") = 1 then
 
            rank := 2
 
        elsif index (card, "3") = 1 then
 
            rank := 3
 
        elsif index (card, "4") = 1 then
 
            rank := 4
 
        elsif index (card, "5") = 1 then
 
            rank := 5
 
        elsif index (card, "6") = 1 then
 
            rank := 6
 
        elsif index (card, "7") = 1 then
 
            rank := 7
 
        elsif index (card, "8") = 1 then
 
            rank := 8
 
        elsif index (card, "9") = 1 then
 
            rank := 9
 
        elsif index (card, "t") = 1 then
 
            rank := 10
 
        elsif index (card, "j") = 1 then
 
            rank := 11
 
        elsif index (card, "q") = 1 then
 
            rank := 12
 
        elsif index (card, "k") = 1 then
 
            rank := 13
 
        end if
 
        result rank
 
    end Rank
 
 
    %Function : setSuit
 
    %Input : suit choosen
 
    %Output: suit
 
    %Purpose : to change the suit of card
 
 
    function setSuit : int
 
        var newSuit : string (1) := 'x'
 
        var rank : string
 
        var suit : int := 0
 
 
        put "Choose a suit (d=diamonds c=clubs h=hearts s=spades): " ..
 
        loop
 
            if hasch then
 
                getch (newSuit)
 
                case newSuit of
 
                    label 'd' :
 
                        card := card (1) + "d"
 
                        suit := Suit
 
                    label 'c' :
 
                        card := card (1) + "c"
 
                        suit := Suit
 
                    label 'h' :
 
                        card := card (1) + "h"
 
                        suit := Suit
 
                    label 's' :
 
                        card := card (1) + "s"
 
                        suit := Suit
 
                    label :
 
                        put ""
 
                        put "Invalid suit"
 
                        suit := 0
 
                end case
 
            end if
 
 
            exit when suit not= 0
 
        end loop
 
 
        result suit
 
    end setSuit
 
 
    procedure printCard (x, y : int, front : boolean)
 
        var cardPic : int
 
 
 
        if front then
 
            case card of
 
                label 'ad' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\ad.bmp")
 
                label 'ac' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\ac.bmp")
 
                label 'ah' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\ah.bmp")
 
                label 'as' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\as.bmp")
 
                label '2d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\2d.bmp")
 
                label '2c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\2c.bmp")
 
                label '2h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\2h.bmp")
 
                label '2s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\2s.bmp")
 
                label '3d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\3d.bmp")
 
                label '3c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\3c.bmp")
 
                label '3h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\3h.bmp")
 
                label '3s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\3s.bmp")
 
                label '4d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\4d.bmp")
 
                label '4c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\4c.bmp")
 
                label '4h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\4h.bmp")
 
                label '4s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\4s.bmp")
 
                label '5d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\5d.bmp")
 
                label '5c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\5c.bmp")
 
                label '5h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\5h.bmp")
 
                label '5s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\5s.bmp")
 
                label '6d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\6d.bmp")
 
                label '6c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\6c.bmp")
 
                label '6h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\6h.bmp")
 
                label '6s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\6s.bmp")
 
                label '7d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\7d.bmp")
 
                label '7c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\7c.bmp")
 
                label '7h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\7h.bmp")
 
                label '7s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\7s.bmp")
 
                label '8d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\8d.bmp")
 
                label '8c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\8c.bmp")
 
                label '8h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\8h.bmp")
 
                label '8s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\8s.bmp")
 
                label '9d' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\9d.bmp")
 
                label '9c' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\9c.bmp")
 
                label '9h' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\9h.bmp")
 
                label '9s' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\9s.bmp")
 
                label 'td' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\td.bmp")
 
                label 'tc' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\tc.bmp")
 
                label 'th' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\th.bmp")
 
                label 'ts' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\ts.bmp")
 
                label 'jd' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\jd.bmp")
 
                label 'jc' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\jc.bmp")
 
                label 'jh' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\jh.bmp")
 
                label 'js' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\js.bmp")
 
                label 'qd' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\qd.bmp")
 
                label 'qc' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\qc.bmp")
 
                label 'qh' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\qh.bmp")
 
                label 'qs' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\qs.bmp")
 
                label 'kd' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\kd.bmp")
 
                label 'kc' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\kc.bmp")
 
                label 'kh' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\kh.bmp")
 
                label 'ks' :
 
                    cardPic := Pic.FileNew (".\\CardsBMP\\ks.bmp")
 
            end case
 
        else
 
            cardPic := Pic.FileNew (".\\CardsBMP\\b.bmp")
 
        end if
 
 
        Pic.Draw (cardPic, x, y, picCopy)
 
        Pic.Free (cardPic)
 
    end printCard
 
 
 
end Card
 
 
class Deck
 
 
    import Card
 
 
    export emptyDeck, shuffleDeck, TopCard
 
 
    var cards : array 1 .. 52 of ^Card
 
    var size : int
 
    var topC : string
 
    var p : int := 1
 
 
    for i : 1 .. 52
 
        new cards (i)
 
    end for
 
 
    %Procedure : initialize
 
    %Input : none
 
    %Output: none
 
    %Purpose : initializes the deck of cards and sets a logical size
 
 
    procedure initialize
 
        cards (1) -> setCard ('ad')
 
        cards (2) -> setCard ('ac')
 
        cards (3) -> setCard ('ah')
 
        cards (4) -> setCard ('as')
 
        cards (5) -> setCard ('2d')
 
        cards (6) -> setCard ('2c')
 
        cards (7) -> setCard ('2h')
 
        cards (8) -> setCard ('2s')
 
        cards (9) -> setCard ('3d')
 
        cards (10) -> setCard ('3c')
 
        cards (11) -> setCard ('3h')
 
        cards (12) -> setCard ('3s')
 
        cards (13) -> setCard ('4d')
 
        cards (14) -> setCard ('4c')
 
        cards (15) -> setCard ('4h')
 
        cards (16) -> setCard ('4s')
 
        cards (17) -> setCard ('5d')
 
        cards (18) -> setCard ('5c')
 
        cards (19) -> setCard ('5h')
 
        cards (20) -> setCard ('5s')
 
        cards (21) -> setCard ('6d')
 
        cards (22) -> setCard ('6c')
 
        cards (23) -> setCard ('6h')
 
        cards (24) -> setCard ('6s')
 
        cards (25) -> setCard ('7d')
 
        cards (26) -> setCard ('7c')
 
        cards (27) -> setCard ('7h')
 
        cards (28) -> setCard ('7s')
 
        cards (29) -> setCard ('8d')
 
        cards (30) -> setCard ('8c')
 
        cards (31) -> setCard ('8h')
 
        cards (32) -> setCard ('8s')
 
        cards (33) -> setCard ('9d')
 
        cards (34) -> setCard ('9c')
 
        cards (35) -> setCard ('9h')
 
        cards (36) -> setCard ('9s')
 
        cards (37) -> setCard ('td')
 
        cards (38) -> setCard ('tc')
 
        cards (39) -> setCard ('th')
 
        cards (40) -> setCard ('ts')
 
        cards (41) -> setCard ('jd')
 
        cards (42) -> setCard ('jc')
 
        cards (43) -> setCard ('jh')
 
        cards (44) -> setCard ('js')
 
        cards (45) -> setCard ('qd')
 
        cards (46) -> setCard ('qc')
 
        cards (47) -> setCard ('qh')
 
        cards (48) -> setCard ('qs')
 
        cards (49) -> setCard ('kd')
 
        cards (50) -> setCard ('kc')
 
        cards (51) -> setCard ('kh')
 
        cards (52) -> setCard ('ks')
 
        size := 52
 
    end initialize
 
 
    function emptyDeck : boolean
 
        var numOfSelected : int := 0
 
        var eD : boolean := false
 
        for i : 1 .. 52
 
            if cards (i) -> getSelected = true then
 
                numOfSelected := numOfSelected + 1
 
            end if
 
        end for
 
 
        if numOfSelected = 52 then
 
            eD := true
 
        end if
 
        result eD
 
    end emptyDeck
 
 
    %Procedure : shuffleDeck
 
    %Input : none
 
    %Output: none
 
    %Purpose : to shuffle the deck
 
 
    procedure shuffleDeck
 
        var a, b : int
 
        var temp : ^Card
 
        initialize
 
        new temp
 
        for i : 1 .. 52
 
            randint (a, 1, 52)
 
            randint (b, 1, 52)
 
            temp -> setCard (cards (a) -> getCard)
 
            cards (a) -> setCard (cards (b) -> getCard)
 
            cards (b) -> setCard (temp -> getCard)
 
        end for
 
 
        %for i : 1..52
 
        %put cards (i) -> getCard
 
        %  end for
 
    end shuffleDeck
 
 
    %Function : TopCard
 
    %Input : none
 
    %Output: the value of the top card on the deck
 
    %Purpose : to find the value of the top card on the deck
 
 
    function TopCard : ^Card
 
        p := p + 1
 
        if cards (p) -> getSelected = false then
 
            cards (p) -> Selected
 
 
        end if
 
        result cards (p)
 
    end TopCard
 
end Deck
 
 
class Hand
 
 
    import Card, Mouse, Deck
 
 
    export sort, print, setY, setHuman, add, useMouse, whatToPlay, remove, 
 
        emptyHand
 
 
    var hand : array 1 .. 20 of ^Card
 
    var size : int := 8
 
    var x : int 
 
    var y : int := 20
 
                                                                                                        var human : boolean := false;
 
 
 
 
    for i : 1 .. 20
 
        new hand (i)
 
    end for
 
 
 
 
    procedure sort
 
        var t : ^Card
 
 
        for n : 1 .. size - 1
 
            for a : 1 .. size
 
                for b : 1 .. size
 
                    if hand (a) -> Rank > hand (b) -> Rank then
 
                        t -> setCard (hand (a) -> getCard)
 
                        hand (a) -> setCard (hand (b) -> getCard)
 
                        hand (b) -> setCard (t -> getCard)
 
                    end if
 
                end for
 
            end for
 
        end for
 
    end sort
 
 
    procedure add (newCard : ^Card)
 
        var l : int
 
        var n : string := newCard -> getCard
 
 
        size := size + 1
 
 
        for decreasing i : size .. 1
 
            hand (i) -> setCard (n)
 
        end for
 
 
        hand (size) -> setCard (n)
 
        sort
 
    end add
 
 
    procedure remove (card : ^Card)
 
 
        for i : 1 .. size
 
            if hand (i) -> getCard = card -> getCard then
 
                hand (i) := hand (i + 1)
 
            end if
 
        end for
 
 
        size := size - 1
 
    end remove
 
 
    function emptyHand():boolean
 
        if size = 0 then
 
            result true
 
        else
 
            result false
 
        end if
 
    end emptyHand
 
 
    function whatToPlay (pileCard : ^Card) : ^Card
 
        var topC : ^Card
 
        var tCd : ^Deck
 
        var count : int := 1
 
        var done : boolean := false
 
 
        loop
 
            if pileCard -> Suit = hand (count) -> Suit then
 
                done := true
 
                result (hand (count))
 
            elsif pileCard -> Rank = hand (count) -> Rank then
 
                done := true
 
                result (hand (count))
 
            elsif count > size then
 
                done := true
 
                result pileCard
 
            end if
 
            count := count + 1
 
            exit when done = true
 
        end loop
 
 
    end whatToPlay
 
 
    function okayToPlay (pile : ^Card, card : ^Card) : boolean
 
        if card -> Rank = pile -> Rank or card -> Suit = pile -> Suit
 
                then
 
            result true
 
        else
 
            result false
 
        end if
 
    end okayToPlay
 
 
    function useMouse (pile : ^Card) : ^Card
 
        var buttonnumber, buttonupdown, i : int
 
        var temp : ^Card
 
        var tc : string
 
 
        loop
 
            if whatToPlay (pile) = pile then
 
                result pile
 
            else
 
                Mouse.ButtonWait ("down", x, y, buttonnumber,
 
                    buttonupdown)
 
                if y > 100 and x < 20 then
 
                    i := 1
 
                elsif y > 100 and 20 <= x and x < 40 then
 
                    i := 2
 
                end if
 
                if (okayToPlay (pile, hand (i))) then
 
                    temp -> setCard (hand (i) -> getCard)
 
                    remove (hand (i))
 
                    result temp
 
                else
 
                    result pile
 
                end if
 
            end if
 
        end loop
 
 
    end useMouse
 
    
 
    procedure setY (num : int)
 
        y := num
 
    end setY
 
 
    procedure print 
 
        x:= 0
 
        
 
        hand (1) -> printCard (x, y, human)
 
        for i : 2 .. size
 
            x := x + 20
 
            hand (i) -> printCard (x, y, human)
 
        end for
 
    end print
 
 
    procedure setHuman (h : boolean)
 
        human := h
 
    end setHuman
 
 
 
end Hand
 
 
class Game
 
    import Deck, Card, Hand
 
    export play1
 
    
 
    var player : array 1 .. 4 of ^Hand
 
    var playerName : array 1 .. 4 of string
 
    var deck : ^Deck
 
    var pile : ^Card
 
 
    new deck
 
 
    for i : 1 .. 4
 
        new player (i)
 
    end for
 
 
    player (1) -> setY (20)
 
    player (2) -> setY (100)
 
    player (3) -> setY (180)
 
    player (4) -> setY (260)
 
    player (1) -> setHuman (true)
 
 
 
 
    new pile
 
 
    procedure setUp ()
 
        var temp : int
 
        temp := Window.Open ("graphics: 200;100, nocursor, noecho")
 
        
 
        put "Please input name: "..
 
        get playerName (1)
 
        
 
        if playerName (1) = " " then
 
            playerName (1) := "player 1"
 
        end if
 
        locate (3, 5)
 
        put playerName (1)
 
        playerName (2) := "Bob"
 
        playerName (3) := "Sam"
 
        playerName (4) := "Jen"
 
        Window.Close (temp)
 
        temp := Window.Open ("position:center, graphics:600;600")
 
 
    end setUp
 
 
    procedure reDraw ()
 
        cls
 
        for i : 1 .. 4
 
            if i = 1 then
 
                player (i) -> print
 
            else
 
 
            end if
 
        end for
 
        pile -> printCard (150, 20, true)
 
 
    end reDraw
 
 
    procedure deal ()
 
 
        for i : 1 .. 4
 
            for j : 1 .. 8
 
                player (i) -> add (deck -> TopCard)
 
                player (i) -> print
 
            end for
 
        end for
 
        
 
        
 
        deck -> shuffleDeck
 
 
    end deal
 
 
    procedure play1 ()
 
        var playr : int := 1
 
        var card : ^Card
 
        new card
 
        setUp
 
        deal
 
        loop
 
            if playr = 1 then
 
                card := player (playr) -> useMouse (pile)
 
            else
 
                card := player (playr) -> whatToPlay (pile)
 
            end if
 
            if card = pile then
 
                player (playr) -> add (deck -> TopCard)
 
            else
 
                player (playr) -> remove (card)
 
                pile := card
 
            end if
 
            exit when player (playr) -> emptyHand ()
 
            playr := playr mod 4 + 1
 
        end loop
 
 
    end play1
 
 
 
 
 
 
end Game
 
 
 
 
 
%test main
 
 
var w : int
 
var eD : boolean
 
var C : ^Card
 
var D : ^Deck
 
var H : ^Hand
 
var G : ^Game
 
new C
 
new D
 
new H
 
new G
 
 
w := Window.Open ("position:center, graphics:600;600")
 
G -> play1  |