Mastermind
Nötige Module und Programme
|
Modul |
Adr. | Anz. |
| CPU-Modul mit BasicBeetle 1.00 oder höher | - | 1 |
| TKTerm oder VGATerm | - | 1 |
Beschreibung
Bei Mastermind ist es Ziel des Spieles zu erraten, welche 4 Farben der Computer per Zufall ausgewählt hat. Hierzu kann man, nachdem man den Startbildschirm mit beliebiger Taste beendet hat, mit den Tasten [A] bis [D] die Farben auswählen von denen man glaubt, dass dieses die vom Computer gewählten Farben sind. Die Farben können hierbei mehrfach vorkommen.
Hat man die gewünschte Farbkombination eingestellt, so wird dies mit [Enter] bestätigt. Nun wird die Kombination überprüft. Stimmt sowohl die Farbe als auch die Position überein, wird ein schwarzer Punkt angezeigt. Existiert nur die Farbe in der Kombination des Computers, wird dies mit einem weißen Punkt angezeigt. Gleichzeitig steht das Ergebnis in der rechten Ausgabebox.
Schafft man es nicht, die Farbkombination des Computers innerhalb von 12 Versuchen zu erraten, so ist das Spiel beendet und die Kombination wird im Eingabebereich angezeigt. Nach einem beendeten Spiel wird die Frage gestellt, ob man eine weitere Runde spielen möchte. Mit [J] kann man noch eine Runde wagen während [N] das Spiel beendet.
Screenshots
Um die Bilder in voller Größe zu sehen, einfach das gewünschte Bild anklicken. Es wird in einem neuen Fenster geöffnet.
Programmlisting
|
10 REM
************************ 20 REM *** Mastermind *** 30 REM *** (C) 2010 *** 40 REM *** Thomas Krueger *** 50 REM ************************ 60 REM 70 DIM ESC$*2,X,Y,COL,K$*1,FLD(47),RT(47),ORG(3),SEL(3),CTAB(7),RTC(2) 80 DIM PS,RP,RC,C1,C2,C3,MSG$*80 90 ESC$=CHR$(27)+"[":COL=&H07: GOSUB 1490:CLS:PRINT CHR$(19); 100 REM **************************** 110 REM ** Begruessungsbildschirm ** 120 REM **************************** 130 REM 140 MSG$="M A S T E R M I N D":GOSUB 230 150 X=33:Y=12: GOSUB 1450:COL=&H0C: GOSUB 1500:PRINT "Entworfen von" 160 X=28:Y=15: GOSUB 1450:COL=&H09: GOSUB 1500:PRINT "(C) 2010 Thomas Krueger" 170 X=26:Y=23: GOSUB 1450:COL=&H0E: GOSUB 1500 180 PRINT "Beliebige Taste zum Starten !" 190 GOSUB 230:DELAY 5:IF INKEY$="" THEN GOTO LINE 200 RESTORE 280:FOR C1=0 TO 7:READ CTAB(C1):NEXT 210 FOR C1=0 TO 2:READ RTC(C1):NEXT 220 GOTO 310 230 REM *** Mastermind blinken *** 240 X=30:Y=5: GOSUB 1450:FOR C1=1 TO LEN(MSG$) STEP 2 250 COL=RND%16:IFF COL THEN GOTO LINE 260 GOSUB 1500:PRINT MID$(C1,1,MSG$);" "; 270 NEXT:RETURN 280 REM *** Farbtabelle *** 290 DATA &H10,&H19,&H1A,&H1B,&H1C,&H1D,&H1E,&H1F 300 DATA &H11,&H1F,&H10 310 REM ************************************ 320 REM ** Spielfeld und Daten einrichten ** 330 REM ************************************ 340 REM 350 COL=&H4F: GOSUB 1500:CLS:PRINT CHR$(19); 360 COL=&H46: GOSUB 1500:X=0:Y=0:GOSUB 1450 370 PRINT STRING$(80,220);:COL=&HE4: GOSUB 1500:INC Y: GOSUB 1450 380 PRINT ESC$;"K";SPACE$(2);"M A S T E R M I N D";SPACE$(34); 390 PRINT "(C) 2010 Thomas Krueger";:INC Y:GOSUB 1450:COL=&H46: GOSUB 1500 400 PRINT STRING$(80,223); 410 COL=&H19: GOSUB 1500:X=33:Y=5: GOSUB 1450 420 PRINT CHR$(218);STRING$(7,196);CHR$(194);STRING$(4,196);CHR$(191); 430 INC Y:GOSUB 1450 440 PRINT CHR$(179);"A B C D";CHR$(179);SPACE$(4);CHR$(179); 450 FOR C1=1 TO 12:INC Y: GOSUB 1450 460 PRINT CHR$(179);SPACE$(7);CHR$(179);SPACE$(4);CHR$(179); 470 NEXT:INC Y:GOSUB 1450 480 PRINT CHR$(195);STRING$(7,196);CHR$(197);STRING$(4,196);CHR$(180) 490 INC Y:GOSUB 1450 500 PRINT CHR$(179);SPACE$(7);CHR$(179);SPACE$(4);CHR$(179); 510 INC Y:GOSUB 1450 520 PRINT CHR$(192);STRING$(7,196);CHR$(193);STRING$(4,196);CHR$(217); 530 COL=&H4B: GOSUB 1500:X=32:Y=22: GOSUB 1450 540 PRINT "[A]-[D] Farbwahl";:INC Y:X=33: GOSUB 1450:PRINT "[Enter] Setzen"; 550 GOSUB 1310 560 X=13:Y=12: GOSUB 1450:PRINT "Versuch"; 570 X=52:Y=12: GOSUB 1450:PRINT "Richtige Positionen"; 580 X=52:Y=14: GOSUB 1450:PRINT "Richtige Farben"; 590 POKES VARPTR(FLD(0)),STRING$(96,255):POKES VARPTR(RT(0)),STRING$(96,0) 600 POKES VARPTR(ORG(0)),STRING$(8,0):POKES VARPTR(SEL(0)),STRING$(8,0) 610 PS=0:RC=0:RP=0:FOR C1=0 TO 3:ORG(C1)=RND AND 7:NEXT 620 GOSUB 1080: GOSUB 1240 630 REM ******************* 640 REM ** Spielschleife ** 650 REM ******************* 660 REM 670 GOSUB 1400:IF K$=CHR$(13) THEN GOTO 710 680 IF (ASC(K$)<65) OR (ASC(K$)>68) THEN GOTO 670 690 C1=ASC(K$)-65:INC SEL(C1):IF SEL(C1)=8 THEN SEL(C1)=0 700 GOSUB 1240: GOTO 670 710 REM **************** 720 REM ** Auswertung ** 730 REM **************** 740 REM 750 FOR C1=0 TO 3:FLD(PS*4+C1)=SEL(C1):NEXT 760 FOR C1=0 TO 3:FOR C2=0 TO 3 770 IF ORG(C1)=SEL(C2) THEN RT(PS*4+C2)=1 780 NEXT:NEXT:FOR C1=0 TO 3 790 IF RT(PS*4+C1)=1 THEN IF ORG(C1)=SEL(C1) THEN INC RT(PS*4+C1) 800 NEXT:RP=0:RC=0:FOR C1=0 TO 3:SELECT RT(PS*4+C1) 810 CASE 1:INC RC 820 CASE 2:INC RP 830 NEXT:INC PS:GOSUB 1080 840 IF RP=4 THEN GOTO 940 850 IF PS=12 THEN GOTO 870 860 GOTO 630 870 REM ******************** 880 REM ** Spiel verloren ** 890 REM ******************** 900 REM 910 GOSUB 1310:X=8:Y=13: GOSUB 1450:PRINT "Leider verloren !"; 920 FOR C1=0 TO 3:SEL(C1)=ORG(C1):NEXT: GOSUB 1240 930 GOTO 1000 940 REM ******************** 950 REM ** Spiel gewonnen ** 960 REM ******************** 970 REM 980 GOSUB 1310:X=4:Y=12: GOSUB 1450:PRINT "Herzlichen Glueckwunsch."; 990 X=6:Y=14: GOSUB 1450:PRINT "Sie haben gewonnen !";: GOTO 1000 1000 REM ***************** 1010 REM ** Neues Spiel ** 1020 REM ***************** 1030 REM 1040 COL=&HE4: GOSUB 1500:X=54:Y=13: GOSUB 1450:PRINT "Noch einmal ? (J/N)"; 1050 GOSUB 1400:IF K$="J" THEN GOTO 310 1060 IF K$<>"N" THEN GOTO 1050 1070 COL=&H07: GOSUB 1500:CLS:PRINT CHR$(20);:END 1080 REM *************************** 1090 REM ** Anzeige aktualisieren ** 1100 REM *************************** 1110 REM 1120 FOR Y=7 TO 18:FOR C1=0 TO 3:C2=Y-7*4+C1:X=C1*2+34: GOSUB 1450 1130 IF FLD(C2)=65535 THEN NEXT:GOTO 1160 1140 COL=CTAB(FLD(C2)):GOSUB 1500:PRINT CHR$(254); 1150 NEXT 1160 FOR C1=0 TO 3:C2=Y-7*4+C1:X=42+C1: GOSUB 1450 1170 COL=RTC(RT(C2)):GOSUB 1500:PRINT CHR$(250); 1180 NEXT:NEXT 1190 COL=&H4E: GOSUB 1500:X=15:Y=14: GOSUB 1450 1200 PRINT " ";RIGHT$(2," "+STR$(PS+1));" ";:X=72 1210 Y=12: GOSUB 1450:PRINT " ";RP;" "; 1220 Y=14: GOSUB 1450:PRINT " ";RC;" "; 1230 RETURN 1240 REM ****************************** 1250 REM ** Aktuelle Farbwahl zeigen ** 1260 REM ****************************** 1270 REM 1280 Y=20:FOR C1=0 TO 3:X=C1*2+34: GOSUB 1450 1290 COL=CTAB(SEL(C1)):GOSUB 1500:PRINT CHR$(254);:NEXT 1300 RETURN 1310 REM ****************************** 1320 REM ** Ausgabebereiche loeschen ** 1330 REM ****************************** 1340 REM 1350 FOR C1=0 TO 1:Y=10:X=C1*47+1: GOSUB 1450 1360 COL=&H46: GOSUB 1500:PRINT STRING$(31,220);:Y=16: GOSUB 1450 1370 PRINT STRING$(31,223);:COL=&HE4: GOSUB 1500:FOR Y=11 TO 15 1380 X=C1*47+1: GOSUB 1450:PRINT SPACE$(31);:NEXT 1390 NEXT:RETURN 1400 REM ********************* 1410 REM ** Tastaturabfrage ** 1420 REM ********************* 1430 REM 1440 DO:K$=UPPER$(INKEY$):WHILE K$="":RETURN 1450 REM ************************** 1460 REM ** Cursor positionieren ** 1470 REM ************************** 1480 REM 1490 PRINT ESC$;STR$(Y);";";STR$(X);"H";:RETURN 1500 REM ****************** 1510 REM ** Farbe setzen ** 1520 REM ****************** 1530 REM 1540 IF (COL AND 128) THEN PRINT ESC$;"4m"; ELSE PRINT ESC$;"6m"; 1550 PRINT ESC$;"4";STR$((COL SHR 4) AND 7);"m"; 1560 IF (COL AND 8) THEN PRINT ESC$;"1m"; ELSE PRINT ESC$;"2m"; 1570 PRINT ESC$;"3";STR$(COL AND 7);"m"; 1580 RETURN |