Stocks and Shares

Developer(s): D. Bayliss
Date: 1984
Type: Program
Platform(s): TS 2068
Tags: Game

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, and R(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$ 0 is an embedded AT 13,0, so each prompt starts with PRINT 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 price B(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.

Related Content

Image Gallery

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: RETURN

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.