 '***************************************************************************
 '**  MšHLE MIT OMIKRON BASIC  (C) 1986 ARTUR S™DLER, PFORZHEIM            **
 '**  VERMARKTUNG ODER ŽNDERUNG SOWIE NACHMACHEN -AUCH VON TEILEN DES      **
 '**  PROGRAMMES- WIRD STRAFRECHTLICH VERFOLGT.                            **
 '**                                                                       **
 '**  DIESES PROGRAMM DARF -UND SOLL- SICH JEDER KOPIEREN.                 **
 '**                                                                       **
 '***************************************************************************
 '
 Neustart=33:Info=38
 Winame$=" OMIKRON - Basic  Mhle ":Winame= MEMORY(Winame$)
 DIM Wert(4,59),Object(5,71),Msg(7),M(24),V%B(4,59)
 DIM Obspec(2),M1(15),M2(15),M3(15),Mm(24),B%B(4,59),Nachbar%(4,23)
 Appl_Init:Kopf1$= CHR$(28)+ CHR$(29):Kopf2$= CHR$(30)+ CHR$(31)
 FOR I=0 TO 3
    FOR Sh=0 TO 8 STEP 4
       M1(I+Sh)=(I+Sh)*2:M2(I+Sh)=(I+Sh)*2+1:M3(I+Sh)=(I*2+2 AND 7)+Sh*2
    NEXT Sh
    M1(I+12)=I*2+1:M2(I+12)=I*2+9:M3(I+12)=I*2+17
 NEXT I
 FOR I=3 TO 4: FOR K=0 TO 23:Nachbar%(I,K)=24: NEXT K: NEXT I
 FOR I=0 TO 23:K=I AND 7
    Nachbar%(1,I)=I-1+(K=0 AND 8)
    Nachbar%(2,I)=I+1-(K=7 AND 8)
    IF I AND 1 THEN
       IF I AND 8 THEN
          Nachbar%(3,I)=I-8
          Nachbar%(4,I)=I+8
          Nachbar%(0,I)=4
       ELSE
          Nachbar%(3,I)=K+8
          Nachbar%(0,I)=3
       ENDIF
    ELSE
       Nachbar%(0,I)=2
    ENDIF
 NEXT I
 Weiss=1:Schwarz=2:Obspec(0)=$1100:Obspec(1)=$FF1100:Obspec(2)=$FF1171
 Wset=9:Sset=9:Wdrag=0:Sdrag=0
 Rsctxt0= MEMORY("Neues Spiel")
 Rsctxt4= MEMORY("BASIC-Info")
 Rsctxt1= MEMORY("Dieses Mhle-Programm")
 Rsctxt2= MEMORY("wurde mit dem Compiler")
 Rsctxt3= MEMORY("von OMIKRON. compiliert.")
 Rsctxt5= MEMORY("Es soll Ihnen einen")
 Rsctxt6= MEMORY("Eindruck von der Leistungsf„higkeit")
 Rsctxt7= MEMORY("dieses Compilers auch bei komplexen")
 Rsctxt8= MEMORY("Problemstellungen geben.")
 Rsctxt9= MEMORY("Nehmen Sie die Herausforderung an?")
 Rsctxt10= MEMORY("Geschwindigkeit contra Intelligenz -")
 Rsctxt11= MEMORY("wer wird Sieger?")
 X1$="FFFFFFFF00140000000000FF1100"
 X2$="FFFFFFFF00140000000000001100"
 X3$="06020601"
 X4$="04010C00"
 X5$="FFFFFFFF001C000000000000"
 Object(0,"FFFF000100460014000000000000114100000000004D0011")
 Object(1,"00080002000700190000000000021100070407020218020C")
 Object(2,"0003FFFFFFFF001900000000000111000200000607070200")
 Object(3,"000500040004001900000000000211000004000202100208")
 Object(4,"0003FFFFFFFF001900000000000211000004000202080204")
 Object(5,"0006FFFFFFFF00190000000000011100000C020002000004")
 Object(6,"0007FFFFFFFF00190000000000011100000C020802000E03")
 Object(7,"0001FFFFFFFF001900000000000111000210000607070200")
 Object(8,"0009"+X1$+"05030D01"+X3$)
 Object(9,"000A"+X1$+"050F0D01"+X3$)
 Object(10,"000B"+X1$+"051B0D01"+X3$)
 Object(11,"000C"+X1$+"051B0D07"+X3$)
 Object(12,"000D"+X1$+"051B0D0D"+X3$)
 Object(13,"000E"+X1$+"050F0D0D"+X3$)
 Object(14,"000F"+X1$+"05030D0D"+X3$)
 Object(15,"0010"+X1$+"05030D07"+X3$)
 Object(16,"0011"+X1$+"05070D03"+X3$)
 Object(17,"0012"+X1$+"050F0D03"+X3$)
 Object(18,"0013"+X1$+"05170D03"+X3$)
 Object(19,"0014"+X1$+"05170D07"+X3$)
 Object(20,"0015"+X1$+"05170D0B"+X3$)
 Object(21,"0016"+X1$+"050F0D0B"+X3$)
 Object(22,"0017"+X1$+"05070D0B"+X3$)
 Object(23,"0018"+X1$+"05070D07"+X3$)
 Object(24,"0019"+X1$+"050B0D05"+X3$)
 Object(25,"001A"+X1$+"050F0D05"+X3$)
 Object(26,"001B"+X1$+"05130D05"+X3$)
 Object(27,"001C"+X1$+"05130D07"+X3$)
 Object(28,"001D"+X1$+"05130D09"+X3$)
 Object(29,"001E"+X1$+"050F0D09"+X3$)
 Object(30,"001F"+X1$+"050B0D09"+X3$)
 Object(31,"0020"+X1$+"050B0D07"+X3$)
 Object(32,"002F002100270019000000000000110000220002002B000D")
 Object(33,"0022FFFFFFFF001A000100000000002400000000000D0001",Rsctxt0)
 Object(34,"0026002300250014000000000000110000100000001B0004")
 Object(35,"0024"+X5$+"00300002000100150001",Rsctxt1)
 Object(36,"0025"+X5$+"00460002000200130001",Rsctxt2)
 Object(37,"0022"+X5$+"005A0002000300160001",Rsctxt3)
 Object(38,"0027FFFFFFFF001A000100000000007100000002000D0001",Rsctxt4)
 Object(39,"00200028002E0014000000000000110000000004002B0009")
 Object(40,"0029"+X5$+"007C0012000000130001",Rsctxt5)
 Object(41,"002A"+X5$+"00900002000100230001",Rsctxt6)
 Object(42,"002B"+X5$+"00B40002000200260001",Rsctxt7)
 Object(43,"002C"+X5$+"00DB0002000300180001",Rsctxt8)
 Object(44,"002D"+X5$+"00F40002000500220001",Rsctxt9)
 Object(45,"002E"+X5$+"01170002000600240001",Rsctxt10)
 Object(46,"0027"+X5$+"013C0002000700100001",Rsctxt11)
 Object(47,"0030"+X2$+"02040202"+X4$)
 Object(48,"0031"+X2$+"02100202"+X4$)
 Object(49,"0032"+X2$+"021c0202"+X4$)
 Object(50,"0033"+X2$+"021c0208"+X4$)
 Object(51,"0034"+X2$+"021c020e"+X4$)
 Object(52,"0035"+X2$+"0210020e"+X4$)
 Object(53,"0036"+X2$+"0204020e"+X4$)
 Object(54,"0037"+X2$+"02040208"+X4$)
 Object(55,"0038"+X2$+"02080204"+X4$)
 Object(56,"0039"+X2$+"02100204"+X4$)
 Object(57,"003A"+X2$+"02180204"+X4$)
 Object(58,"003B"+X2$+"02180208"+X4$)
 Object(59,"003C"+X2$+"0218020c"+X4$)
 Object(60,"003D"+X2$+"0210020c"+X4$)
 Object(61,"003E"+X2$+"0208020c"+X4$)
 Object(62,"003F"+X2$+"02080208"+X4$)
 Object(63,"0040"+X2$+"020c0206"+X4$)
 Object(64,"0041"+X2$+"02100206"+X4$)
 Object(65,"0042"+X2$+"02140206"+X4$)
 Object(66,"0043"+X2$+"02140208"+X4$)
 Object(67,"0044"+X2$+"0214020a"+X4$)
 Object(68,"0045"+X2$+"0210020a"+X4$)
 Object(69,"0046"+X2$+"020c020a"+X4$)
 Object(70,"0000"+X2$+"020c0208"+X4$)
 Rsrc_Addr= LPEEK( VARPTR(Object(0,0)))+ LPEEK( SEGPTR +20) AND $FFFFFF
 GOTO Main
 DEF PROC Object(Index,Data$)
    FOR I=0 TO 5
       Object(I,Index)= VAL("$"+ MID$(Data$,I*8+1,4)) SHL 16 OR VAL("$"+ MID$(Data$,I*8+5,4))
    NEXT
    Object(4,Index)=FN Obj_Rel(Object(4,Index))
    Object(5,Index)=FN Obj_Rel(Object(5,Index))
    RETURN
 DEF PROC Object(Index,Data$,Textptr)
    FOR I=0 TO 5
       Object(I,Index)= VAL("$"+ MID$(Data$,I*8+1,4)) SHL 16 OR VAL("$"+ MID$(Data$,I*8+5,4))
    NEXT
    Object(3,Index)=Textptr
    Object(4,Index)=FN Obj_Rel(Object(4,Index))
    Object(5,Index)=FN Obj_Rel(Object(5,Index))
    RETURN
 DEF FN Obj_Rel(X)
    IF PEEK($44C)<2 THEN
       RETURN X SHR 8 AND $70000 OR X SHL 3 AND $7F80000 OR X SHR 9 AND $7 OR X SHL 3 AND $7F8
    ELSE
       RETURN X SHR 8 AND $70000 OR X SHL 3 AND $7F80000 OR X SHR 8 AND $F OR X SHL 4 AND $FF0
    ENDIF
 '************************** MAIN PROGRAM ********************************
