A trading game for up to ten players over a chosen number of rounds. The screen shows ten sectors, from Aviation and Steel to Film and Gold, with the shares left in the market, the price and your holding. Everyone starts with 200 in cash and ten shares in each sector. Each turn may bring a dividend on one sector, and then three random “market influences”, of which the player picks the one that takes effect. The player can then buy, sell, sell everything, or reserve shares to be bought at the next turn. Quitting the turn fills other players’ reservations and lets every price drift up or down. At the end every holding is sold and each player’s cash is listed.
A REM credits D. Bayliss and ZX Computing, February/March 1984.
Program Analysis
Structure
- Lines 20–280: set-up.
A(P,11)holds each player’s shares and cash,B(10,2)each sector’s available shares and price, andR(P,10)the reservations. - Lines 300–520: the turn loop and the options menu.
- Lines 640–1230: buy, sell, sell all and reserve.
- Lines 1240–1410: filling reservations, partly if not enough shares are left.
- Lines 1420–1850: dividends and market influence. Lines 1920–2100: the end-of-turn price drift.
- Lines 2110–2250: clearing the lower screen and redrawing the share columns.
Notable Techniques
T$=CHR$ 22+CHR$ 13+CHR$ 0is an embeddedAT 13,0, so each prompt starts withPRINT T$;.FOR ... =SGN PI TO ...is used throughout to start loops at 1.- The price drift (lines 1960–2060) adds rare big jumps and pulls prices back from the 1 and 40 limits.
Potential Issues
- Selling pays the wrong amount. Line 950 credits
B(SE,1)*QS, the number of shares left in the market times the quantity sold, instead of the priceB(SE,2)*QS. - The number of players is not checked for zero or a negative value.
This program came from an Oliger (JLO SAFE) disk, a copy of the SNUG library disk 17/18, and was converted to load from tape. No changes were needed. It was tested in ZEsarUX with two players, choosing a market influence and buying shares.
Source Code
10 REM "STOCKS & SHARES" by D. Bayliss * ZX COMPUTING, Feb/Mar 1984
20 CLS : DIM A$(10,12)
30 FOR Z=0 TO 6 STEP 2: POKE USR "A"+Z,85: POKE USR "a"+Z+1,170:: NEXT Z
40 DIM B(10,2)
50 PRINT AT 6,0;"<<<<<<<<<< >>>>>>>>>> "'" STOCKS AND SHARES"''"<<<<<<<<<< >>>>>>>>>>"
60 PRINT '''" A GAME FOR UP TO TEN PLAYERS"
70 INPUT " HOW MANY PLAYERS? ";P
80 IF P>10 THEN GO TO 70
90 CLS : DIM A(P,11)
100 DIM R(P,10): LET T$=CHR$ 22+CHR$ 13+CHR$ 0
110 PRINT AT 11,7;"HOW MANY ROUNDS?"
120 INPUT END
130 RESTORE : FOR Z=SGN PI TO 10: READ A$(Z): NEXT Z
140 DATA "1.AVIATION","2.STEEL","3.SHIPPING","4.BUILDING","5.FINANCE","6.LEISURE","7.INDUSTRY","8.FILM IND","9.CHAIN ST","10.GOLD "
150 LET C$=" RESERVED "
160 FOR N=SGN PI TO P
170 FOR M=SGN PI TO 10
180 LET A(N,M)=10
190 LET B(M,1)=P*40
200 LET B(M,2)=10
210 NEXT M
220 LET A(N,11)=200
230 NEXT N
240 LET RO=1
250 GO SUB 530
260 FOR N=SGN PI TO 10
270 GO SUB 630
280 NEXT N
290 REM PRIMARY LOOP
300 FOR J=SGN PI TO P
310 PRINT AT 12,0;"ROUND ";RO;" OF ";END
320 LET ST=1
330 PRINT AT 0,0;P;" PLAYING"
340 GO SUB 2150
350 PRINT AT 0,27;" ";AT 0,27;J
360 IF RND>.8 THEN GO SUB 1420
370 GO SUB 1570
380 GO SUB 2110
390 LET ST=0
400 PRINT T$;"PLAYER>";J;" YOUR OPTIONS ARE :-"
410 PRINT '"1. BUY"'"2. SELL"'"3. SELL ALL"'"4. RESERVE"'"5. QUIT"
420 INPUT OP
430 IF OP<1 OR OP>5 THEN GO TO 420
440 IF OP=1 THEN GO TO 640
450 IF OP=2 THEN GO TO 830
460 IF OP=3 THEN GO TO 1010
470 IF OP=4 THEN GO TO 1100
480 IF OP=5 THEN GO TO 1920
490 IF J=P THEN LET RO=RO+1
500 IF RO=END+1 THEN GO TO 1860
510 NEXT J
520 GO TO 300
530 REM SCREEN$
540 PRINT AT 0,0;"aaaaaaaaaaaaaaaaaaaaPLAYER> "
550 FOR N=SGN PI TO 10
560 PRINT AT N,0;A$(N);" AT a- "
570 NEXT N
580 PRINT "aaaaaaaaaaaaaaaaaaaaCASH "
590 FOR N=SGN PI TO 10
600 PRINT AT N,27; INVERSE 1;C$(N)
610 NEXT N: RETURN
620 PRINT AT 11,25;A(J,11),: RETURN
630 PRINT AT N,17;" ";AT N,17;B(N,2): RETURN
640 REM BUY
650 GO SUB 2110
660 PRINT T$;"WHAT DO YOU WISH TO BUY?","(1, 2, 3, ETC)"
670 INPUT BU
680 IF BU<1 OR BU>10 THEN GO TO 670
690 PRINT AT BU,19;"<O>"
700 PRINT AT 13,26;BU;AT 15,0;"HOW MANY DO YOU REQUIRE?","YOU CAN AFFORD ";INT (A(J,11)/B(BU,2))
710 INPUT QU
720 IF QU>B(BU,1) THEN GO TO 710
730 IF QU>INT A(J,11)/B(BU,2) THEN GO TO 710
740 PRINT AT 15,26;QU
750 LET A(J,11)=A(J,11)-(B(BU,2)*QU)
760 LET B(BU,1)=B(BU,1)-QU
770 LET A(J,BU)=A(J,BU)+QU
780 PRINT AT BU,10;" ";AT BU,10;B(BU,1);AT BU,22;" ";AT BU,22;A(J,BU)
790 GO SUB 620
800 PRINT AT BU,19;"a- "
810 GO SUB 2110
820 GO TO 400
830 REM SELL
840 GO SUB 2110
850 PRINT T$;"WHAT DO YOU WANT TO SELL ?","(1, 2, 3, ETC)"
860 INPUT SE
870 IF SE<1 OR SE>10 THEN GO TO 860
880 PRINT AT SE,19;"<O>"
890 PRINT AT 13,26;SE;AT 15,0;"HOW MANY TO SELL ?"
900 INPUT QS
910 IF QS>A(J,SE) THEN GO TO 900
920 PRINT AT 15,26;QS
930 LET B(SE,1)=B(SE,1)+QS
940 LET A(J,SE)=A(J,SE)-QS
950 LET A(J,11)=A(J,11)+(B(SE,1)*QS)
960 PRINT AT SE,10;" ";AT SE,10;B(SE,1);AT SE,22;" ";AT SE,22;A(J,SE)
970 GO SUB 620
980 PRINT AT SE,19;"a- "
990 GO SUB 2110
1000 GO TO 400
1010 REM SELL ALL
1020 FOR N=SGN PI TO 10
1030 LET B(N,1)=B(N,1)+A(J,N)
1040 LET A(J,11)=A(J,11)+(A(J,N)*B(N,2))
1050 LET A(J,N)=0
1060 NEXT N
1070 IF RO=END+1 THEN RETURN
1080 GO SUB 2150: GO SUB 2110
1090 GO TO 400
1100 REM RESERVE
1110 GO SUB 2110
1120 PRINT T$;"WHAT DO YOU WISH TO RESERVE? (1, 2, 3, ETC)"
1130 INPUT RE
1140 IF RE<1 OR RE>10 THEN GO TO 1130
1150 PRINT AT 13,29;RE;AT 15,0;"HOW MANY ? "
1160 INPUT RA
1170 IF RA>((P*40)+(P*10)) THEN GO TO 1160
1180 IF RA+R(J,RE)>((P*40)+(P*10)) THEN GO TO 1160
1190 PRINT AT 15,9;RA
1200 LET R(J,RE)=R(J,RE)+RA
1210 PRINT AT RE,28;R(J,RE),
1220 GO SUB 2110
1230 GO TO 400
1240 REM RESERVE ADJUSTMENTS
1250 FOR Q=J-1 TO J-(P-1) STEP -1
1260 LET Q1=Q
1270 IF Q1<1 THEN LET Q1=Q1+P
1280 FOR N=SGN PI TO 10
1290 IF R(Q1,N)<>0 THEN GO SUB 1320
1300 NEXT N
1310 NEXT Q: RETURN
1320 IF R(Q1,N)>B(N,1) THEN GO TO 1380
1330 LET A(Q1,N)=A(Q1,N)+R(Q1,N)
1340 LET A(Q1,11)=A(Q1,11)-(R(Q1,N)*B(N,2))
1350 LET B(N,1)=B(N,1)-R(Q1,N)
1360 LET R(Q1,N)=0
1370 RETURN
1380 LET A(Q1,N)=A(Q1,N)+B(N,1)
1390 LET A(Q1,11)=A(Q1,11)-(B(N,1)*B(N,2))
1400 LET R(Q1,N)=R(Q1,N)-B(N,1)
1410 LET B(N,1)=0: RETURN
1420 REM DIVIDENDS
1430 GO SUB 2110
1440 PRINT T$;"________DIVIDEND________"
1450 LET DI=INT (RND*10)+1
1460 PRINT AT 14,0;"YOU RECEIVE A DIVIDEND"
1470 PRINT "ALL SHARES HELD IN..."
1480 PRINT A$(DI)
1490 PRINT "YOU HOLD ";A(J,DI)
1500 PRINT "YOU RECEIVE ";A(J,DI)*10
1510 PRINT '" ANY KEY TO CONTINUE "
1520 IF INKEY$<>"" THEN GO TO 1520
1530 IF INKEY$="" THEN GO TO 1530
1540 GO SUB 2110
1550 LET A(J,11)=A(J,11)+(A(J,DI)*10)
1560 GO SUB 620: RETURN
1570 REM MARKET INFLUENCE
1580 GO SUB 2110
1590 DIM I(10)
1600 PRINT T$;"MARKET INFLUENCE"
1610 FOR N=SGN PI TO 10
1620 LET I(N)=INT (RND*14+1)-7
1630 IF I(N)=0 THEN GO TO 1620
1640 NEXT N
1650 DIM Z(3)
1660 FOR N=SGN PI TO 3
1670 LET Z(N)=INT (RND*10)+1
1680 IF N=2 AND Z(N)=Z(1) THEN GO TO 1670
1690 IF N=3 AND (Z(N)=Z(1) OR Z(N)=Z(2)) THEN GO TO 1670
1700 PRINT AT 13+N,0;A$(Z(N))
1710 IF I(Z(N))<0 THEN PRINT AT 13+N,12;"DOWN";ABS I(Z(N))
1720 IF I(Z(N))>0 THEN PRINT AT 13+N,12;" UP ";I(Z(N))
1730 NEXT N
1740 PRINT AT 18,0;"CHOOSE";Z(1);"/";Z(2);"/";Z(3)
1750 INPUT CH
1760 IF CH<>Z(1) AND CH<>Z(2) AND CH<>Z(3) THEN GO TO 1750
1770 LET B(CH,2)=B(CH,2)+I(CH)
1780 IF B(CH,2)<1 THEN LET B(CH,2)=1
1790 IF B(CH,2)>40 THEN LET B(CH,2)=40
1800 PRINT AT CH,17;" ";AT CH,17;B(CH,2)
1810 GO SUB 2110
1820 IF ST=1 THEN RETURN
1830 FOR N=13 TO 20
1840 PRINT AT N,0;"aaaaaaaNEXT PLAYERaaaaaaaaa"
1850 NEXT N: RETURN
1860 REM END
1870 CLS
1880 FOR J=SGN PI TO P
1890 GO SUB 1010
1900 PRINT AT J,0;"PLAYER ";J;" HAS ";A(J,11)
1910 NEXT J: STOP
1920 REM PRICES
1930 GO SUB 1570
1940 GO SUB 1240
1950 FOR N=SGN PI TO 10
1960 LET UP=INT (RND*4)
1970 LET DO=INT (RND*4)
1980 LET G=INT (RND*2)+1
1990 IF G=1 THEN LET B(N,2)=B(N,2)+UP
2000 IF G=2 THEN LET B(N,2)=B(N,2)-DO
2010 IF RND>.95 THEN LET B(N,2)=B(N,2)+UP+DO
2020 IF RND>.95 THEN LET B(N,2)=B(N,2)-UP-DO
2030 IF RND>.8 AND B(N,2)<5 THEN LET B(N,2)=B(N,2)+UP+DO
2040 IF RND>.8 AND B(N,2)>35 THEN LET B(N,2)=B(N,2)-UP-DO
2050 IF B(N,2)>40 THEN LET B(N,2)=40
2060 IF B(N,2)<1 THEN LET B(N,2)=1
2070 GO SUB 630
2080 NEXT N
2090 GO SUB 2110
2100 GO TO 490
2110 REM CLS
2120 FOR N=13 TO 21
2130 PRINT AT N,0,,: NEXT N
2140 RETURN
2150 REM SHARES DISPLAY
2160 FOR N=SGN PI TO 10
2170 PRINT AT N,22;" ";AT N,22;A(J,N)
2180 PRINT AT N,10;" ";AT N,10;B(N,1)
2190 PRINT AT N,28;R(J,N),
2200 NEXT N
2210 GO SUB 620: RETURN
2220 REM DISPLAY RESERVES
2230 FOR N=SGN PI TO 10
2240 PRINT AT N,28;R(J,N),
2250 NEXT N: RETURNNote: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

