11-UP PATIENCE

by Colin Gooch

from ZX Computing Oct/Nov.1984



CARD CORNER - PATIENCE III



This issue, Colin Gooch presents us with

his version of "eleven-up" Patience.





Card games are often good starting points for micro

simulations. In particular Patience games are good for they

are already designed for one player. I find programming them

a fascinating insight into the working of the brain. It is

amazing how many factors we take into account when we so

simply look at a card and decide that it will "go". The same

decision may well take several subroutines each involving

several variables and loops.



Criticism is sometimes levelled at such simulations that

they are pointless because you can just as easily use a pack

of cards. That may be true, but it has many parallels in

other branches of life ... Why get out the vacuum cleaner

when it might be just as quick to use a brush? Anyway a

table to play on is not always available, and if you are ill

in bed it's much easier to balance a Spectrum on your knee

than a large tray.



One major decision to take is to decide just how much we

allow the computer to do. It would be quite easy to write a

program and simply watch the Spectrum play by itself. It's

best, I believe, to allow the player to do quite a lot, but

to reject faulty inputs. With an actual pack of cards you

can go back and correct your error if for instance you

misread a heart for a diamond. You cannot do this without

breaking into a program so it is best to avoid the problem.

At the same time we need to allow unwise but not illegal

moves.



I hope you enjoy the intricacies of long strings of cards

...



Happy programming.



			Ray Elder





11 Up Patience



This is one of the simplest of the great family of patience

games, and depends entirely on the run of the cards, but it

can still be quite frustrating and will practice your powers

of mental arithmetic!



Nine cards are dealt out and you must endeavour to get rid

of the rest of your cards by covering either pairs of cards

that total 11 or a run of J,Q,K. If you can't go you may

deal one card on the centre. If you are still stuck then you

must resign.



The first thing that we must do before programming a card

game is to decide on the presentation of the cards. A nine

by five block of print positions will allow for a very

realistic layout but unfortunately restricts the number of

cards that can be shown in full to a maximum of two rows of

four (or five if you omit gaps between). This game needs a

display of nine cards and to allow for an attractive deal I

have made a five by seven matrix the order of the day. This

means that the pips on the cards are not in quite the

traditional places but I think they are still acceptable.



The cards are represented in memory by five characters and

are held in a main string P$ in which they are dealt and

shuffled. Each card is made up of a first character giving

its 'name', the next two its value, the next the suit and

finally the colour.





Program operation



When loaded the program will auto run and set up the

graphics using line 1760 onwards. The main program will then

'RUN'.



The first operational line is 1020 which produces two

defined functions to locate the printing of the cards to x

and y coordinates. The main loop, which is quite long,

starts at 1040. It first of all gives you the choice of

instructions held in lines 1600 onwards, then initialises

some variables - line 1710 - and sets up and shuffles the

pack in lines 1400 and 1490.



Line 1060 will print out a hand using the card printing

subroutine at line 1250. You're then asked to input your

move. The lines from here up to 1210 check that this is a

valid combination. If all is well then your move is printed

and we loop back to the beginning. If it is a faulty input

you will be asked to enter again. If you have run out of

cards or resigned you will be directed to the end game

routine at line 1510.



The Spectrum keeps track of what cards are dealt by using an

array R$. I have done this rather than using the SCREEN$

function to read the value as '10' is a U.D.G. which this

will not recognise.



The subroutine to print out the cards runs from line 1250.

It breaks down the card into its various components (the

string slicing ability is excellent for this purpose) and

uses these to print the correct card, the place being given

by the two defined functions. Picture cards are shown as

letters.





Main variables



A        counts out cards in deal

CD       cards played

FA       temporary flag

N        for-next loops

T        total value of cards to cover

x,y      position on screen

z(x)     values derived from Z$

A$,B$,D$ setting up pack

C$       card being printed

E,F$     components of C$

P$       pack

R$(x)    cards dealt

Z$       your move

T$       title

U$       instructions





Memory



This program will easily fit into 16K.



All that remains now is to type it in. Debugging should not

be difficult. If you get 'funny' cards then your error is

almost certainly from line 1250 onwards. If it's rejecting a

legitimate move then its in the main loop ... have PATIENCE

and it'll all be OK.!





--

Another Fine Product transcribed by:

Jim Grimwood (jimg@globalnet.co.uk), Weardale, England

--