-Main
 Mn_Selected=10:Wm_Redraw=20:Wm_Topped=21:Wm_Closed=22:Wm_Fulled=23
 Wm_Arrowed=24:Wm_Hslid=25:Wm_Vslid=26:Wm_Sized=27:Wm_Moved=28:Wm_Newtop=29
 Ac_Open=40:Ac_Close=41:Mu_Keybd=1:Mu_Button=2:Mu_M1=4:Mu_M2=8:Mu_Mesag=16:Mu_Timer=32

 IF PEEK($44C) THEN
    IF Wi_Handle THEN
       Wind_Set(Wi_Handle)
    ELSE
       Wind_Get(0,4,X,Y,W,H)
       Wind_Create(%1011,X,Y,W,H,Wi_Handle)
       IF Wi_Handle THEN
          Wind_Set(Wi_Handle,2,Winame$,Winame)
          Form_Center(Rsrc_Addr,X,Y,W,H)
          Wind_Calc(0,%1011,X,Y,W,H,X,Y,W,H)
          Wind_Open(Wi_Handle,X,Y,W,H)
          Mopsflg=Mops
       ENDIF
    ENDIF
 ELSE
    FORM_ALERT (1,"[3][Falsche Aufl”sung.|Bitte Aufl”sung MITTEL|anw„hlen][Abbruch]"): END
 ENDIF

 REPEAT
    Evnt_Multi(Mu_Button OR Mu_Mesag OR Mu_Timer AND Flash>0 AND Wi_Handle>0,1,1,1,0,0,0,0,0,0,0,0,0,0,125,Msg$,Which,Mox,Moy,Mobut,Kbdstat,0,0)
    Wind_Update(1)
    IF Which AND Mu_Timer THEN
       Object(3,8+Flashobj)=Object(3,8+Flashobj) AND $FFFF OR ABS(Flash-4) SHL 24 SHR 8
       IF Wi_Handle THEN
          Wind_Get(Wi_Handle,11,X,Y,W,H)
          WHILE H OR W
             Objc_Draw(8+Flashobj,5,X,Y,W,H,Rsrc_Addr)
             Objc_Draw(47+Flashobj,5,X,Y,W,H,Rsrc_Addr)
             Wind_Get(Wi_Handle,12,X,Y,W,H)
          WEND
          Flash=(Flash MOD 6)+1
       ENDIF
    ENDIF
    IF Which AND Mu_Mesag THEN
       FOR I=0 TO 7:Msg(I)= CVI( MID$(Msg$,I*2+1)): NEXT :Event=Msg(0)
       IF Event=Wm_Topped THEN
          IF Wi_Handle AND Msg(3)=Wi_Handle THEN
             Wind_Set(Wi_Handle)
          ENDIF
       ENDIF
       IF Event=Wm_Moved THEN
          IF Wi_Handle AND Msg(3)=Wi_Handle THEN
             Wind_Set(Wi_Handle,Msg(4),Msg(5),Msg(6),Msg(7))
             Wind_Get(Wi_Handle,4,X,Y,W,H)
             Object(4,0)=X SHL 16 OR Y
          ENDIF
       ENDIF
       IF Event=Wm_Redraw THEN
          IF Wi_Handle AND Msg(3)=Wi_Handle THEN
             Wind_Get(Wi_Handle,11,X,Y,W,H)
             WHILE H OR W
                Objc_Draw(0,7,X,Y,W,H,Rsrc_Addr)
                Wind_Get(Wi_Handle,12,X,Y,W,H)
             WEND
             IF Mopsflg THEN
                FORM_ALERT (1,"[0]["+Kopf1$+"   Sie haben eine Mhle.|"+Kopf2$+"   Nehmen Sie einen Stein.][Jippieh!]")
             ENDIF
          ENDIF
          Mopsflg=0
       ENDIF
       IF Event=Wm_Closed THEN
          IF Wi_Handle AND Msg(3)=Wi_Handle THEN
             Wind_Close(Wi_Handle)
             Wind_Delete(Wi_Handle):Wi_Handle=0
             Appl_Exit: END
          ENDIF
       ENDIF
    ENDIF
    IF Which AND Mu_Button AND Wi_Handle>0 THEN
       Objc_Find(0,5,Mox,Moy,Rsrc_Addr,Object)
       IF Object=Neustart THEN
          Neustart
       ENDIF
       IF Object=Info THEN
          Info
       ENDIF
       IF Object>7 AND Object<32 THEN
          Feld=Object-8:Zug
       ELSE
          IF Object>46 AND Object<71 THEN
             Feld=Object-47:Zug
          ELSE
             IF Flash THEN
                Wind_Get(Wi_Handle,4,X,Y,W,H)
                Flash=0:Object(3,8+Flashobj)=Object(3,8+Flashobj) OR $FF0000
                Objc_Draw(8+Flashobj,5,X,Y,W,H,Rsrc_Addr)
                Objc_Draw(47+Flashobj,5,X,Y,W,H,Rsrc_Addr)
             ENDIF
          ENDIF
       ENDIF
    ENDIF
    Wind_Update(0)
 UNTIL 0
 '--------------------------------------------------------------------------
 DEF PROC Display: LOCAL I,W
    IF Wi_Handle THEN
       Wind_Get(Wi_Handle,4,X,Y,W,H)
       FOR I=0 TO 23
          Object(3,I+47)=Obspec(M(I))
          IF M(I) THEN
             Objc_Draw(47+I,0,X,Y,W,H,Rsrc_Addr)
          ELSE
             Objc_Draw(8+I,0,X,Y,W,H,Rsrc_Addr)
          ENDIF
       NEXT
    ENDIF
 RETURN
 DEF PROC Neustart
    FOR I=0 TO 23:M(I)=0: NEXT : SWAP Weiss,Schwarz:Triumph=0
    Wset=9:Sset=9:Wdrag=0:Sdrag=0:Flash=0:Mops=0:Display
    IF Weiss=2 THEN
       Computerzug
    ENDIF
 RETURN
 DEF PROC Info
    IF Wi_Handle=0 THEN RETURN
    Wind_Get(Wi_Handle,4,X,Y,W,H)
    X2=X+W-1:Y2=Y+H-1
    X=(X+7)\8:X2=(X2-7)\8
    IF PEEK($44C)<2 THEN
       Y=(Y+7) SHR 3:Y2=(Y2-7) SHR 3
    ELSE
       Y=(Y+15) SHR 4:Y2=(Y2-15) SHR 4
    ENDIF
    IF Y2>24 THEN Y2=24
    IF PEEK($44C)=0 THEN
       IF X<0 THEN X=0
       IF X2>39 THEN X2=39
    ELSE
       IF X2>79 THEN X2=79
    ENDIF
    V_Hide_C
    PRINT "HH";@(Y2,X2);"";@(Y,X);"";"
