mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-12 15:44:05 +09:00
basic: fix: would crap out when 'REM' is not a first statement of a line
This commit is contained in:
@@ -690,7 +690,7 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
"DIM" : function(lnum, stmtnum, args) {
|
"DIM" : function(lnum, stmtnum, args) {
|
||||||
return varArgNum(lnum, args, (revdims) => {
|
return varArgNum(lnum, stmtnum, args, (revdims) => {
|
||||||
let dims = revdims.reverse();
|
let dims = revdims.reverse();
|
||||||
let arraydec = "Array(dims[0]).fill(0)";
|
let arraydec = "Array(dims[0]).fill(0)";
|
||||||
for (let k = 1; k < dims.length; k++) {
|
for (let k = 1; k < dims.length; k++) {
|
||||||
@@ -1835,6 +1835,14 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
|
|||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
|
// case for: single word (e.g. NEXT for FOR loop)
|
||||||
|
if (tokens.length == 1 && states.length == 1) {
|
||||||
|
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
|
||||||
|
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
let headTkn = tokens[0].toUpperCase();
|
let headTkn = tokens[0].toUpperCase();
|
||||||
let headSta = states[0];
|
let headSta = states[0];
|
||||||
|
|
||||||
@@ -1843,11 +1851,8 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
|
|||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
// case for: single word (e.g. NEXT for FOR loop)
|
// case for: "REM" , ? anything ?
|
||||||
if (tokens.length == 1 && states.length == 1) {
|
if (headTkn == "REM" && headSta != "qot") return;
|
||||||
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
|
|
||||||
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
@@ -2773,11 +2778,13 @@ bF.run = function(args) { // RUN function
|
|||||||
let trees = bF._interpretLine(linenum, linestr.trim());
|
let trees = bF._interpretLine(linenum, linestr.trim());
|
||||||
programTrees[linenum] = trees
|
programTrees[linenum] = trees
|
||||||
// do prescan job (data, label, etc)
|
// do prescan job (data, label, etc)
|
||||||
trees.forEach((t, i) => {
|
if (trees !== undefined) {
|
||||||
if (bF.prescanStmts.includes(t.astValue)) {
|
trees.forEach((t, i) => {
|
||||||
bF._executeAndGet(linenum, i, t);
|
if (t !== undefined && bF.prescanStmts.includes(t.astValue)) {
|
||||||
}
|
bF._executeAndGet(linenum, i, t);
|
||||||
})
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// actually execute the program
|
// actually execute the program
|
||||||
|
|||||||
@@ -1,35 +1,29 @@
|
|||||||
1 OPTIONBASE 1
|
1 OPTIONBASE 1
|
||||||
2 PRINT SPC(31);"BLACK JACK"
|
2 PRINT SPC(31);"BLACK JACK"
|
||||||
4 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
|
4 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
|
||||||
6 PRINT
|
6 PRINT:PRINT:PRINT
|
||||||
7 PRINT
|
10 DEFUN TRUNCATEHAND(Q)=Q+11*(Q>=22)
|
||||||
8 PRINT
|
20 HANDCARDS=DIM(15,12):HANDTOTAL=DIM(15):DECK=DIM(52):DISCARD=DIM(52):PTOTAL=DIM(8):THISHNDFOR=DIM(7):BETS=DIM(15)
|
||||||
20 HANDS=DIM(15,12)
|
30 CARDLEN=DIM(15)
|
||||||
21 HANDTOTAL=DIM(15)
|
31 ZARR=DIM(10)
|
||||||
22 DECK=DIM(52)
|
40 REM--HANDCARDS(I,J) IS THE JTH CARD IN HAND I, HANDTOTAL(I) IS TOTAL OF HAND I
|
||||||
23 DISCARDECK=DIM(52)
|
50 REM--DECK IS THE DECK BEING DEALT FROM, DISCARD IS THE DISCARD PILE,
|
||||||
24 PLRSUM=DIM(8)
|
60 REM--PTOTAL(I) IS THE TOTAL FOR PLAYER I, THISHNDFOR(I) IS THE TOTAL THIS HAND FOR
|
||||||
25 PLRHNDSUM=DIM(7)
|
|
||||||
26 BETS=DIM(15)
|
|
||||||
30 HANDSLENS=DIM(15)
|
|
||||||
40 REM--HANDS(I,J) IS THE JTH CARD IN HAND I, HANDTOTAL(I) IS TOTAL OF HAND I
|
|
||||||
50 REM--C IS THE DECK BEING DEALT FROM, D IS THE DISCARD PILE,
|
|
||||||
60 REM--PLRSUM(I) IS THE TOTAL FOR PLAYER I, PLRHNDSUM(I) IS THE TOTAL THIS HAND FOR
|
|
||||||
70 REM--PLAYER I, BETS(I) IS TH BET FOR HAND I
|
70 REM--PLAYER I, BETS(I) IS TH BET FOR HAND I
|
||||||
80 REM--HANDSLENS(I) IS THE LENGTH OF HANDS(I,*)
|
80 REM--CARDLEN(I) IS THE LENGTH OF HANDCARDS(I,*)
|
||||||
90 GOTO 1500
|
90 GOTO 1500
|
||||||
100 REM--SUBROUTINE TO GET A CARD. RESULT IS PUT IN X.
|
100 REM--SUBROUTINE TO GET A CARD. RESULT IS PUT IN X.
|
||||||
110 IF C<51 THEN GOTO 230
|
110 IF C<51 THEN GOTO 230
|
||||||
120 PRINT "RESHUFFLING"
|
120 PRINT "RESHUFFLING"
|
||||||
130 FOR D=D TO 1 STEP -1
|
130 FOR D=D TO 1 STEP -1
|
||||||
140 C=C-1
|
140 C=C-1
|
||||||
150 DECK(C)=DISCARDECK(D)
|
150 DECK(C)=DISCARD(D)
|
||||||
160 NEXT
|
160 NEXT
|
||||||
170 FOR C1=52 TO C STEP -1
|
170 FOR C1=52 TO C STEP -1
|
||||||
180 C2=INT(RND(1)*(C1-C+1))+C
|
180 C2=INT(RND(1)*(C1-C+1))+C
|
||||||
190 C3=DECK(C2)
|
190 C3=DECK(C2)
|
||||||
200 DECK(C2)=DECK(C1)
|
200 DECK(C2)=DECK(C1)
|
||||||
210 DECK(C1)=C3
|
210 DECK(C1)=C3
|
||||||
220 NEXT
|
220 NEXT
|
||||||
230 X=DECK(C)
|
230 X=DECK(C)
|
||||||
240 C=C+1
|
240 C=C+1
|
||||||
@@ -41,16 +35,14 @@
|
|||||||
340 REM-- 22-32...HARD 11-21
|
340 REM-- 22-32...HARD 11-21
|
||||||
350 REM-- 33+....BUSTED
|
350 REM-- 33+....BUSTED
|
||||||
360 Q=0
|
360 Q=0
|
||||||
370 FOR Q2=1 TO HANDSLENS(I)
|
370 FOR Q2=1 TO CARDLEN(I)
|
||||||
380 X=HANDS(I,Q2)
|
380 X=HANDCARDS(I,Q2)
|
||||||
390 GOSUB 500
|
390 GOSUB 500
|
||||||
400 NEXT
|
400 NEXT
|
||||||
410 HANDTOTAL(I)=Q
|
410 HANDTOTAL(I)=Q
|
||||||
420 RETURN
|
420 RETURN
|
||||||
500 REM--SUBROUTINE TO ADD CARD X TO TOTAL Q.
|
500 REM--SUBROUTINE TO ADD CARD X TO TOTAL Q.
|
||||||
510 X1=X
|
510 X1=X: IF X1>10 THEN X1=10: REM SAME AS X1=10 MIN X
|
||||||
511 IF X1>10 THEN X1=10
|
|
||||||
512 REM SAME AS X1=10 MIN X
|
|
||||||
520 Q1=Q+X1
|
520 Q1=Q+X1
|
||||||
530 IF Q>=11 THEN GOTO 590
|
530 IF Q>=11 THEN GOTO 590
|
||||||
540 IF X>1 THEN GOTO 570
|
540 IF X>1 THEN GOTO 570
|
||||||
@@ -76,12 +68,10 @@
|
|||||||
820 H1=5
|
820 H1=5
|
||||||
830 GOSUB 1410
|
830 GOSUB 1410
|
||||||
840 H1=3
|
840 H1=3
|
||||||
850 REM --ON H GOTO 950,930--
|
850 ON H GOTO 950,930
|
||||||
851 IF H==1 THEN GOTO 950
|
|
||||||
852 IF H==2 THEN GOTO 930
|
|
||||||
860 GOSUB 100
|
860 GOSUB 100
|
||||||
870 BETS(I)=BETS(I)*2
|
870 BETS(I)=BETS(I)*2
|
||||||
880 PRINT "RECEIVED";
|
880 PRINT "RECEIVED A";
|
||||||
890 GOSUB 700
|
890 GOSUB 700
|
||||||
900 GOSUB 1100
|
900 GOSUB 1100
|
||||||
910 IF Q>0 THEN GOSUB 1300
|
910 IF Q>0 THEN GOSUB 1300
|
||||||
@@ -89,15 +79,15 @@
|
|||||||
930 GOSUB 1320
|
930 GOSUB 1320
|
||||||
940 RETURN
|
940 RETURN
|
||||||
950 GOSUB 100
|
950 GOSUB 100
|
||||||
960 PRINT "RECEIVED";
|
960 PRINT "RECEIVED A";
|
||||||
970 GOSUB 700
|
970 GOSUB 700
|
||||||
980 GOSUB 1100
|
980 GOSUB 1100
|
||||||
990 IF Q<0 THEN GOTO 940
|
990 IF Q<0 THEN GOTO 940
|
||||||
1000 PRINT "HIT";
|
1000 PRINT "HIT";
|
||||||
1010 GOTO 830
|
1010 GOTO 830
|
||||||
1100 REM--SUBROUTINE TO ADD A CARD TO ROW I
|
1100 REM--SUBROUTINE TO ADD A CARD TO ROW I
|
||||||
1110 HANDSLENS(I)=HANDSLENS(I)+1
|
1110 CARDLEN(I)=CARDLEN(I)+1
|
||||||
1120 HANDS(I,HANDSLENS(I))=X
|
1120 HANDCARDS(I,CARDLEN(I))=X
|
||||||
1130 Q=HANDTOTAL(I)
|
1130 Q=HANDTOTAL(I)
|
||||||
1140 GOSUB 500
|
1140 GOSUB 500
|
||||||
1150 HANDTOTAL(I)=Q
|
1150 HANDTOTAL(I)=Q
|
||||||
@@ -106,24 +96,22 @@
|
|||||||
1180 GOSUB 1200
|
1180 GOSUB 1200
|
||||||
1190 RETURN
|
1190 RETURN
|
||||||
1200 REM--SUBROUTINE TO DISCARD ROW I
|
1200 REM--SUBROUTINE TO DISCARD ROW I
|
||||||
1210 IF HANDSLENS(I)<>0 THEN GOTO 1230
|
1210 IF CARDLEN(I)<>0 THEN GOTO 1230
|
||||||
1220 RETURN
|
1220 RETURN
|
||||||
1230 D=D+1
|
1230 D=D+1
|
||||||
1240 DISCARDECK(D)=HANDS(I,HANDSLENS(I))
|
1240 DISCARD(D)=HANDCARDS(I,CARDLEN(I))
|
||||||
1250 HANDSLENS(I)=HANDSLENS(I)-1
|
1250 CARDLEN(I)=CARDLEN(I)-1
|
||||||
1260 GOTO 1210
|
1260 GOTO 1210
|
||||||
1300 REM--PRINTS TOTAL OF HAND I
|
1300 REM--PRINTS TOTAL OF HAND I
|
||||||
1310 PRINT
|
1310 PRINT
|
||||||
1320 AA=HANDTOTAL(I)
|
1320 AA=TRUNCATEHAND(HANDTOTAL(I))
|
||||||
1321 GOSUB 3400
|
1325 PRINT "TOTAL IS";AA
|
||||||
1325 PRINT "TOTAL IS ";AA
|
|
||||||
1330 RETURN
|
1330 RETURN
|
||||||
1400 REM--SUBROUTINE TO READ REPLY
|
1400 REM--SUBROUTINE TO READ REPLY
|
||||||
1410 REM ISTR DEFINED ELSEWHERE
|
1410 REM ISTR DEFINED ELSEWHERE
|
||||||
1420 INPUT HSTR
|
1420 INPUT HSTR: HSTR=LEFT(HSTR,1)
|
||||||
1421 HSTR=LEFT(HSTR,1)
|
|
||||||
1430 FOR H=1 TO H1 STEP 2
|
1430 FOR H=1 TO H1 STEP 2
|
||||||
1440 IF HSTR==MID(ISTR,H,1) THEN BREAKTO 1480
|
1440 IF HSTR==MID(ISTR,H,1) THEN GOTO 1480
|
||||||
1450 NEXT
|
1450 NEXT
|
||||||
1460 PRINT "TYPE ";MID(ISTR,1,H1-1);" OR ";MID(ISTR,H1,2);" PLEASE";
|
1460 PRINT "TYPE ";MID(ISTR,1,H1-1);" OR ";MID(ISTR,H1,2);" PLEASE";
|
||||||
1470 GOTO 1420
|
1470 GOTO 1420
|
||||||
@@ -131,12 +119,12 @@
|
|||||||
1490 RETURN
|
1490 RETURN
|
||||||
1500 REM--PROGRAM STARTS HERE
|
1500 REM--PROGRAM STARTS HERE
|
||||||
1510 REM--INITIALIZE
|
1510 REM--INITIALIZE
|
||||||
1520 DSTR=" A 2 3 4 5 6 7 8 9 10 J Q K"
|
1520 DSTR="N A 2 3 4 5 6 7N 8 9 10 J Q K"
|
||||||
1530 ISTR="H,S,D,/,"
|
1530 ISTR="H,S,D,/,"
|
||||||
1540 FOR I=1 TO 13
|
1540 FOR I=1 TO 13
|
||||||
1550 FOR J=4*I-3 TO 4*I
|
1550 FOR J=4*I-3 TO 4*I
|
||||||
1560 DISCARDECK(J)=I
|
1560 DISCARD(J)=I
|
||||||
1570 NEXT
|
1570 NEXT
|
||||||
1580 NEXT
|
1580 NEXT
|
||||||
1590 D=52
|
1590 D=52
|
||||||
1600 C=53
|
1600 C=53
|
||||||
@@ -157,218 +145,176 @@
|
|||||||
1750 PRINT "BLACKJACK, THE INITIAL RESPONSE SHOULD BE 'S'."
|
1750 PRINT "BLACKJACK, THE INITIAL RESPONSE SHOULD BE 'S'."
|
||||||
1760 PRINT "NUMBER OF PLAYERS";
|
1760 PRINT "NUMBER OF PLAYERS";
|
||||||
1770 INPUT N
|
1770 INPUT N
|
||||||
1771 ZARR=DIM(N)
|
|
||||||
1775 PRINT
|
1775 PRINT
|
||||||
1780 IF N<1 OR N>7 OR N>INT(N) THEN GOTO 1760
|
1780 IF N<1 OR N>7 OR N>INT(N) THEN GOTO 1760
|
||||||
1790 FOR I=1 TO 8
|
1790 FOR I=1 TO 8: PTOTAL(I)=0: NEXT
|
||||||
1791 PLRSUM(I)=0
|
|
||||||
1792 NEXT
|
|
||||||
1800 D1=N+1
|
1800 D1=N+1
|
||||||
1810 IF 2*D1+C>=52 THEN GOSUB 120
|
1810 IF 2*D1+C>=52 THEN GOSUB 120
|
||||||
1820 IF C==2 THEN C=C-1
|
1820 IF C==2 THEN C=C-1
|
||||||
1830 FOR I=1 TO N
|
1830 FOR I=1 TO N: ZARR(I)=0: NEXT
|
||||||
1831 ZARR(I)=0
|
1840 FOR I=1 TO 15: BETS(I)=0: NEXT
|
||||||
1832 NEXT
|
1850 FOR I=1 TO 15: HANDTOTAL(I)=0: NEXT
|
||||||
1840 FOR I=1 TO 15
|
1860 FOR I=1 TO 7: THISHNDFOR(I)=0: NEXT
|
||||||
1841 BETS(I)=0
|
1870 FOR I=1 TO 15: CARDLEN(I)=0: NEXT
|
||||||
1842 NEXT
|
|
||||||
1850 FOR I=1 TO 15
|
|
||||||
1851 HANDTOTAL(I)=0
|
|
||||||
1852 NEXT
|
|
||||||
1860 FOR I=1 TO 7
|
|
||||||
1861 PLRHNDSUM(I)=0
|
|
||||||
1862 NEXT
|
|
||||||
1870 FOR I=1 TO 15
|
|
||||||
1871 HANDSLENS(I)=0
|
|
||||||
1872 NEXT
|
|
||||||
1880 PRINT "BETS:"
|
1880 PRINT "BETS:"
|
||||||
1890 FOR I=1 TO N
|
1890 FOR I=1 TO N: PRINT "#";I;: INPUT ZARR(I): NEXT
|
||||||
1891 PRINT "# ";I;
|
|
||||||
1892 INPUT ZARR(I)
|
|
||||||
1893 NEXT
|
|
||||||
1900 FOR I=1 TO N
|
1900 FOR I=1 TO N
|
||||||
1910 IF ZARR(I)<=0 OR ZARR(I)>500 THEN BREAKTO 1880
|
1910 IF ZARR(I)<=0 OR ZARR(I)>500 THEN GOTO 1880
|
||||||
1920 BETS(I)=ZARR(I)
|
1920 BETS(I)=ZARR(I)
|
||||||
1930 NEXT
|
1930 NEXT
|
||||||
1940 PRINT "PLAYER ";
|
1940 PRINT "PLAYER";
|
||||||
1950 FOR I=1 TO N
|
1950 FOR I=1 TO N
|
||||||
1960 PRINT I;" ";
|
1960 PRINT I;" ";
|
||||||
1970 NEXT
|
1970 NEXT
|
||||||
1980 PRINT "DEALER"
|
1980 PRINT "DEALER"
|
||||||
1990 FOR J=1 TO 2
|
1990 FOR J=1 TO 2
|
||||||
2000 PRINT SPC(5);
|
2000 PRINT SPC(5);
|
||||||
2010 FOR I=1 TO D1
|
2010 FOR I=1 TO D1
|
||||||
2020 GOSUB 100
|
2020 GOSUB 100
|
||||||
2030 HANDS(I,J)=X
|
2030 HANDCARDS(I,J)=X
|
||||||
2040 IF J==1 OR I<=N THEN GOSUB 750
|
2040 IF J==1 OR I<=N THEN GOSUB 750
|
||||||
2050 NEXT
|
2050 NEXT
|
||||||
2060 PRINT
|
2060 PRINT
|
||||||
2070 NEXT
|
2070 NEXT
|
||||||
2080 FOR I=1 TO D1
|
2080 FOR I=1 TO D1
|
||||||
2090 HANDSLENS(I)=2
|
2090 CARDLEN(I)=2
|
||||||
2100 NEXT
|
2100 NEXT
|
||||||
2110 REM--TEST FOR INSURANCE
|
2110 REM--TEST FOR INSURANCE
|
||||||
2120 IF HANDS(D1,1)>1 THEN GOTO 2240
|
2120 IF HANDCARDS(D1,1)>1 THEN GOTO 2240
|
||||||
2130 PRINT "ANY INSURANCE";
|
2130 PRINT "ANY INSURANCE";
|
||||||
2140 INPUT HSTR
|
2140 INPUT HSTR
|
||||||
2150 IF LEFT(HSTR,1)<>"Y" THEN GOTO 2240
|
2150 IF LEFT(HSTR,1)<>"Y" THEN GOTO 2240
|
||||||
2160 PRINT "INSURANCE BETS"
|
2160 PRINT "INSURANCE BETS"
|
||||||
2170 FOR I=1 TO N
|
2170 FOR I=1 TO N: PRINT "#";I;: INPUT ZARR(I): NEXT
|
||||||
2171 PRINT "# ";I;
|
|
||||||
2172 INPUT ZARR(I)
|
|
||||||
2173 NEXT
|
|
||||||
2180 FOR I=1 TO N
|
2180 FOR I=1 TO N
|
||||||
2190 IF ZARR(I)<0 OR ZARR(I)>BETS(I)/2 THEN BREAKTO 2160
|
2190 IF ZARR(I)<0 OR ZARR(I)>BETS(I)/2 THEN GOTO 2160
|
||||||
2200 NEXT
|
2200 NEXT
|
||||||
2210 FOR I=1 TO N
|
2210 FOR I=1 TO N
|
||||||
2220 PLRHNDSUM(I)=ZARR(I)*(3*(-(HANDS(D1,2)>=10))-1)
|
2220 THISHNDFOR(I)=ZARR(I)*(3*(-(HANDCARDS(D1,2)>=10))-1)
|
||||||
2230 NEXT
|
2230 NEXT
|
||||||
2240 REM--TEST FOR DEALER BLACKJACK
|
2240 REM--TEST FOR DEALER BLACKJACK
|
||||||
2250 L1=1
|
2250 L1=1: L2=1
|
||||||
2251 L2=1
|
2252 IF HANDCARDS(D1,1)==1 AND HANDCARDS(D1,2)>9 THEN L1=0: L2=0
|
||||||
2252 IF HANDS(D1,1)==1 AND HANDS(D1,2)>9 THEN L1=0
|
2253 IF HANDCARDS(D1,2)==1 AND HANDCARDS(D1,1)>9 THEN L1=0: L2=0
|
||||||
2253 L2=0
|
2254 IF L1<>0 OR L2<>0 THEN GOTO 2320
|
||||||
2254 IF HANDS(D1,2)==1 AND HANDS(D1,1)>9 THEN L1=0
|
2260 PRINT:PRINT "DEALER HAS A";MID(DSTR,3*HANDCARDS(D1,2)-2,3);" IN THE HOLE ";
|
||||||
2255 L2=0
|
|
||||||
2256 IF L1<>0 OR L2<>0 THEN GOTO 2320
|
|
||||||
2260 PRINT
|
|
||||||
2261 PRINT "DEALER HAS";MID(DSTR,3*HANDS(D1,2)-2,3);" IN THE HOLE ";
|
|
||||||
2270 PRINT "FOR BLACKJACK"
|
2270 PRINT "FOR BLACKJACK"
|
||||||
2280 FOR I=1 TO D1
|
2280 FOR I=1 TO D1
|
||||||
2290 GOSUB 300
|
2290 GOSUB 300
|
||||||
2300 NEXT
|
2300 NEXT
|
||||||
2310 GOTO 3140
|
2310 GOTO 3140
|
||||||
2320 REM--NO DEALER BLACKJACK
|
2320 REM--NO DEALER BLACKJACK
|
||||||
2330 IF HANDS(D1,1)>1 AND HANDS(D1,1)<10 THEN GOTO 2350
|
2330 IF HANDCARDS(D1,1)>1 AND HANDCARDS(D1,1)<10 THEN GOTO 2350
|
||||||
2340 PRINT
|
2340 PRINT:PRINT "NO DEALER BLACKJACK."
|
||||||
2341 PRINT "NO DEALER BLACKJACK."
|
|
||||||
2350 REM--NOW PLAY THE HANDS
|
2350 REM--NOW PLAY THE HANDS
|
||||||
2360 FOR I=1 TO N
|
2360 FOR I=1 TO N
|
||||||
2370 PRINT "PLAYER ";I;
|
2370 PRINT "PLAYER";I;
|
||||||
2380 H1=7
|
2380 H1=7
|
||||||
2390 GOSUB 1410
|
2390 GOSUB 1410
|
||||||
2400 REM--ON H GOTO 2550,2410,2510,2600--
|
2400 ON H GOTO 2550,2410,2510,2600
|
||||||
2401 IF H==1 THEN GOTO 2550
|
2410 REM--PLAYER WANTS TO STAND
|
||||||
2402 IF H==2 THEN GOTO 2410
|
2420 GOSUB 300
|
||||||
2403 IF H==3 THEN GOTO 2510
|
2430 IF HANDTOTAL(I)<>21 THEN GOTO 2490
|
||||||
2404 IF H==4 THEN GOTO 2600
|
2440 PRINT "BLACKJACK"
|
||||||
2410 REM--PLAYER WANTS TO STAND
|
2450 THISHNDFOR(I)=THISHNDFOR(I)+1.5*BETS(I)
|
||||||
2420 GOSUB 300
|
2460 BETS(I)=0
|
||||||
2430 IF HANDTOTAL(I)<>21 THEN GOTO 2490
|
2470 GOSUB 1200
|
||||||
2440 PRINT "BLACKJACK"
|
2480 GOTO 2900
|
||||||
2450 PLRHNDSUM(I)=PLRHNDSUM(I)+1.5*BETS(I)
|
2490 GOSUB 1320
|
||||||
2460 BETS(I)=0
|
2500 GOTO 2900
|
||||||
2470 GOSUB 1200
|
2510 REM--PLAYER WANTS TO DOUBLE DOWN
|
||||||
2480 GOTO 2900
|
2520 GOSUB 300
|
||||||
2490 GOSUB 1320
|
2530 GOSUB 860
|
||||||
2500 GOTO 2900
|
2540 GOTO 2900
|
||||||
2510 REM--PLAYER WANTS TO DOUBLE DOWN
|
2550 REM--PLAYER WANTS TO BE HIT
|
||||||
2520 GOSUB 300
|
2560 GOSUB 300
|
||||||
2530 GOSUB 860
|
2570 H1=3
|
||||||
2540 GOTO 2900
|
2580 GOSUB 950
|
||||||
2550 REM--PLAYER WANTS TO BE HIT
|
2590 GOTO 2900
|
||||||
2560 GOSUB 300
|
2600 REM--PLAYER WANTS TO SPLIT
|
||||||
2570 H1=3
|
2610 L1=HANDCARDS(I,1): IF HANDCARDS(I,1)>10 THEN L1=10
|
||||||
2580 GOSUB 950
|
2612 L2=HANDCARDS(I,2): IF HANDCARDS(I,2)>10 THEN L2=10
|
||||||
2590 GOTO 2900
|
2614 IF L1==L2 THEN GOTO 2640
|
||||||
2600 REM--PLAYER WANTS TO SPLIT
|
2620 PRINT "SPLITTING NOT ALLOWED."
|
||||||
2610 L1=HANDS(I,1)
|
2630 GOTO 2370
|
||||||
2611 IF HANDS(I,1)>10 THEN L1=10
|
2640 REM--PLAY OUT SPLIT
|
||||||
2612 L2=HANDS(I,2)
|
2650 I1=I+D1
|
||||||
2613 IF HANDS(I,2)>10 THEN L2=10
|
2660 CARDLEN(I1)=2
|
||||||
2614 IF L1==L2 THEN GOTO 2640
|
2670 HANDCARDS(I1,1)=HANDCARDS(I,2)
|
||||||
2620 PRINT "SPLITTING NOT ALLOWED."
|
2680 BETS(I+D1)=BETS(I)
|
||||||
2630 GOTO 2370
|
2690 GOSUB 100
|
||||||
2640 REM--PLAY OUT SPLIT
|
2700 PRINT "FIRST HAND RECEIVES A";
|
||||||
2650 I1=I+D1
|
2710 GOSUB 700
|
||||||
2660 HANDSLENS(I1)=2
|
2720 HANDCARDS(I,2)=X
|
||||||
2670 HANDS(I1,1)=HANDS(I,2)
|
2730 GOSUB 300
|
||||||
2680 BETS(I+D1)=BETS(I)
|
2740 PRINT
|
||||||
2690 GOSUB 100
|
2750 GOSUB 100
|
||||||
2700 PRINT "FIRST HAND RECEIVES A";
|
2760 PRINT "SECOND HAND RECEIVES A";
|
||||||
2710 GOSUB 700
|
2770 I=I1
|
||||||
2720 HANDS(I,2)=X
|
2780 GOSUB 700
|
||||||
2730 GOSUB 300
|
2790 HANDCARDS(I,2)=X
|
||||||
2740 PRINT
|
2800 GOSUB 300
|
||||||
2750 GOSUB 100
|
2810 PRINT
|
||||||
2760 PRINT "SECOND HAND RECEIVES A";
|
2820 I=I1-D1
|
||||||
2770 I=I1
|
2830 IF HANDCARDS(I,1)==1 THEN GOTO 2900
|
||||||
2780 GOSUB 700
|
2840 REM--NOW PLAY THE TWO HANDS
|
||||||
2790 HANDS(I,2)=X
|
2850 PRINT "HAND";1-(I>D1);
|
||||||
2800 GOSUB 300
|
2860 GOSUB 800
|
||||||
2810 PRINT
|
2870 I=I+D1
|
||||||
2820 I=I1-D1
|
2880 IF I==I1 THEN GOTO 2850
|
||||||
2830 IF HANDS(I,1)==1 THEN GOTO 2900
|
2890 I=I1-D1
|
||||||
2840 REM--NOW PLAY THE TWO HANDS
|
|
||||||
2850 PRINT "HAND ";(1-(I>D1));
|
|
||||||
2860 GOSUB 800
|
|
||||||
2870 I=I+D1
|
|
||||||
2880 IF I==I1 THEN GOTO 2850
|
|
||||||
2890 I=I1-D1
|
|
||||||
2900 NEXT
|
2900 NEXT
|
||||||
2910 GOSUB 300
|
2910 GOSUB 300
|
||||||
2920 REM--TEST FOR PLAYING DEALER'S HAND
|
2920 REM--TEST FOR PLAYING DEALER'S HAND
|
||||||
2930 FOR I=1 TO N
|
2930 FOR I=1 TO N
|
||||||
2940 IF HANDSLENS(I)>0 OR HANDSLENS(I+D1)>0 THEN BREAKTO 3010
|
2940 IF CARDLEN(I)>0 OR CARDLEN(I+D1)>0 THEN GOTO 3010
|
||||||
2950 NEXT
|
2950 NEXT
|
||||||
2960 PRINT "DEALER HAD A";
|
2960 PRINT "DEALER HAD A";
|
||||||
2970 X=HANDS(D1,2)
|
2970 X=HANDCARDS(D1,2)
|
||||||
2980 GOSUB 700
|
2980 GOSUB 700
|
||||||
2990 PRINT " CONCEALED."
|
2990 PRINT " CONCEALED."
|
||||||
3000 GOTO 3140
|
3000 GOTO 3140
|
||||||
3010 PRINT "DEALER HAS";MID(DSTR,3*HANDS(D1,2)-2,3);" CONCEALED ";
|
3010 PRINT "DEALER HAS A";MID(DSTR,3*HANDCARDS(D1,2)-2,3);" CONCEALED ";
|
||||||
3020 I=D1
|
3020 I=D1
|
||||||
3030 AA=HANDTOTAL(I)
|
3030 AA=TRUNCATEHAND(HANDTOTAL(I))
|
||||||
3031 GOSUB 3400
|
3035 PRINT "FOR A TOTAL OF";AA
|
||||||
3035 PRINT "FOR A TOTAL OF ";AA
|
|
||||||
3040 IF AA>16 THEN GOTO 3130
|
3040 IF AA>16 THEN GOTO 3130
|
||||||
3050 PRINT "DRAWS";
|
3050 PRINT "DRAWS";
|
||||||
3060 GOSUB 100
|
3060 GOSUB 100
|
||||||
3070 GOSUB 750
|
3070 GOSUB 750
|
||||||
3080 GOSUB 1100
|
3080 GOSUB 1100
|
||||||
3090 AA=Q
|
3090 AA=TRUNCATEHAND(Q)
|
||||||
3091 GOSUB 3400
|
|
||||||
3095 IF Q>0 AND AA<17 THEN GOTO 3060
|
3095 IF Q>0 AND AA<17 THEN GOTO 3060
|
||||||
3100 HANDTOTAL(I)=(Q-(Q<0)/2)
|
3100 HANDTOTAL(I)=Q-(Q<0)/2
|
||||||
3110 IF Q<0 THEN GOTO 3140
|
3110 IF Q<0 THEN GOTO 3140
|
||||||
3120 AA=Q
|
3120 AA=TRUNCATEHAND(Q)
|
||||||
3121 GOSUB 3400
|
3125 PRINT "---TOTAL IS";AA
|
||||||
3125 PRINT "---TOTAL IS ";AA
|
|
||||||
3130 PRINT
|
3130 PRINT
|
||||||
3140 REM--TALLY THE RESULT
|
3140 REM--TALLY THE RESULT
|
||||||
3150 REM
|
3150 REM
|
||||||
3160 ZSTR="LOSES PUSHES WINS "
|
3160 ZSTR="LOSES PUSHES WINS "
|
||||||
3165 PRINT
|
3165 PRINT
|
||||||
3170 FOR I=1 TO N
|
3170 FOR I=1 TO N
|
||||||
3180 AA=HANDTOTAL(I)
|
3180 AA=TRUNCATEHAND(HANDTOTAL(I))
|
||||||
3181 GOSUB 3400
|
3182 AB=TRUNCATEHAND(HANDTOTAL(I+D1))
|
||||||
3182 AB=HANDTOTAL(I+D1)
|
3184 AC=TRUNCATEHAND(HANDTOTAL(D1))
|
||||||
3183 GOSUB 3410
|
3186 THISHNDFOR(I)=THISHNDFOR(I)+BETS(I)*SGN(AA-AC)+BETS(I+D1)*SGN(AB-AC)
|
||||||
3184 AC=HANDTOTAL(D1)
|
3188 BETS(I+D1)=0
|
||||||
3185 GOSUB 3420
|
3200 PRINT "PLAYER";I;
|
||||||
3186 PLRHNDSUM(I)=PLRHNDSUM(I)+BETS(I)*SGN(AA-AC)+BETS(I+D1)*SGN(AB-AC)
|
3210 PRINT MID(ZSTR,SGN(THISHNDFOR(I))*6+7,6);" ";
|
||||||
3188 BETS(I+D1)=0
|
3220 IF THISHNDFOR(I)<>0 THEN GOTO 3250
|
||||||
3200 PRINT "PLAYER ";I;
|
3230 PRINT " ";
|
||||||
3210 PRINT MID(ZSTR,SGN(PLRHNDSUM(I))*6+7,6);" ";
|
3240 GOTO 3260
|
||||||
3220 IF PLRHNDSUM(I)<>0 THEN GOTO 3250
|
3250 PRINT ABS(THISHNDFOR(I));
|
||||||
3230 PRINT " ";
|
3260 PTOTAL(I)=PTOTAL(I)+THISHNDFOR(I)
|
||||||
3240 GOTO 3260
|
3270 PRINT "TOTAL=";PTOTAL(I)
|
||||||
3250 PRINT ABS(PLRHNDSUM(I));
|
3280 GOSUB 1200
|
||||||
3260 PLRSUM(I)=PLRSUM(I)+PLRHNDSUM(I)
|
3290 PTOTAL(D1)=PTOTAL(D1)-THISHNDFOR(I)
|
||||||
3270 PRINT "; TOTAL= ";PLRSUM(I)
|
3300 I=I+D1
|
||||||
3280 GOSUB 1200
|
3310 GOSUB 1200
|
||||||
3290 PLRSUM(D1)=PLRSUM(D1)-PLRHNDSUM(I)
|
3320 I=I-D1
|
||||||
3300 I=I+D1
|
|
||||||
3310 GOSUB 1200
|
|
||||||
3320 I=I-D1
|
|
||||||
3330 NEXT
|
3330 NEXT
|
||||||
3340 PRINT "DEALER'S TOTAL= ";PLRSUM(D1)
|
3340 PRINT "DEALER'S TOTAL=";PTOTAL(D1)
|
||||||
3345 PRINT
|
3345 PRINT
|
||||||
3350 GOSUB 1200
|
3350 GOSUB 1200
|
||||||
3360 GOTO 1810
|
3360 GOTO 1810
|
||||||
3400 AA=AA+11*(AA>=22)
|
|
||||||
3401 RETURN
|
|
||||||
3410 AB=AB+11*(AB>=22)
|
|
||||||
3411 RETURN
|
|
||||||
3420 AC=AC+11*(AC>=22)
|
|
||||||
3421 RETURN
|
|
||||||
|
|||||||
1
assets/tbas/doc/statements.tex
Normal file
1
assets/tbas/doc/statements.tex
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -8,7 +8,8 @@ line =
|
|||||||
linenumber = digits ;
|
linenumber = digits ;
|
||||||
|
|
||||||
stmt =
|
stmt =
|
||||||
"IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
|
"REM" , ? anything ?
|
||||||
|
| "IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
|
||||||
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
|
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
|
||||||
| "ON" , expr_sans_asgn , ("GOTO" | "GOSUB") , expr_sans_asgn , {"," , expr_sans_asgn}
|
| "ON" , expr_sans_asgn , ("GOTO" | "GOSUB") , expr_sans_asgn , {"," , expr_sans_asgn}
|
||||||
| "(" , stmt , ")"
|
| "(" , stmt , ")"
|
||||||
@@ -37,7 +37,6 @@ digraph g {
|
|||||||
LITERAL -> PAREN [label="()[]"]
|
LITERAL -> PAREN [label="()[]"]
|
||||||
LITERAL -> limbo [label=_]
|
LITERAL -> limbo [label=_]
|
||||||
LITERAL -> SEP [label=","]
|
LITERAL -> SEP [label=","]
|
||||||
LITERAL -> NUMBER [label="0..9"]
|
|
||||||
LITERAL -> OPERATOR [label="^*/+->=<"]
|
LITERAL -> OPERATOR [label="^*/+->=<"]
|
||||||
LITERAL -> LITERAL [label=otherwise]
|
LITERAL -> LITERAL [label=otherwise]
|
||||||
|
|
||||||
@@ -78,7 +78,8 @@ bF._parseTokens = function(lnum, tokens, states) {
|
|||||||
|
|
||||||
/** Parses following EBNF rule:
|
/** Parses following EBNF rule:
|
||||||
stmt =
|
stmt =
|
||||||
"IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
|
"REM" , ? anything ?
|
||||||
|
| "IF" , expr_sans_asgn , "THEN" , stmt , ["ELSE" , stmt]
|
||||||
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
|
| "DEFUN" , [ident] , "(" , [ident , {" , " , ident}] , ")" , "=" , expr
|
||||||
| "ON" , expr_sans_asgn , ident , expr_sans_asgn , {"," , expr_sans_asgn}
|
| "ON" , expr_sans_asgn , ident , expr_sans_asgn , {"," , expr_sans_asgn}
|
||||||
| "(" , stmt , ")"
|
| "(" , stmt , ")"
|
||||||
@@ -90,6 +91,14 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
|
|||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
|
// case for: single word (e.g. NEXT for FOR loop)
|
||||||
|
if (tokens.length == 1 && states.length == 1) {
|
||||||
|
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
|
||||||
|
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
let headTkn = tokens[0].toUpperCase();
|
let headTkn = tokens[0].toUpperCase();
|
||||||
let headSta = states[0];
|
let headSta = states[0];
|
||||||
|
|
||||||
@@ -98,11 +107,8 @@ bF._parseStmt = function(lnum, tokens, states, recDepth) {
|
|||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
// case for: single word (e.g. NEXT for FOR loop)
|
// case for: "REM" , ? anything ?
|
||||||
if (tokens.length == 1 && states.length == 1) {
|
if (headTkn == "REM" && headSta != "qot") return;
|
||||||
bF.parserPrintdbgline('$', "Single Word Function Call", lnum, recDepth);
|
|
||||||
return bF._parseLit(lnum, tokens, states, recDepth + 1, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user