RosettaCodeData/Task/Playing-cards/ALGOL-68/playing-cards.alg

76 lines
2.2 KiB
Plaintext

MODE CARD = STRUCT(STRING pip, suit); # instance attributes #
# class members & attributes #
STRUCT(
PROC(REF CARD, STRING, STRING)VOID init,
FORMAT format,
PROC(REF CARD)STRING repr,
[]STRING suits, pips
) class card = (
# PROC init = # (REF CARD self, STRING pip, suit)VOID:(
pip OF self:=pip;
suit OF self :=suit
),
# format = # $"("g" OF "g")"$,
# PROC repr = # (REF CARD self)STRING: (
HEAP STRING out; putf(BOOK out,(format OF class card,self)); out
),
# suits = # ("Clubs","Hearts","Spades","Diamonds"),
# pips = # ("2","3","4","5","6","7","8","9","10","Jack","Queen","King","Ace")
);
MODE DECK = STRUCT(REF[]CARD deck); # instance attributes #
# class members & attributes #
STRUCT(
PROC(REF DECK)VOID init, shuffle,
PROC(REF DECK)STRING repr,
PROC(REF DECK)CARD deal
) class deck = (
# PROC init = # (REF DECK self)VOID:(
HEAP[ UPB suits OF class card * UPB pips OF class card ]CARD new;
FOR suit TO UPB suits OF class card DO
FOR pip TO UPB pips OF class card DO
new[(suit-1)*UPB pips OF class card + pip] :=
((pips OF class card)[pip], (suits OF class card)[suit])
OD
OD;
deck OF self := new
),
# PROC shuffle = # (REF DECK self)VOID:
FOR card TO UPB deck OF self DO
CARD this card = (deck OF self)[card];
INT random card = random int(LWB deck OF self,UPB deck OF self);
(deck OF self)[card] := (deck OF self)[random card];
(deck OF self)[random card] := this card
OD,
# PROC repr = # (REF DECK self)STRING: (
FORMAT format = $"("n(UPB deck OF self-1)(f(format OF class card)", ")f(format OF class card)")"$;
HEAP STRING out; putf(BOOK out,(format, deck OF self)); out
),
# PROC deal = # (REF DECK self)CARD: (
(shuffle OF class deck)(self);
(deck OF self)[UPB deck OF self]
)
);
# associate a STRING with a FILE for easy text manipulation #
OP BOOK = (REF STRING string)REF FILE:(
HEAP FILE book;
associate(book, string);
book
);
# Pick a random integer between from [lwb..upb] #
PROC random int = (INT lwb, upb)INT:
ENTIER(random * (upb - lwb + 1) + lwb);
DECK deck;
(init OF class deck)(deck);
(shuffle OF class deck)(deck);
print (((repr OF class deck)(deck), new line))