"*30
    PRINT "OMIKRON.BASIC: -halbcompilierender Interpreter mit Eingabe-Syntaxcheck"
    PRINT "-Zahlbereich bis ñ5.11Eñ4931, 9/19-Stellig (!), 7 Variablentypen..."
    PRINT "-Professionell: Masken-INPUT, ISAM-Verwaltung, Deutsch sortieren: aD-„-Af"
    PRINT "-Grafik: ALLE Funktionen von VDI & AES mit Namen aufrufbar. (Library)"
    PRINT "-Mehrzeilige DEF FN's, Procedures mit RšCKGABEparametern, lokale Variablen"
    PRINT "-Entwicklung: Full-Screen-Editor 106x44, TRACE-Routine in BASIC m”glich"
    PRINT "Modul DM 229,-; Diskette DM 179,-; Compiler DM 179,-. Erh„ltlich bei:"
    PRINT "
OMIKRON Software, Erlachstraže 15, 7534 Birkenfeld 2 - Tel. 07082 / 5386"
    REPEAT UNTIL LEN( INKEY$ ) OR MOUSEBUT
    PRINT "EH";
    V_Show_C(1)
    Wind_Get(Wi_Handle,11,X,Y,W,H)
    WHILE H OR W
       Objc_Draw(0,7,X,Y,W,H,Rsrc_Addr)
       Wind_Get(Wi_Handle,12,X,Y,W,H)
    WEND
 RETURN
 DEF PROC Zug
    IF Wi_Handle=0 THEN RETURN
    IF Mops THEN
       IF M(Feld)<>Schwarz THEN
          PRINT CHR$(7);
       ELSE
          Mops=0
          FOR I=0 TO 15
             IF(M(M1(I)) AND M(M2(I)) AND M(M3(I)))=Schwarz THEN
                IF Feld=M1(I) OR Feld=M2(I) OR Feld=M3(I) THEN
                   Mops=1
                ENDIF
             ENDIF
          NEXT I
          IF Mops THEN
             PRINT CHR$(7);
          ELSE
             M(Feld)=0:Sdrag=Sdrag-1:Display
             IF Sset+Sdrag<3 THEN
                FORM_ALERT (1,"[0]["+Kopf1$+"   GRATULATION!!!|"+Kopf2$+"   Sie haben gewonnen!][Neues Spiel]")
                Neustart
             ELSE
                Computerzug
             ENDIF
          ENDIF
       ENDIF
    ELSE
       IF Wset THEN
          IF M(Feld) THEN
             PRINT CHR$(7);
          ELSE
             M(Feld)=Weiss:Wset=Wset-1:Wdrag=Wdrag+1
             Display
             B=Feld:Mopstest
             IF Mops=0 THEN
                Computerzug
             ENDIF
          ENDIF
       ELSE
          IF Flash THEN
             Rot=(Feld-Flashobj) AND 7:Rotabs= ABS((Rot+3 AND 7)-3)
             Shift=(Feld AND 24)-(Flashobj AND 24):Shiftabs= ABS(Shift) SHR 3
             Fault=Shiftabs AND Rot=0 AND((Feld AND 1)=0) OR Rotabs+Shiftabs<>1
             IF M(Feld) OR Wset+Wdrag>3 AND Fault THEN
                PRINT CHR$(7);
             ELSE
                M(Flashobj)=0:M(Feld)=Weiss:Flash=0
                Object(3,8+Flashobj)=Object(3,8+Flashobj) OR $FF0000
                Display
                B=Feld:Mopstest
                IF Mops=0 THEN
                   Computerzug
                ENDIF
             ENDIF
          ELSE
             IF M(Feld)<>Weiss THEN
                PRINT CHR$(7);
             ELSE
                Flash=1:Flashobj=Feld
             ENDIF
          ENDIF
       ENDIF
    ENDIF
 RETURN
 DEF PROC Mopstest
    IF B AND 1 THEN
       M1=B SHR 1:M2=(B AND 6)/2+12
    ELSE
       M1=B/2:M2=(B-2-8*((B AND 7)=0))/2
    ENDIF
    Mops=Weiss AND M(M1(M1)) AND M(M2(M1)) AND M(M3(M1))
    Mops=Mops OR Weiss AND M(M1(M2)) AND M(M2(M2)) AND M(M3(M2))
    IF Mops THEN
       Mops=0
       FOR I=0 TO 23:Mm(I)=M(I): NEXT
       FOR I=0 TO 15
          IF(M(M1(I)) AND M(M2(I)) AND M(M3(I)))=Schwarz THEN
             Mm(M1(I))=0:Mm(M2(I))=0:Mm(M3(I))=0
          ENDIF
       NEXT I
       FOR I=0 TO 23
          IF Mm(I)=Schwarz THEN
             Mops=1
          ENDIF
       NEXT I
       IF Mops THEN
          FORM_ALERT (1,"[0]["+Kopf1$+"   Sie haben eine Mhle.|"+Kopf2$+"   Nehmen Sie einen Stein.][Jippieh!]")
       ELSE
          FORM_ALERT (1,"[0]["+Kopf1$+"   Sie haben eine Mhle.|"+Kopf2$+"   Doch - meine Steine sind|     alle Teil einer Mhle.|     Sie drfen also|     keinen Stein nehmen.][Schade!]")
       ENDIF
    ENDIF
 RETURN
 DEF PROC Computerzug
 Graf_Mouse(2)
 Sf=0: FOR I=0 TO 23:Sf=Sf-(M(I)=Schwarz): NEXT : IF Sf<>Sdrag THEN STOP
 Wf=0: FOR I=0 TO 23:Wf=Wf-(M(I)=Weiss): NEXT : IF Wf<>Wdrag THEN STOP
    IF Sset+Sdrag>3 THEN
       Tiefe=3:Count=4'Setzen, Mittelphase
    ELSE
       Tiefe=4:Count=3'Endspiel
    ENDIF
    Bewertung2(Tiefe,V,B,Wert)
    IF V<0 AND B<0 THEN
       FORM_ALERT (1,"[0]["+Kopf1$+"   GRATULATION!!!|"+Kopf2$+"   Ich kann nicht mehr ziehen!|     Sie haben gewonnen!][Neues Spiel]")
       Neustart
    ELSE
       IF Sset THEN
          M(B)=Schwarz:Sset=Sset-1:Sdrag=Sdrag+1
       ELSE
          M(V)=0:M(B)=Schwarz
       ENDIF
       IF Wert=2000000000 AND Triumph=0 THEN
          Triumph=1: FORM_ALERT (1,"[0]["+Kopf1$+"   Sieht schlecht aus.|"+Kopf2$+"   OMIKRON BASIC.|     Die SCHLAGENDE Alternative.][Na warte!]")
       ENDIF
    ENDIF
    Mops=0
    FOR I=0 TO 15
       IF M(M1(I)) AND M(M2(I)) AND M(M3(I)) THEN
          IF B=M1(I) OR B=M2(I) OR B=M3(I) THEN
             Mops=1
          ENDIF
       ENDIF
    NEXT I
    Display
    IF Mops THEN
       Mops=0
       FOR I=0 TO 23:Mm(I)=M(I): NEXT
       FOR I=0 TO 15
          IF(M(M1(I)) AND M(M2(I)) AND M(M3(I)))=Weiss THEN
             Mm(M1(I))=0:Mm(M2(I))=0:Mm(M3(I))=0
          ENDIF
       NEXT I
       FOR I=0 TO 23
          IF Mm(I)=Weiss THEN
             Mops=1
          ENDIF
       NEXT I
       IF Mops THEN
          FORM_ALERT (1,"[0]["+Kopf1$+"   Ich habe eine Mhle.|"+Kopf2$+"   Ich nehme einen Stein.][Schade!]")
          Computermops:M(B)=0:Wdrag=Wdrag-1:Mops=0:Display
          IF Wset+Wdrag<3 THEN
             FORM_ALERT (1,"[0]["+Kopf1$+"   OMIKRON BASIC.|"+Kopf2$+"   Die SCHLAGENDE Alternative.][Neues Spiel]")
             Neustart
          ENDIF
       ELSE
          FORM_ALERT (1,"[0]["+Kopf1$+"   Ich habe eine Mhle, kann|"+Kopf2$+"   jedoch keinen Stein|     nehmen.][Ufff!]")
       ENDIF
    ENDIF
 Graf_Mouse(0): PRINT CHR$(7);
 RETURN
 DEF PROC Computermops: LOCAL W,Wset,Sset,Schwarz,Weiss
    SWAP Schwarz,Weiss
    SWAP Wset,Sset
    SWAP Wdrag,Sdrag:Sdrag=Sdrag-1
    W2= RND(24):B=24:W=2000000000
    FOR I=W2 TO W2+23:V=I+24*(I>23)
       IF M(V)=Schwarz THEN
          IF V AND 1 THEN
             M1=V SHR 1:M2=(V AND 6)/2+12
          ELSE
             M1=V/2:M2=(V-2-8*((V AND 7)=0))/2
          ENDIF
          Mops=Schwarz AND M(M1(M1)) AND M(M2(M1)) AND M(M3(M1))
          Mops=Mops OR Schwarz AND M(M1(M2)) AND M(M2(M2)) AND M(M3(M2))
          IF Mops=0 THEN
             Wert=FN Bewertung(V,24)
             IF Wert<W THEN B=V:W=Wert
          ENDIF
       ENDIF
    NEXT I
    Sdrag=Sdrag+1: SWAP Sdrag,Wdrag
    'IF B<24 THEN WDRAG=WDRAG-1
 RETURN
 DEF PROC Bewertung(V,B,Tiefe,R Wert)
    LOCAL I,W,N,Schwarz,Weiss,Wset,Wdrag,Sset,Sdrag,M(B)=M(V),M(V)=0,Cnt
    IF B AND 1 THEN
       M1=B SHR 1:M2=(B AND 6)/2+12
    ELSE
       M1=B/2:M2=(B-2-8*((B AND 7)=0))/2
    ENDIF
    Mops=Schwarz AND M(M1(M1)) AND M(M2(M1)) AND M(M3(M1))
    Mops=Mops OR Schwarz AND M(M1(M2)) AND M(M2(M2)) AND M(M3(M2))
    IF Mops THEN
       Computermops
       IF B<24 THEN
          LOCAL M(B)=0:Wdrag=Wdrag-1
          IF Wset+Wdrag<3 THEN Wert=-2000000000: RETURN
       ENDIF
    ENDIF
    SWAP Weiss,Schwarz
    SWAP Wset,Sset
    SWAP Wdrag,Sdrag
 LOCAL K=0: GOTO Bewertung
 DEF PROC Bewertung2(Tiefe,R V,R B,R Wert)
    LOCAL I,K=0,W,N,Schwarz,Weiss,Wset,Wdrag,Sset,Sdrag
