home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1982-09-01 | 8.6 KB | 241 lines |
- 10 REM Game of NIM. Author: J. E. Steitz 2-14-82
- 20 OPTION BASE 1
- 30 DEFINT P,I-N
- 40 DIM PILE(13)
- 50 CLS:LOCATE 5,1
- 60 PRINT"*******************************************************************************"
- 70 PRINT"*******************************************************************************"
- 80 PRINT"** **"
- 90 PRINT"** **"
- 100 PRINT"** **"
- 110 PRINT"** **"
- 120 PRINT"** If you ";:COLOR 0,7:PRINT"DO";:COLOR 7,0
- 130 PRINT" want instructions, just hit RETURN (";CHR$(17);CHR$(196);CHR$(217);") key. **"
- 140 PRINT"*******************************************************************************"
- 150 PRINT"*******************************************************************************"
- 160 LOCATE 8,27
- 170 PRINT"Welcome to the game of NIM."
- 180 LOCATE 10,15
- 190 INPUT"If you do NOT want instructions, type N or NO: ",A$
- 200 IF A$ = "N" OR A$ = "n" OR A$="NO" OR A$="no" THEN 350
- 210 CLS:PRINT" The Game of NIM -- By J. E. Steitz 2-16-82"
- 220 PRINT:PRINT"The game of NIM is an ancient game of skill and strategy. The game is played"
- 230 PRINT"with any number of piles of objects. The two players take turns removing any"
- 240 PRINT"number of objects from one of the piles. You can take one object or the whole"
- 250 PRINT"pile, but you can't take objects from two piles."
- 260 PRINT:PRINT"As agreed upon before the start of the game, the winner is the one who"
- 270 PRINT"takes (or doesn't take) the last object from the last pile.":PRINT
- 280 PRINT"In this version of the game, you can elect to have up to 12 piles of objects,"
- 290 PRINT"with up to 15 objects in each pile.":PRINT
- 300 PRINT"From here on out, just respond to the questions as they come up.":PRINT
- 310 PRINT"Oh, by the way, if you want to concede a game, just enter 0,0 when it's your"
- 320 PRINT"move. Your IBM Personal Computer gladly accepts forfeits."
- 330 PRINT:PRINT:PRINT" GOOD LUCK!":BEEP:BEEP:PRINT
- 340 INPUT"When you have finished reading this, just press the return key. ",A$
- 350 CLS:PRINT:INPUT"How many piles (1-12)";NPILES
- 360 IF NPILES => 1 AND NPILES =< 12 THEN 380
- 370 BEEP:PRINT"Come, now - enter a number between 1 and 12":GOTO 350
- 380 PRINT:PRINT"you may have from 1 to 15 items in each pile."
- 390 FOR PCT = 1 TO NPILES
- 400 PRINT USING"How many in pile ##";PCT;
- 410 INPUT PILE(PCT)
- 420 IF PILE(PCT) >= 1 AND PILE(PCT)<= 15 THEN 440
- 430 BEEP:PRINT"You must enter a number between 1 and 15":GOTO 400
- 440 NEXT PCT
- 450 PRINT:INPUT"Does taking the last item Win (W) or Lose (L) the game";A$
- 460 IF A$ = "L" OR A$ = "l" OR A$ = "w" OR A$ = "W" THEN 480
- 470 BEEP:PRINT"PLEASE answer with W or L. Now try again":GOTO 450
- 480 WOPT$="take"
- 490 IF A$ = "L" OR A$ = "l" THEN WOPT$ = "notake"
- 500 PRINT:INPUT"Do you want to move first (Y,N)";A$
- 510 IF A$ = "y" OR A$ = "Y" OR A$ = "n" OR A$ = "N" THEN 530
- 520 BEEP:PRINT"You MUST answer Y for yes, or N for no. Try again.":GOTO 500
- 530 FIRST$="IBMPC"
- 540 IF A$ = "Y" OR A$ = "y" THEN FIRST$ = "player"
- 550 WIN$ = "no"
- 560 GOSUB 1240
- 570 IF FIRST$ = "IBMPC" THEN 610
- 580 GOSUB 1100
- 590 IF WIN$="no" THEN GOSUB 710
- 600 GOTO 630
- 610 GOSUB 710
- 620 IF WIN$="no" THEN GOSUB 1100
- 630 IF WIN$="no" THEN 570
- 640 IF WIN$="player" THEN GOSUB 2090
- 650 IF WIN$="IBMPC" THEN PRINT:GOSUB 1520:PRINT"Ho, hum --- I win again...":PRINT
- 660 INPUT"Want to play another";A$
- 670 IF A$ = "y" OR A$ = "Y" OR A$ = "n" OR A$="N" THEN 690
- 680 GOSUB 1420:PRINT"Please, just a simple Y or N. Try again.":GOTO 660
- 690 IF A$ = "Y" OR A$ = "y" THEN 350
- 700 END
- 710 REM IBMPC MOVE
- 720 PCTW=0
- 730 FOR PCT=1 TO NPILES
- 740 IF PILE(PCT)>0 THEN 790
- 750 NEXT PCT
- 760 WIN$="IBMPC"
- 770 IF WOPT$ = "take" THEN WIN$="player"
- 780 GOTO 1040
- 790 GOSUB 1690
- 800 PILEW=PILE(PFIRST)
- 810 PCTW=PFIRST
- 820 IF PNZ<>1 THEN 910
- 830 IF PILE(PFIRST)<> 1 THEN 880
- 840 PILE(PFIRST)=0
- 850 WIN$="player"
- 860 IF WOPT$="take" THEN WIN$="IBMPC"
- 870 GOTO 1040
- 880 IF WOPT$="take" THEN PILE(PFIRST)=0:WIN$="IBMPC":GOTO 1040
- 890 PILE(PFIRST)=1
- 900 GOTO 1040
- 910 IF PALLONE THEN PILE(PFIRST)=0:GOTO 1040
- 920 GOSUB 1830
- 930 IF PCTW<>0 THEN 1010
- 940 PCTW=RND*NPILES
- 950 IF PCTW=0 THEN 940
- 960 IF PILE(PCTW)=0 THEN 940
- 970 PILEW=PILE(PCTW)
- 980 TPILE!=RND*PILEW
- 990 PILE(PCTW)=FIX(TPILE!)
- 1000 GOTO 1040
- 1010 GOSUB 1560
- 1020 GOSUB 1690
- 1030 IF PALLONE THEN IF WOPT$<>"take" THEN PILE(PCTW)=0
- 1040 FOR I=1 TO 1000:NEXT I
- 1050 GOSUB 1240
- 1060 IF PCTW=0 THEN RETURN
- 1070 PRINT USING"I took ## from pile ";PILEW-PILE(PCTW);
- 1080 PRINT PCTW
- 1090 RETURN
- 1100 REM Player's move
- 1110 PRINT"Enter pile number and the number you want to remove, separated by a comma."
- 1120 PRINT"Enter 0,0 if you want to concede the game."
- 1130 INPUT"For example: 2,7 ==> ",PPN,PREM
- 1140 IF PPN+PREM=0 THEN 1220
- 1150 IF PPN>0 AND PPN<=NPILES THEN 1170
- 1160 BEEP:PRINT"That pile number doesn't exist. Try one we are playing with.":GOTO 1110
- 1170 IF PREM>0 AND PREM<=PILE(PPN) THEN 1190
- 1180 GOSUB 1420:BEEP:PRINT"You can't take zero items and you can't take more than the pile contains.":GOTO 1110
- 1190 PILE(PPN)=PILE(PPN)-PREM
- 1200 GOSUB 1240
- 1210 RETURN
- 1220 WIN$="IBMPC"
- 1230 GOSUB 1420:RETURN
- 1240 REM DISPLAY PILES ROUTINE
- 1250 CLS
- 1260 FOR PHT = 15 TO 1 STEP -1
- 1270 FOR PCT = 1 TO NPILES
- 1280 IF PILE(PCT)< PHT THEN PRINT " ";
- 1290 IF PILE(PCT) >= PHT THEN PRINT "O-O ";
- 1300 NEXT PCT
- 1310 PRINT
- 1320 NEXT PHT
- 1330 FOR PCT = 1 TO NPILES
- 1340 PRINT USING "## ";PCT;
- 1350 NEXT PCT
- 1360 PRINT:PRINT
- 1370 FOR PCT = 1 TO NPILES
- 1380 PRINT USING "(##) ";PILE(PCT);
- 1390 NEXT PCT
- 1400 PRINT
- 1410 RETURN
- 1420 REM RAZZBERRY ROUTINE
- 1430 SOUND 400,7
- 1440 FOR I = 1 TO 15
- 1450 SOUND 90,20
- 1460 FOR J=1 TO 15: NEXT J
- 1470 SOUND 40,0
- 1480 FOR J=1 TO 15: NEXT J
- 1490 NEXT I
- 1500 SOUND 40,0
- 1510 RETURN
- 1520 REM FANFARE ROUTINE
- 1530 PLAY"t140mbo2c8f8a8o3c8c16c16c8o2a8a16a16a8f8a8f8c"
- 1540 PLAY"mbo2c8f8a8o3c4o2a8o3c.."
- 1550 RETURN
- 1560 REM MAKE ALL BIT COLUMNS EVEN ROUTINE
- 1570 REM REQUIRES PCTW - THE 'WORKING' PILE NUMBER AND NPILES - PILE COUNT
- 1580 PILE(PCTW)=0
- 1590 MASK=8
- 1600 FOR I=1 TO 4
- 1610 PBC=0
- 1620 FOR PCT=1 TO NPILES
- 1630 IF PILE(PCT) AND MASK THEN PBC=PBC+1
- 1640 NEXT PCT
- 1650 IF PBC AND 1 THEN PILE(PCTW)=PILE(PCTW) OR MASK
- 1660 MASK=MASK/2
- 1670 NEXT I
- 1680 RETURN
- 1690 REM CHECK PILE STATUS ROUTINE
- 1700 REM If all piles contain one, sets pallone = 1
- 1710 REM If all piles are empty, pnz is set to zero, else it counts non-empties
- 1720 REM PFIRST is set to the pile number of the first non-empty pile.
- 1730 PNSAVE=0
- 1740 PNZ=0
- 1750 PALLONE=1
- 1760 FOR PCT=1 TO NPILES
- 1770 IF PILE(PCT)>1 THEN PALLONE=0
- 1780 IF PILE(PCT)<>0 AND PNSAVE=0 THEN PNSAVE=PCT
- 1790 IF PILE(PCT)<>0 THEN PNZ=PNZ+1
- 1800 NEXT PCT
- 1810 PFIRST=PNSAVE
- 1820 RETURN
- 1830 REM ANALYZE BIT COLUMNS ROUTINE
- 1840 REM IF any bit column is odd, sets PCTW to the pile number of the biggest
- 1850 REM pile having a bit in the odd column and sets PILEW to
- 1860 REM the number of items in that pile.
- 1870 REM IF ALL BIT COLUMNS ARE EVEN, SETS BOTH THE ABOVE VALUES TO ZERO.
- 1880 MASK = 8
- 1890 FOR I= 1 TO 4
- 1900 PBC=0
- 1910 PNSAVE=0
- 1920 PILESAVE=0
- 1930 FOR PCT=1 TO NPILES
- 1940 M= PILE(PCT) AND MASK
- 1950 IF M=0 THEN 1980
- 1960 PBC=PBC+1
- 1970 IF PILE(PCT) > PILESAVE THEN PILESAVE=PILE(PCT):PNSAVE=PCT
- 1980 NEXT PCT
- 1990 M=PBC AND 1
- 2000 IF M THEN 2060
- 2010 MASK=MASK/2
- 2020 NEXT I
- 2030 PILEW=0
- 2040 PCTW=0
- 2050 RETURN
- 2060 PILEW=PILESAVE
- 2070 PCTW=PNSAVE
- 2080 RETURN
- 2090 REM PLAYER WINS DISPLAY ROUTINE
- 2100 PLAY"mbt162o2c4e4e4g4g4o3c4c4e4e4c4c4o2g4g4e4e4"
- 2110 FOR I=1 TO 4
- 2120 COLOR 7,0
- 2130 CLS
- 2140 IF I AND 1 THEN COLOR 0,7
- 2150 IF I = 3 THEN PLAY"mbt162o3e8e-8d4o2b4b4g4g4f4f4o3d8e8c4c4c4c4c4."
- 2160 PRINT"*******************************************************************************"
- 2170 PRINT"*******************************************************************************"
- 2180 PRINT"******** ********* ******* ********* ******** ******************"
- 2190 PRINT"********** ***** ******* ****** ******* ******** ******************"
- 2200 PRINT"************ * ******* ********** ***** ******** ******************"
- 2210 PRINT"************** ********* ********** ***** ******** ******************"
- 2220 PRINT"************** ********* ********** ***** ******** ******************"
- 2230 PRINT"************** *********** ****** ******** ****** *******************"
- 2240 PRINT"************** ************* ************ *********************"
- 2250 PRINT"*******************************************************************************"
- 2260 IF I=4 THEN COLOR 31,0
- 2270 PRINT"********************************************************************** ******"
- 2280 PRINT"********* *************** *** ***** ********* *********** *******"
- 2290 PRINT"********** ************* ***** ****** ******* ********** ********"
- 2300 PRINT"*********** *********** ****** ****** * ***** ********* *********"
- 2310 PRINT"************ *** *** ******* ****** *** *** ******** **********"
- 2320 PRINT"************* * * ******** ****** ***** * ******* ***********"
- 2330 PRINT"************** * ********* ****** ******* *********************"
- 2340 PRINT"*************** *** ********* ***** ********* ***** *************"
- 2350 PRINT"*******************************************************************************"
- 2360 PRINT"*******************************************************************************"
- 2370 NEXT I
- 2380 COLOR 7,0
- 2390 PRINT
- 2400 RETURN
-