From 41bdd30f804287760ea64a66c11031c9fe7f3a3f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 2 Dec 2020 21:55:13 +0900 Subject: [PATCH] basic: test prg sqrt.bas --- assets/blackjack.bas | 381 +++++++++++++++++++++++++++++++++++++++++++ assets/sqrt.bas | 7 + 2 files changed, 388 insertions(+) create mode 100644 assets/blackjack.bas create mode 100644 assets/sqrt.bas diff --git a/assets/blackjack.bas b/assets/blackjack.bas new file mode 100644 index 0000000..5cff2c2 --- /dev/null +++ b/assets/blackjack.bas @@ -0,0 +1,381 @@ +1 OPTIONBASE 1 +2 PRINT SPC(31);"BLACK JACK" +4 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +6 PRINT +7 PRINT +8 PRINT +10 REM DEFUN A(Q)=Q+11*(Q>=22) +20 HANDS=DIM(15,12) +21 HANDTOTAL=DIM(15) +22 DECK=DIM(52) +23 DISCARDECK=DIM(52) +24 PLRSUM=DIM(8) +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 +80 REM--HANDSLENS(I) IS THE LENGTH OF HANDS(I,*) +90 GOTO 1500 +100 REM--SUBROUTINE TO GET A CARD. RESULT IS PUT IN X. +110 IF C<51 THEN GOTO 230 +120 PRINT "RESHUFFLING" +130 FOR DI=D TO 1 +140 C=C-1 +150 DECK(C)=DISCARDECK(DI) +160 NEXT +170 FOR C1=52 TO C +180 C2=INT(RND(1)*(C1-C+1))+C +190 C3=DECK(C2) +200 DECK(C2)=DECK(C1) +210 DECK(C1)=C3 +220 NEXT +230 X=DECK(C) +240 C=C+1 +250 RETURN +300 REM--SUBROUTINE TO EVALUATE HAND I. TOTAL IS PUT INTO +310 REM--HANDTOTAL(I). TOTALS HAVE THE FOLLOWING MEANING: +320 REM-- 2-10...HARD 2-10 +330 REM-- 11-21...SOFT 11-21 +340 REM-- 22-32...HARD 11-21 +350 REM-- 33+....BUSTED +360 Q=0 +370 FOR Q2=1 TO HANDSLENS(I) +380 X=HANDS(I,Q2) +390 GOSUB 500 +400 NEXT +410 HANDTOTAL(I)=Q +420 RETURN +500 REM--SUBROUTINE TO ADD CARD X TO TOTAL Q. +510 X1=X +511 IF X1>10 THEN X1=10 +512 REM SAME AS X1=10 MIN X +520 Q1=Q+X1 +530 IF Q>=11 THEN GOTO 590 +540 IF X>1 THEN GOTO 570 +550 Q=Q+11 +560 RETURN +570 Q=Q1-11*(Q1>=11) +580 RETURN +590 Q=Q1-(Q<=21 AND Q1>21) +600 IF Q<33 THEN GOTO 620 +610 Q=-1 +620 RETURN +700 REM--CARD PRINTING SUBROUTINE +710 REM DSTR DEFINED ELSEWHERE +720 PRINT MID(DSTR,3*X-2,3); +730 PRINT " "; +740 RETURN +750 REM--ALTERNATIVE PRINTING ROUTINE +760 PRINT " ";MID(DSTR,3*X-1,2); +770 PRINT " "; +780 RETURN +800 REM--SUBROUTINE TO PLAY OUT A HAND. +810 REM--NO SPLITTING OR BLACKJACKS ALLOWED +820 H1=5 +830 GOSUB 1410 +840 H1=3 +850 REM --ON H GOTO 950,930-- +851 IF H==1 THEN GOTO 950 +852 IF H==2 THEN GOTO 930 +860 GOSUB 100 +870 BETS(I)=BETS(I)*2 +880 PRINT "RECEIVED"; +890 GOSUB 700 +900 GOSUB 1100 +910 IF Q>0 THEN GOSUB 1300 +920 RETURN +930 GOSUB 1320 +940 RETURN +950 GOSUB 100 +960 PRINT "RECEIVED"; +970 GOSUB 700 +980 GOSUB 1100 +990 IF Q<0 THEN GOTO 940 +1000 PRINT "HIT"; +1010 GOTO 830 +1100 REM--SUBROUTINE TO ADD A CARD TO ROW I +1110 HANDSLENS(I)=HANDSLENS(I)+1 +1120 HANDS(I,HANDSLENS(I))=X +1130 Q=HANDTOTAL(I) +1140 GOSUB 500 +1150 HANDTOTAL(I)=Q +1160 IF Q>=0 THEN GOTO 1190 +1170 PRINT "...BUSTED" +1180 GOSUB 1200 +1190 RETURN +1200 REM--SUBROUTINE TO DISCARD ROW I +1210 IF HANDSLENS(I)<>0 THEN GOTO 1230 +1220 RETURN +1230 D=D+1 +1240 DISCARDECK(D)=HANDS(I,HANDSLENS(I)) +1250 HANDSLENS(I)=HANDSLENS(I)-1 +1260 GOTO 1210 +1300 REM--PRINTS TOTAL OF HAND I +1310 PRINT +1320 AA=HANDTOTAL(I) +1321 GOSUB 3400 +1325 PRINT "TOTAL IS ";AA +1330 RETURN +1400 REM--SUBROUTINE TO READ REPLY +1410 REM ISTR DEFINED ELSEWHERE +1420 INPUT HSTR +1421 HSTR=LEFT(HSTR,1) +1430 FOR H=1 TO H1 STEP 2 +1440 IF HSTR==MID(ISTR,H,1) THEN GOTO 1480 +1450 NEXT +1460 PRINT "TYPE ";MID(ISTR,1,H1-1);" OR ";MID(ISTR,H1,2);" PLEASE"; +1470 GOTO 1420 +1480 H=(H+1)/2 +1490 RETURN +1500 REM--PROGRAM STARTS HERE +1510 REM--INITIALIZE +1520 DSTR="N A 2 3 4 5 6 7N 8 9 10 J Q K" +1530 ISTR="H,S,D,/," +1540 FOR I=1 TO 13 +1550 FOR J=4*I-3 TO 4*I +1560 DISCARDECK(J)=I +1570 NEXT +1580 NEXT +1590 D=52 +1600 C=53 +1610 PRINT "DO YOU WANT INSTRUCTIONS"; +1620 INPUT HSTR +1630 IF LEFT(HSTR,1)=="N" OR LEFT(HSTR,1)=="n" THEN GOTO 1760 +1640 PRINT "THIS IS THE GAME OF 21. AS MANY AS 7 PLAYERS MAY PLAY THE" +1650 PRINT "GAME. ON EACH DEAL, BETS WILL BE ASKED FOR, AND THE" +1660 PRINT "PLAYERS' BETS SHOULD BE TYPED IN. THE CARDS WILL THEN BE" +1670 PRINT "DEALT, AND EACH PLAYER IN TURN PLAYS HIS HAND. THE" +1680 PRINT "FIRST RESPONSE SHOULD BE EITHER 'D', INDICATING THAT THE" +1690 PRINT "PLAYER IS DOUBLING DOWN, 'S', INDICATING THAT HE IS" +1700 PRINT "STANDING, 'H', INDICATING HE WANTS ANOTHER CARD, OR '/'," +1710 PRINT "INDICATING THAT HE WANTS TO SPLIT HIS CARDS. AFTER THE" +1720 PRINT "INITIAL RESPONSE, ALL FURTHER RESPONSES SHOULD BE 'S' OR" +1730 PRINT "'H', UNLESS THE CARDS WERE SPLIT, IN WHICH CASE DOUBLING" +1740 PRINT "DOWN IS AGAIN PERMITTED. IN ORDER TO COLLECT FOR" +1750 PRINT "BLACKJACK, THE INITIAL RESPONSE SHOULD BE 'S'." +1760 PRINT "NUMBER OF PLAYERS"; +1770 INPUT N +1771 ZARR=DIM(N) +1775 PRINT +1780 IF N<1 OR N>7 OR N>INT(N) THEN GOTO 1760 +1790 FOR I=1 TO 8 +1791 PLRSUM(I)=0 +1792 NEXT +1800 D1=N+1 +1810 IF 2*D1+C>=52 THEN GOSUB 120 +1820 IF C==2 THEN C=C-1 +1830 FOR I=1 TO N +1831 ZARR(I)=0 +1832 NEXT +1840 FOR I=1 TO 15 +1841 BETS(I)=0 +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:" +1890 FOR I=1 TO N +1891 PRINT "# ";I; +1892 INPUT ZARR(I) +1893 NEXT +1900 FOR I=1 TO N +1910 IF ZARR(I)<=0 OR ZARR(I)>500 THEN GOTO 1880 +1920 BETS(I)=ZARR(I) +1930 NEXT +1940 PRINT "PLAYER "; +1950 FOR I=1 TO N +1960 PRINT I;" "; +1970 NEXT +1980 PRINT "DEALER" +1990 FOR J=1 TO 2 +2000 PRINT SPC(5); +2010 FOR I=1 TO D1 +2020 GOSUB 100 +2030 HANDS(I,J)=X +2040 IF J==1 OR I<=N THEN GOSUB 750 +2050 NEXT +2060 PRINT +2070 NEXT +2080 FOR I=1 TO D1 +2090 HANDSLENS(I)=2 +2100 NEXT +2110 REM--TEST FOR INSURANCE +2120 IF HANDS(D1,1)>1 THEN GOTO 2240 +2130 PRINT "ANY INSURANCE"; +2140 INPUT HSTR +2150 IF LEFT(HSTR,1)<>"Y" THEN GOTO 2240 +2160 PRINT "INSURANCE BETS" +2170 FOR I=1 TO N +2171 PRINT "# ";I; +2172 INPUT ZARR(I) +2173 NEXT +2180 FOR I=1 TO N +2190 IF ZARR(I)<0 OR ZARR(I)>BETS(I)/2 THEN GOTO 2160 +2200 NEXT +2210 FOR I=1 TO N +2220 PLRHNDSUM(I)=ZARR(I)*(3*(-(HANDS(D1,2)>=10))-1) +2230 NEXT +2240 REM--TEST FOR DEALER BLACKJACK +2250 L1=1 +2251 L2=1 +2252 IF HANDS(D1,1)==1 AND HANDS(D1,2)>9 THEN L1=0 +2253 L2=0 +2254 IF HANDS(D1,2)==1 AND HANDS(D1,1)>9 THEN L1=0 +2255 L2=0 +2256 IF L1<>0 OR L2<>0 THEN GOTO 2320 +2260 PRINT +2261 PRINT "DEALER HAS A";MID(DSTR,3*HANDS(D1,2)-2,3);" IN THE HOLE "; +2270 PRINT "FOR BLACKJACK" +2280 FOR I=1 TO D1 +2290 GOSUB 300 +2300 NEXT +2310 GOTO 3140 +2320 REM--NO DEALER BLACKJACK +2330 IF HANDS(D1,1)>1 AND HANDS(D1,1)<10 THEN GOTO 2350 +2340 PRINT +2341 PRINT "NO DEALER BLACKJACK." +2350 REM--NOW PLAY THE HANDS +2360 REM--FOR I=1 TO N-- +2361 I=1 +2370 PRINT "PLAYER ";I; +2380 H1=7 +2390 GOSUB 1410 +2400 REM--ON H GOTO 2550,2410,2510,2600-- +2401 IF H==1 THEN GOTO 2550 +2402 IF H==2 THEN GOTO 2410 +2403 IF H==3 THEN GOTO 2510 +2404 IF H==4 THEN GOTO 2600 +2410 REM--PLAYER WANTS TO STAND +2420 GOSUB 300 +2430 IF HANDTOTAL(I)<>21 THEN GOTO 2490 +2440 PRINT "BLACKJACK" +2450 PLRHNDSUM(I)=PLRHNDSUM(I)+1.5*BETS(I) +2460 BETS(I)=0 +2470 GOSUB 1200 +2480 GOTO 2900 +2490 GOSUB 1320 +2500 GOTO 2900 +2510 REM--PLAYER WANTS TO DOUBLE DOWN +2520 GOSUB 300 +2530 GOSUB 860 +2540 GOTO 2900 +2550 REM--PLAYER WANTS TO BE HIT +2560 GOSUB 300 +2570 H1=3 +2580 GOSUB 950 +2590 GOTO 2900 +2600 REM--PLAYER WANTS TO SPLIT +2610 L1=HANDS(I,1) +2611 IF HANDS(I,1)>10 THEN L1=10 +2612 L2=HANDS(I,2) +2613 IF HANDS(I,2)>10 THEN L2=10 +2614 IF L1==L2 THEN GOTO 2640 +2620 PRINT "SPLITTING NOT ALLOWED." +2630 GOTO 2370 +2640 REM--PLAY OUT SPLIT +2650 I1=I+D1 +2660 HANDSLENS(I1)=2 +2670 HANDS(I1,1)=HANDS(I,2) +2680 BETS(I+D1)=BETS(I) +2690 GOSUB 100 +2700 PRINT "FIRST HAND RECEIVES A"; +2710 GOSUB 700 +2720 HANDS(I,2)=X +2730 GOSUB 300 +2740 PRINT +2750 GOSUB 100 +2760 PRINT "SECOND HAND RECEIVES A"; +2770 I=I1 +2780 GOSUB 700 +2790 HANDS(I,2)=X +2800 GOSUB 300 +2810 PRINT +2820 I=I1-D1 +2830 IF HANDS(I,1)==1 THEN GOTO 2900 +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 REM--NEXT I-- +2901 I=I+1 +2902 IF I<=N THEN GOTO 2370 +2910 GOSUB 300 +2920 REM--TEST FOR PLAYING DEALER'S HAND +2930 FOR I=1 TO N +2940 IF HANDSLENS(I)>0 OR HANDSLENS(I+D1)>0 THEN GOTO 3010 +2950 NEXT +2960 PRINT "DEALER HAD A"; +2970 X=HANDS(D1,2) +2980 GOSUB 700 +2990 PRINT " CONCEALED." +3000 GOTO 3140 +3010 PRINT "DEALER HAS A";MID(DSTR,3*HANDS(D1,2)-2,3);" CONCEALED "; +3020 I=D1 +3030 AA=HANDTOTAL(I) +3031 GOSUB 3400 +3035 PRINT "FOR A TOTAL OF ";AA +3040 IF AA>16 THEN GOTO 3130 +3050 PRINT "DRAWS"; +3060 GOSUB 100 +3070 GOSUB 750 +3080 GOSUB 1100 +3090 AA=Q +3091 GOSUB 3400 +3095 IF Q>0 AND AA<17 THEN GOTO 3060 +3100 HANDTOTAL(I)=Q-(Q<0)/2 +3110 IF Q<0 THEN GOTO 3140 +3120 AA=Q +3121 GOSUB 3400 +3125 PRINT "---TOTAL IS ";AA +3130 PRINT +3140 REM--TALLY THE RESULT +3150 REM +3160 ZSTR="LOSES PUSHES WINS " +3165 PRINT +3170 REM--FOR I=1 TO N-- +3171 I=1 +3180 AA=HANDTOTAL(I) +3181 GOSUB 3400 +3182 AB=HANDTOTAL(I+D1) +3183 GOSUB 3410 +3184 AC=HANDTOTAL(D1) +3185 GOSUB 3420 +3186 PLRHNDSUM(I)=PLRHNDSUM(I)+BETS(I)*SGN(AA-AC)+BETS(I+D1)*SGN(AB-AC) +3188 BETS(I+D1)=0 +3200 PRINT "PLAYER ";I; +3210 PRINT MID(ZSTR,SGN(PLRHNDSUM(I))*6+7,6);" "; +3220 IF PLRHNDSUM(I)<>0 THEN GOTO 3250 +3230 PRINT " "; +3240 GOTO 3260 +3250 PRINT ABS(PLRHNDSUM(I)); +3260 PLRSUM(I)=PLRSUM(I)+PLRHNDSUM(I) +3270 PRINT "TOTAL= ";PLRSUM(I) +3280 GOSUB 1200 +3290 PLRSUM(D1)=PLRSUM(D1)-PLRHNDSUM(I) +3300 I=I+D1 +3310 GOSUB 1200 +3320 I=I-D1 +3330 REM--NEXT I-- +3331 I=I+1 +3332 IF I<=N THEN GOTO 3180 +3340 PRINT "DEALER'S TOTAL= ";PLRSUM(D1) +3345 PRINT +3350 GOSUB 1200 +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 diff --git a/assets/sqrt.bas b/assets/sqrt.bas new file mode 100644 index 0000000..b159784 --- /dev/null +++ b/assets/sqrt.bas @@ -0,0 +1,7 @@ +1 REM Calculates a square root using newtonian method +20 INPUT X +30 Y = 0.5 * X +40 Z = Y +50 Y = Y-(((Y^2)-X)/(2*Y)) +60 IF Z <> Y THEN GOTO 40 +100 PRINT "Square root of ";X;" is approximately ";Y