-Bewertung
    IF Sset THEN
       V=24:Sset=Sset-1:Sdrag=Sdrag+1
       W2= RND(24)
       FOR W=W2 TO W2+23:B=W+24*(W>23)
          IF M(B)=0 THEN
             V%B(Tiefe,K)=24:B%B(Tiefe,K)=B:M(24)=Schwarz
             Wert(Tiefe,K)=FN Bewertung(V,B)
             K=K+1
          ENDIF
       NEXT W
    ELSE
       IF Sset+Sdrag<4 THEN
          W2= RND(24)
          FOR W=W2 TO W2+23:V=W+24*(W>23)
             IF M(V)=Schwarz THEN
                B= RND(24)
                FOR N=B TO B+23:B=N+24*(N>23)
                   IF M(B)=0 THEN
                      V%B(Tiefe,K)=V:B%B(Tiefe,K)=B
                      Wert=FN Bewertung(V,B):Wert(Tiefe,K)=Wert
                      IF Wert=2000000000 THEN EXIT TO Link1
                      IF Wert>-2000000000 THEN K=K+1
                   ENDIF
                NEXT N
                IF 0 THEN-Link1: EXIT TO Link2
             ENDIF
          NEXT W
          IF 0 THEN-Link2: RETURN
       ELSE
          W2= RND(24)
          FOR W=W2 TO W2+23:V=W+24*(W>23)
             IF M(V)=Schwarz THEN
                FOR N=1 TO Nachbar%(0,V)
                   B=Nachbar%(N,V)
                   IF M(B)=0 THEN
                      V%B(Tiefe,K)=V:B%B(Tiefe,K)=B
                      Wert(Tiefe,K)=FN Bewertung(V,B)
                      K=K+1
                   ENDIF
                NEXT N
             ENDIF
          NEXT W
       ENDIF
    ENDIF
    IF K=0 THEN
       V=-1:B=-1:Wert=-2000000000: RETURN
    ENDIF
    FOR V=0 TO -4*(Tiefe>1)
       FOR I=K-2 TO V STEP -1
          IF Wert(Tiefe,I)<Wert(Tiefe,I+1) THEN
             W=Wert(Tiefe,I):Wert(Tiefe,I)=Wert(Tiefe,I+1)
             Wert(Tiefe,I+1)=W
             W=V%B(Tiefe,I):V%B(Tiefe,I)=V%B(Tiefe,I+1):V%B(Tiefe,I+1)=W
             W=B%B(Tiefe,I):B%B(Tiefe,I)=B%B(Tiefe,I+1):B%B(Tiefe,I+1)=W
          ENDIF
       NEXT I
    NEXT V
    IF Tiefe>1 THEN
       Cnt=Count: IF K<Cnt THEN Cnt=K
       FOR I=0 TO Cnt-1
          M(24)=Schwarz
          Bewertung(V%B(Tiefe,I),B%B(Tiefe,I),Tiefe-1,Wert)
          Wert(Tiefe,I)=-Wert
       NEXT I
       FOR I=Cnt-2 TO 0 STEP -1
          IF Wert(Tiefe,I)<Wert(Tiefe,I+1) THEN
             W=Wert(Tiefe,I):Wert(Tiefe,I)=Wert(Tiefe,I+1)
             Wert(Tiefe,I+1)=W
             W=V%B(Tiefe,I):V%B(Tiefe,I)=V%B(Tiefe,I+1):V%B(Tiefe,I+1)=W
             W=B%B(Tiefe,I):B%B(Tiefe,I)=B%B(Tiefe,I+1):B%B(Tiefe,I+1)=W
          ENDIF
       NEXT I
    ENDIF
    Wert=Wert(Tiefe,0):V=V%B(Tiefe,0):B=B%B(Tiefe,0): RETURN
 RETURN
 DEF FN Bewertung(V,B): LOCAL I,K,Z,W,M(24),Wset,Sset,Wdrag,Sdrag,M(B)=M(V),M(V)=0
    IF B AND 1 THEN
       M1=B SHR 1:M2=(B AND 6)/2+12
    ELSE
       M1=B/2:M2=(B-2-8*((B AND 7)=0))/2
    ENDIF
    Mops=Schwarz AND M(M1(M1)) AND M(M2(M1)) AND M(M3(M1))
    Mops=Mops OR Schwarz AND M(M1(M2)) AND M(M2(M2)) AND M(M3(M2))
    IF Mops THEN
       Computermops
       IF B<24 THEN
          LOCAL M(B)=0:Wdrag=Wdrag-1
          IF Wset+Wdrag<3 THEN RETURN 2000000000
       ENDIF
    ENDIF
    Wwert=0:Swert=0
    FOR I=0 TO 15:W=M(M1(I)) OR M(M2(I)) OR M(M3(I))
       IF W+1 AND 2 THEN
          S=M(M1(I))+M(M2(I))+M(M3(I))
       IF W=Weiss THEN
          IF S=Weiss THEN
             IF Wset>1 THEN
                Wwert=Wwert+100
             ELSE
                S=0
                IF M(M1(I))=0 THEN
                   IF I<12 THEN
                      IF M(M2(I-1-4*((I AND 3)=0)))=Weiss THEN S=S+1
                   ELSE
                      IF M(M1(I)-1)=Weiss OR M(M1(I)+1)=Weiss THEN S=S+1
                   ENDIF
                ENDIF
                IF M(M2(I))=0 THEN
                   IF I<8 THEN
                      IF I<4 THEN
                         IF M(M2(I+4))=Weiss THEN S=S+1
                      ELSE
                         IF M(M2(I+4))=Weiss OR M(M2(I-4))=Weiss THEN S=S+1
                      ENDIF
                   ELSE
                      IF I<12 THEN
                         IF M(M2(I-4))=Weiss THEN S=S+1
                      ELSE
                         IF M(M2(I)-1)=Weiss OR M(M2(I)+1)=Weiss THEN S=S+1
                      ENDIF
                   ENDIF
                ENDIF
                IF M(M3(I))=0 THEN
                   IF I<12 THEN
                      IF M(M2(I+1+4*((I AND 3)=3)))=Weiss THEN S=S+1
                   ELSE
                      IF M(M3(I)-1)=Weiss OR M(M3(I)+1)=Weiss THEN S=S+1
                   ENDIF
                ENDIF
                IF S+Wset>1 THEN Wwert=Wwert+100
             ENDIF
          ELSE
             IF Wset THEN
                Wwert=Wwert+1000
             ELSE
                S=0:Z=0
                IF M(M1(I))=0 THEN
                   IF I<12 THEN
                      K=I+3 OR 12
                      IF M(M2(I-1-4*((I AND 3)=0)))=Weiss THEN S=1
                      IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Weiss THEN Z=1
                   ELSE
                      K1=I-11+4*(I=15):K2=I-13-4*(I=12)
                      IF M(M1(K1))=Weiss OR M(M3(K2))=Weiss THEN S=1
                      IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Weiss OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Weiss THEN Z=1
                   ENDIF
                ENDIF
                IF M(M2(I))=0 THEN
                   IF I<8 THEN
                      IF I<4 THEN
                         K=I+4
                         IF M(M2(K))=Weiss THEN S=1
                         IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Weiss THEN Z=1
                      ELSE
                         K1=I-4:K2=I+4
                         IF M(M2(K1))=Weiss OR M(M2(K2))=Weiss THEN S=1
                         IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Weiss OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Weiss THEN Z=1
                      ENDIF
                   ELSE
                      IF I<12 THEN
                         K=I-4
                         IF M(M2(K))=Weiss THEN S=1
                         IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Weiss THEN Z=1
                      ELSE
                         K1=I-7+4*(I=15):K2=I-9-4*(I=12)
                         IF M(M1(K1))=Weiss OR M(M3(K2))=Weiss THEN S=1
                         IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Weiss OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Weiss THEN Z=1
                      ENDIF
                   ENDIF
                ENDIF
                IF M(M3(I))=0 THEN
                   IF I<12 THEN
                      K=I+3 OR 12
                      IF M(M2(I+1+4*((I AND 3)=3)))=Weiss THEN S=1
                      IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Weiss THEN Z=1
                   ELSE
                      K1=I-3+4*(I=15):K2=I-5-4*(I=12)
                      IF M(M1(K1))=Weiss OR M(M3(K2))=Weiss THEN S=1
                      IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Weiss OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Weiss THEN Z=1
                   ENDIF
                ENDIF
                IF S THEN Wwert=Wwert+1000
                IF Z THEN Wwert=Wwert+10000
             ENDIF
          ENDIF
          Wwert=Wwert+20
       ELSE
          IF S=Schwarz THEN
             IF Sset>1 THEN
                Swert=Swert+100
             ELSE
                S=0
                IF M(M1(I))=0 THEN
                   IF I<12 THEN
                      IF M(M2(I-1-4*((I AND 3)=0)))=Schwarz THEN S=S+1
                   ELSE
                      IF M(M1(I)-1)=Schwarz OR M(M1(I)+1)=Schwarz THEN S=S+1
                   ENDIF
                ENDIF
                IF M(M2(I))=0 THEN
                   IF I<8 THEN
                      IF I<4 THEN
                         IF M(M2(I+4))=Schwarz THEN S=S+1
                      ELSE
                         IF M(M2(I+4))=Schwarz OR M(M2(I-4))=Schwarz THEN S=S+1
                      ENDIF
                   ELSE
                      IF I<12 THEN
                         IF M(M2(I-4))=Schwarz THEN S=S+1
                      ELSE
                         IF M(M2(I)-1)=Schwarz OR M(M2(I)+1)=Schwarz THEN S=S+1
                      ENDIF
                   ENDIF
                ENDIF
                IF M(M3(I))=0 THEN
                   IF I<12 THEN
                      IF M(M2(I+1+4*((I AND 3)=3)))=Schwarz THEN S=S+1
                   ELSE
                      IF M(M3(I)-1)=Schwarz OR M(M3(I)+1)=Schwarz THEN S=S+1
                   ENDIF
                ENDIF
                IF S+Sset>1 THEN Swert=Swert+100
             ENDIF
          ELSE
             IF Sset THEN
                Swert=Swert+1000
             ELSE
                S=0:Z=0
                IF M(M1(I))=0 THEN
                   IF I<12 THEN
                      K=I+3 OR 12
                      IF M(M2(I-1-4*((I AND 3)=0)))=Schwarz THEN S=1
                      IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Schwarz THEN Z=1
                   ELSE
                      K1=I-11+4*(I=15):K2=I-13-4*(I=12)
                      IF M(M1(K1))=Schwarz OR M(M3(K2))=Schwarz THEN S=1
                      IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Schwarz OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Schwarz THEN Z=1
                   ENDIF
                ENDIF
                IF M(M2(I))=0 THEN
                   IF I<8 THEN
                      IF I<4 THEN
                         K=I+4
                         IF M(M2(K))=Schwarz THEN S=1
                         IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Schwarz THEN Z=1
                      ELSE
                         K1=I-4:K2=I+4
                         IF M(M2(K1))=Schwarz OR M(M2(K2))=Schwarz THEN S=1
                         IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Schwarz OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Schwarz THEN Z=1
                      ENDIF
                   ELSE
                      IF I<12 THEN
                         K=I-4
                         IF M(M2(K))=Schwarz THEN S=1
                         IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Schwarz THEN Z=1
                      ELSE
                         K1=I-7+4*(I=15):K2=I-9-4*(I=12)
                         IF M(M1(K1))=Schwarz OR M(M3(K2))=Schwarz THEN S=1
                         IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Schwarz OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Schwarz THEN Z=1
                      ENDIF
                   ENDIF
                ENDIF
                IF M(M3(I))=0 THEN
                   IF I<12 THEN
                      K=I+3 OR 12
                      IF M(M2(I+1+4*((I AND 3)=3)))=Schwarz THEN S=1
                      IF(M(M1(K)) AND M(M2(K)) AND M(M3(K)))=Schwarz THEN Z=1
                   ELSE
                      K1=I-3+4*(I=15):K2=I-5-4*(I=12)
                      IF M(M1(K1))=Schwarz OR M(M3(K2))=Schwarz THEN S=1
                      IF(M(M1(K1)) AND M(M2(K1)) AND M(M3(K1)))=Schwarz OR(M(M1(K2)) AND M(M2(K2)) AND M(M3(K2)))=Schwarz THEN Z=1
                   ENDIF
                ENDIF
                IF S THEN Swert=Swert+1000
                IF Z THEN Swert=Swert+10000
             ENDIF
          ENDIF
          Swert=Swert+20
       ENDIF
    ENDIF
    NEXT I
    Sz=0:Wz=0
    FOR I=0 TO 23
       IF M(I)=Weiss THEN
          FOR K=1 TO Nachbar%(0,I)
             IF M(Nachbar%(K,I))=0 THEN Wz=Wz+1
          NEXT K
       ELSE
          IF M(I)=Schwarz THEN
             FOR K=1 TO Nachbar%(0,I)
                IF M(Nachbar%(K,I))=0 THEN Sz=Sz+1
             NEXT K
          ENDIF
       ENDIF
    NEXT I: IF Sset+Sdrag<4 THEN Sz=1: ELSE IF Wset+Wdrag<4 THEN Wz=1
    Wf=Wset+Wdrag:Sf=Sset+Sdrag
    IF MOUSEBUT AND 2 THEN Display
    IF Wset AND Swert>=1000 THEN Swert=Swert-850
    IF Wwert>999 AND Sset=0 AND Sdrag>3 THEN
       Sf=Sf-1: IF Sf<3 THEN RETURN -2000000000
       IF Swert>=11000 THEN
          Swert=Swert-11000
       ELSE
          IF Swert>=1000 THEN
             Swert=Swert-1000
          ELSE
             IF Swert>=100 THEN
                Swert=Swert-100
             ENDIF
          ENDIF
       ENDIF
    ENDIF
    D=(Wz-(Wset>0 OR Wdrag=3)*(24-Wset-Wdrag-Sset-Sdrag)): IF D THEN Wwert=Wwert-500/D ELSE RETURN 2000000000
    D=(Sz-(Sset>0 OR Sdrag=3)*(24-Wset-Wdrag-Sset-Sdrag)): IF D THEN Swert=Swert-500/D ELSE RETURN -2000000000
 RETURN Swert-Wwert+(Sf-Wf)*2500
