ON BREAK GOSUB BHandle : BREAK ON
RANDOMIZE TIMER
DIM Karte#(91),BackS#(91),Weg%(32),Wert%(32),c%(4),Sp1%(16),Sp2%(16),Px%(16),Py%(16)
Pu1=0 : Pu2=0 : GP1=0 : GP2=0
OPEN "r",#1,"ram:Karten.rel",736
FIELD #1,736 AS Daten$
WINDOW 1,SPACE$(14)+"Bauern-Skat",,16,1
RESTORE Werte
FOR z=1 TO 32
  READ Wert%(z)
NEXT z : RESTORE Positionen
FOR z=1 TO 16 : READ Px%(z) : NEXT z
FOR z=1 TO 16 : READ Py%(z) : NEXT z
Werte:
  DATA 0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,2,2,2,2,3,3,3,3,4,4,4,4,11,11,11,11
Positionen:
  DATA 10,50,90,130,10,50,90,130,10,50,90,130,10,50,90,130
  DATA 0,0,0,0,50,50,50,50,110,110,110,110,160,160,160,160
GOSUB Spielerzahl
Start:
  Dran=2 : Dran1=2 : GP1=0 : GP2=0
Start2:
  CLS : GOSUB Kartengeben : Dran=Dran1
  FOR Stich=1 TO 16
    GOSUB Stiche
  NEXT Stich
  LOCATE 1,21 : PRINT "Spieler 1 :";Pu1
  LOCATE 1,37 : PRINT GP1;
  LOCATE 25,21: PRINT "Spieler 2 :";Pu2;
  LOCATE 25,37 : PRINT GP2;
  IF Pu1>Pu2 THEN GP1=GP1+1 
  IF Pu2>Pu1 THEN GP2=GP2+1
  IF Pu1=Pu2 THEN
    IF Dran1=1 THEN GP2=GP2+1
    IF Dran1=2 THEN GP1=GP1+1
  END IF
  GOSUB Lach
  IF Dran1=1 THEN Dran1=2 ELSE Dran1=1
  FOR w=1 TO 6000 : NEXT w
  CLS
GOTO Start2

Kartengeben:
  FOR z=1 TO 32 : Weg%(z)=0 : NEXT z : Pu1=0 : Pu2=0
  FOR z=1 TO 16 : Sp1%(z)=0 : Sp2%(2)=0 : NEXT z
  LOCATE 1,21 : PRINT "Spieler 1 : ???";
  LOCATE 1,37 : PRINT GP1;
  LOCATE 25,21: PRINT "Spieler 2 : ???";
  LOCATE 25,37 : PRINT GP2;
  GOSUB DrawEnde
  FOR z=1 TO 16
   Nochmal1:
    zu=INT(1+RND(1)*32)
    IF Weg%(zu)=1 THEN Nochmal1
    Sp1%(z)=zu : Weg%(zu)=1
  NEXT z
  FOR z=1 TO 16
   Nochmal2:
    zu=INT(1+RND(1)*32)
    IF Weg%(zu)=1 THEN Nochmal2
    Sp2%(z)=zu : Weg%(zu)=1
  NEXT z
  GET #1,33 : GOSUB LadeBild
  FOR z=0 TO 91 : BackS#(z)=Karte#(z) : NEXT z
  IF Dran1=1 THEN St=1 : En=16 : Ste=1 ELSE St=16 : En=1 : Ste=-1
  FOR z=St TO En STEP Ste
    IF z<=4 OR z>12 THEN PUT (Px%(z),Py%(z)),Karte#,PSET
    IF z>8 AND z<=12 THEN PUT (Px%(z-4),Py%(z-4)),Karte#,PSET
    IF z>4 AND z<=8 THEN PUT (Px%(z+4),Py%(z+4)),Karte#,PSET
    SOUND 200,.1,255,0
  NEXT z
  FOR s=St TO En STEP Ste
    IF s<=4 THEN GET #1,Sp1%(s)
    IF s>4 AND s<=8 THEN GET #1,Sp2%(s-4)
    IF s>8 AND s<=12 THEN GET #1,Sp1%(s-4)
    IF s>12 THEN GET #1,Sp2%(s-8)
    GOSUB LadeBild
    IF s<=4 OR s>12 THEN PUT (Px%(s),Py%(s)),Karte#,PSET
    IF s>8 AND s<=12 THEN PUT (Px%(s-4),Py%(s-4)),Karte#,PSET
    IF s>4 AND s<=8 THEN PUT (Px%(s+4),Py%(s+4)),Karte#,PSET
    IF s=4 AND Ste=1 THEN GOSUB Trumpf
    IF s=13 AND Ste=-1 THEN GOSUB Trumpf
    SOUND 200,.1,255,0
  NEXT s
RETURN

LadeBild:
  h=1
  FOR z=0 TO 91
    Karte#(z)=CVD(MID$(Daten$,h,h+7))
    h=h+8
  NEXT z
RETURN

Trumpf:
    IF Dran1=1 THEN
      LOCATE 2,23 : PRINT Sp1$: LOCATE 3,23 : PRINT "Was ist Trumpf?"
      y1=0 : y2=45 : GOSUB Waehlen
      LOCATE 2,23 : PRINT "          " : LOCATE 3,23 : PRINT "               "
     ELSE
      LOCATE 23,23 : PRINT Sp2$ : LOCATE 24,23 : PRINT "Was ist Trumpf?"
      y1=160 : y2=205 : GOSUB Waehlen
      LOCATE 23,23 : PRINT "          " : LOCATE 24,23 : PRINT "               "
    END IF
RETURN

Waehlen:
  test=MOUSE(0) : x=0 : y=0
  WHILE MOUSE(0)=0
    x=MOUSE(1) : y=MOUSE(2)
  WEND
  SOUND 500,1,255,3
  IF y>87 AND y<111 AND x>255 AND x<313 THEN 
    GOSUB EndeSpiel
    IF Neu=1 THEN GOTO Ehrung
  END IF
  IF y>y1 AND y<y2 THEN
    p=INT((x-6)/40)+1
    IF p<1 OR p>4 THEN Waehlen
    IF y1=0 THEN Tr=Sp1%(p) ELSE Tr=Sp2%(p+4)
    FOR h=1 TO 7
      Tr=Tr-4 : IF Tr<1 THEN Tr=Tr+4 : GOTO Fertig1
    NEXT h
    Fertig1:
    IF Tr=1 THEN Tr$="Karo"
    IF Tr=2 THEN Tr$="Herz"
    IF Tr=3 THEN Tr$="Pik"
    IF Tr=4 THEN Tr$="Kreuz"
   ELSE
    GOTO Waehlen
  END IF
  LOCATE 13,2 : PRINT "Trumpf ist ";Tr$;"  "
RETURN

Stiche:
  IF Dran=1 THEN
    LOCATE 2,23 : PRINT Sp1$ : LOCATE 3,23 : PRINT "Spielen Sie!"
    y1=0 : y2=95 : GOSUB Waehl : Kart=he : GOSUB Markieren1
    LOCATE 2,23 : PRINT "         " : LOCATE 3,23 : PRINT "            "
     Falsch1:
      LOCATE 23,23 : PRINT Sp2$ : LOCATE 24,23 : PRINT "Antworten Sie!"
      y1=110 : y2=205 : GOSUB Waehl : GOSUB Erlaubt : IF Falsch=1 THEN GOSUB Motz : GOTO Falsch1
      GOSUB Markieren2
      LOCATE 23,23 : PRINT "         " : LOCATE 24,23 : PRINT "              "
    GOSUB Gewinner
    IF Ge$="Ero" THEN
      Pu1=Pu1+Wert%(Sp1%(Kart))+Wert%(Sp2%(he)) : Dran=1
      PUT (280,28),BackS#,PSET
    END IF
    IF Ge$="Ant" THEN 
      Pu2=Pu2+Wert%(Sp1%(Kart))+Wert%(Sp2%(he)) : Dran=2
      PUT (280,130),BackS#,PSET
    END IF
    FOR w=1 TO 1000 : NEXT w
    LINE (170,82)-(235,127),0,bf
    Sp1%(Kart)=0 : Sp2%(he)=0
    IF Kart<9 THEN
      GET #1,Sp1%(Kart+8) : GOSUB LadeBild : SOUND 300,.1,255,0
      PUT (Px%(Kart),Py%(Kart)),Karte#,PSET
    END IF
    IF he<9 THEN 
      GET #1,Sp2%(he+8) : GOSUB LadeBild : SOUND 300,.1,255,0
      PUT (Px%(he+8),Py%(he+8)),Karte#,PSET
    END IF    
    FOR w=1 TO 1000 : NEXT w
    LINE (170,82)-(231,127),0,bf
   ELSE
    LOCATE 23,23 : PRINT Sp2$ : LOCATE 24,23 : PRINT "Spielen Sie!"
    y1=110 : y2=205 : GOSUB Waehl : Kart=he : GOSUB Markieren1
    LOCATE 23,23 : PRINT "         " : LOCATE 24,23 : PRINT "            "
    Falsch2:
    LOCATE 2,23 : PRINT Sp1$ : LOCATE 3,23 : PRINT "Antworten Sie!"
    y1=0 : y2=95 : GOSUB Waehl : GOSUB Erlaubt : IF Falsch=1 THEN GOSUB Motz : GOTO Falsch2
    GOSUB Markieren2
    LOCATE 2,23 : PRINT "         " : LOCATE 3,23 : PRINT "              "
    GOSUB Gewinner
    IF Ge$="Ero" THEN 
      Pu2=Pu2+Wert%(Sp2%(Kart))+Wert%(Sp1%(he)) : Dran=2
      PUT (280,130),BackS#,PSET
    END IF
    IF Ge$="Ant" THEN
      Pu1=Pu1+Wert%(Sp2%(Kart))+Wert%(Sp1%(he)) : Dran=1
      PUT (280,28),BackS#,PSET
    END IF
    FOR w=1 TO 1000 : NEXT w
    LINE (170,82)-(235,127),0,bf
    Sp1%(he)=0 : Sp2%(Kart)=0
    IF Kart<9 THEN
      GET #1,Sp2%(Kart+8) : GOSUB LadeBild : SOUND 300,.1,255,0
      PUT (Px%(Kart+8),Py%(Kart+8)),Karte#,PSET
    END IF
    IF he<9 THEN 
      GET #1,Sp1%(he+8) : GOSUB LadeBild : SOUND 300,.1,255,0
      PUT (Px%(he),Py%(he)),Karte#,PSET
    END IF    
  END IF
RETURN
    
Gewinner:
  IF y1=0 THEN Ant=Sp1%(he) : Ero=Sp2%(Kart)
  IF y1>0 THEN Ant=Sp2%(he) : Ero=Sp1%(Kart)
  Ant1=Ant : Ero1=Ero
  FOR a=1 TO 7
    Ant1=Ant1-4 : IF Ant1<1 THEN Ant1=Ant1+4 : a=8
  NEXT a
  FOR a=1 TO 7
    Ero1=Ero1-4 : IF Ero1<1 THEN Ero1=Ero1+4 : a=8
  NEXT a
  IF Ero1=Ant1 AND Ant1<>Tr THEN
    IF Ant>Ero THEN Ge$="Ant" ELSE Ge$="Ero"
    IF (Ero>=13 AND Ero<=16) AND Ant<29 AND (Ant<17 OR Ant>20) THEN Ge$="Ero"
    IF (Ant>=13 AND Ant<=16) AND Ero<29 AND (Ero<17 OR Ero>20) THEN Ge$="Ant"
    IF (Ero>=17 AND Ero<=20) THEN Ge$="Ero"
    IF (Ant>=17 AND Ant<=20) THEN Ge$="Ant"
    RETURN
  END IF
  IF Ero1<>Ant1 AND Ant1<>Tr AND (Ant<17 OR Ant>20) THEN Ge$="Ero" : RETURN
  IF Ero1=Tr AND Ant1<>Tr AND (Ant<17 OR Ant>20) THEN Ge$="Ero" : RETURN
  IF Ero1<>Tr AND (Ero<17 OR Ero>20) AND (Ant1=Tr OR (Ant>=17 AND Ant<=20)) THEN Ge$="Ant" : RETURN
  IF Ero1=Tr AND (Ero<17 OR Ero>20) AND (Ant>=17 AND Ant<=20) THEN Ge$="Ant" : RETURN
  IF Ant1=Tr AND (Ant<17 OR Ant>20) AND (Ero>=17 AND Ero<=20) THEN Ge$="Ero" : RETURN
  IF Ero1=Tr AND Ant1=Tr THEN
    IF Ero<Ant THEN Ge$="Ant" ELSE Ge$="Ero"
    IF (Ero>=13 AND Ero<=16) AND Ant<29 AND (Ant<17 OR Ant>20) THEN Ge$="Ero"
    IF (Ant>=13 AND Ant<=16) AND Ero<29 AND (Ero<17 OR Ero>20) THEN Ge$="Ant"
    IF (Ero>=17 AND Ero<=20) THEN Ge$="Ero"
    IF (Ant>=17 AND Ant<=20) THEN Ge$="Ant"
    RETURN
  END IF
  IF (Ero>=17 AND Ero<=20) AND Ant=Tr AND (Ant<17 OR Ant>20) THEN Ge$="Ero" : RETURN
  IF (Ant>=17 AND Ant<=20) AND Ero=Tr AND (Ero<17 OR Ero>20) THEN Ge$="Ant" : RETURN
  IF (Ero>=17 AND Ero<=20) AND (Ant>=17 AND Ant<=20) THEN
    IF Ant>Ero THEN Ge$="Ant" ELSE Ge$="Ero"
    RETURN
  END IF
RETURN
  
Waehl:
  test=MOUSE(0) : x=0 : y=0
  WHILE MOUSE(0)=0
    x=MOUSE(1) : y=MOUSE(2)
  WEND
  SOUND 600,1,255,3
  IF y>87 AND y<111 AND x>255 AND x<313 THEN 
    GOSUB EndeSpiel
    IF Neu=1 THEN GOTO Ehrung
  END IF
  IF y<y1 OR y>y2 THEN Waehl
  IF x<6 OR x>164 THEN Waehl
  IF y>(y1+47) AND y<y2 THEN r=4 ELSE r=0
  p=INT((x-6)/40)+1
  IF p<1 OR p>4 THEN Waehl
  IF y1=0 AND Sp1%(p+r)=0 THEN 
    r=r+8
    IF Sp1%(p+r)=0 THEN Waehl
  END IF  
  IF y1<>0 AND Sp2%(p+r)=0 THEN 
    r=r+8
    IF Sp2%(p+r)=0 THEN Waehl
  END IF
  he=p+r
RETURN

Erlaubt:
  Falsch=0
  IF y1=0 THEN h1=Sp2%(Kart) : h2=Sp1%(he)
  IF y1>0 THEN h1=Sp1%(Kart) : h2=Sp2%(he)
  j1=h1 : j2=h2
  FOR l=1 TO 7
    j1=j1-4 : IF j1<1 THEN j1=j1+4 : l=8
  NEXT l
  FOR l=1 TO 7
    j2=j2-4 : IF j2<1 THEN j2=j2+4 : l=8
  NEXT l
  IF j1=Tr AND j2=Tr THEN RETURN
  IF j1=Tr AND (h2>=17 AND h2<=20) THEN RETURN
  IF (h1>=17 AND h1<=20) AND j2=Tr THEN RETURN
  IF (h1>=17 AND h1<=20) AND (h2>=17 AND h2<=20) THEN RETURN
  IF j1=j2 AND (h2<17 OR h2>20) AND (h1<17 OR h1>20) THEN RETURN
  IF j1<>Tr AND (j2=Tr OR (h2>=17 AND h2<=20)) THEN Keinj1
  IF j1<>j2 THEN Keinj1
  IF (h1>=17 AND h1<=20) AND j2<>Tr AND (h2<17 OR h2>20) THEN Keinj1
  IF (j1=Tr OR (h1>=17 AND h1<=20)) AND j2<>Tr THEN Keinj1
  Falsch=1 : RETURN
  Keinj1:
  FOR l=1 TO 8
    IF y1=0 THEN k=Sp1%(l) : IF k=0 THEN k=Sp1%(l+8)
    IF y1>0 THEN k=Sp2%(l) : IF k=0 THEN k=Sp2%(l+8)
    ki=k
    FOR kl=1 TO 7
      k=k-4 : IF k<1 THEN k=k+4 : kl=8
    NEXT kl
    IF h1>=17 AND h1<=20 THEN
      IF k=Tr OR (ki>=17 AND ki<=20) THEN Falsch=1 : RETURN
      GOTO Ueberspr
    END IF
    IF j1=Tr THEN
      IF k=Tr OR (ki>=17 AND ki<=20) THEN Falsch=1 : RETURN
      GOTO Ueberspr
    END IF
    IF j1=k AND (ki<17 OR ki>20) THEN Falsch=1 : RETURN
   Ueberspr:
  NEXT l
RETURN

Markieren1:
  IF y1=0 THEN y=0 : GET #1,Sp1%(Kart) ELSE y=110 : GET #1,Sp2%(Kart)
  GOSUB LadeBild
  Po=Kart : SOUND 300,.1,255,0 : PUT (170,82),Karte#,PSET
  GOTO Spare
RETURN

Markieren2:
  IF y1=0 THEN y=0 : GET #1,Sp1%(he) ELSE y=110 : GET #1,Sp2%(he)
  GOSUB LadeBild : Po=he : SOUND 300,.1,255,0 : PUT (203,82),Karte#,PSET
 Spare:
  IF Po>8 THEN Po=Po-8
  IF y1=0 THEN PUT (Px%(Po),Py%(Po)),Karte#,XOR
  IF y1>0 THEN PUT (Px%(Po+8),Py%(Po+8)),Karte#,XOR
  IF y1=0 AND he<9 THEN PUT (Px%(Po),Py%(Po)),BackS#,PSET
  IF y1>0 AND he<9 THEN PUT (Px%(Po+8),Py%(Po+8)),BackS#,PSET
RETURN

Spielerzahl:
 CLS : LOCATE 3,3 : PRINT "Hallo Spieler 1, Ihren Namen bitte :"
 LOCATE 5,5 : PRINT "(10 Buchst.)"; : INPUT Sp1$
 IF LEN(Sp1$)>10 THEN Sp1$=LEFT$(Sp1$,10)
 LOCATE 10,3 : PRINT "Nun zu Spieler 2, Ihren Namen bitte : "
 LOCATE 12,5 : PRINT "(10 Buchst.)"; : INPUT Sp2$
 IF LEN(Sp2$)>10 THEN Sp2$=LEFT$(Sp2$,10)
RETURN

Motz:
  SOUND WAIT
  SOUND 300,3,255,0 : SOUND 300,4,0,0 : SOUND 200,3,255,0
  SOUND RESUME
RETURN

Lach:
  FOR s=150 TO 700 STEP 50
    SOUND s,2,255,1
  NEXT s
RETURN

Load3:

RETURN

DrawEnde:
  LINE (255,87)-(303,111),6,b : LOCATE 13,34 : PRINT "ENDE";
RETURN

EndeSpiel:
  Neu=0 : WINDOW 2,SPACE$(16)+"Ende?",(0,0)-(300,180),0,1
  WINDOW 2 : SOUND 700,18,255,2
  LOCATE 10,8 : PRINT "Weiter im Programm?"
  LOCATE 15,12 : PRINT "Programm beenden?"
  LINE (47,63)-(215,87),12,b
  LINE (79,103)-(231,127),12,b
 Falsch3:
  test=MOUSE(0) : xx=0 : yy=0
  WHILE MOUSE(0)=0
    xx=MOUSE(1) : yy=MOUSE(2)
  WEND
  IF xx>47 AND xx<215 AND yy>63 AND yy<87 THEN WINDOW CLOSE 2 : RETURN
  IF xx>79 AND xx<231 AND yy>103 AND yy<127 THEN WINDOW CLOSE 2 : Neu=1 : RETURN
 GOTO Falsch3
 
Ehrung:
  IF GP1=0 AND GP2=0 THEN LIBRARY CLOSE : SCREEN CLOSE 1 : END
  CLS : GOSUB Load3 : LOCATE 2,14 : PRINT "Sieger ist"
  PALETTE 6,0,0,0 : PALETTE 7,0,0,0 : PALETTE 8,0,0,0
  FOR w=1 TO 2000 : NEXT w
  LINE (140,120)-(159,160),6,bf : LINE (161,140)-(180,160),6,bf
  LINE (141,119)-(149,111),7 : LINE -(168,111),7 : LINE -(160,119),7
  LINE -(141,119),7 : PAINT (150,115),7,7
  LINE (161,140)-(170,131),7 : LINE -(189,131),7 : LINE -(180,140),7
  LINE -(161,140),7 : PAINT (171,135),7,7
  LINE (168,112)-(168,132),8 : LINE -(160,140),8 : LINE -(160,120),8
  LINE -(168,112),8 : PAINT (165,120),8,8
  LINE (189,132)-(189,151),8 : LINE -(181,159),8 : LINE -(181,140),8
  LINE -(189,132),8 : PAINT (185,145),8,8 : LINE (160,140)-(160,160),8
  PALETTE 6,15/16,15/16,15/16 : PALETTE 7,13/16,13/16,13/16 : PALETTE 8,5/16,5/16,5/16 
  COLOR 1,6 : LOCATE 17,19 : PRINT "1"; : LOCATE 19,22 : PRINT "2"; : COLOR 1,0
  FOR w=1 TO 3000 : NEXT w
  IF GP1>GP2 THEN
    LOCATE 14,20-LEN(Sp1$) : PRINT Sp1$;
    LOCATE 16,23 : PRINT Sp2$;
   ELSEIF GP2>GP1 THEN
    LOCATE 14,20-LEN(Sp2$) : PRINT Sp2$;
    LOCATE 16,23 : PRINT Sp1$;
  END IF
  IF GP1=GP2 THEN
    LOCATE 14,20-LEN(Sp1$) : PRINT Sp1$;
    LOCATE 13,20-LEN(Sp2$) : PRINT Sp2$;
  END IF
  FOR w=1 TO 4000 : NEXT w
  LOCATE 22,7 : PRINT "Doch dabei sein ist alles!";
  FOR w=1 TO 3000 : NEXT w
  LOCATE 16,23 : PRINT "         ";
  FOR z=0 TO 20
    LINE (161,140-z)-(170,131-z),7 : LINE -(189,131-z),7 : LINE -(180,140-z),8
    LINE -(161,140-z),6 : PSET (160,140-z),8 : FOR w=1 TO 50 : NEXT w
  NEXT z
  IF GP1>GP2 THEN
    LOCATE 14,23
    PRINT Sp2$;
  END IF
  IF GP2>GP1 THEN LOCATE 14,23 : PRINT Sp1$;
  LOCATE 24,3 : PRINT "Bitte linke Maustaste betätigen!";
  test=MOUSE(0) : WHILE MOUSE(0)=0 : WEND
  LIBRARY CLOSE : SCREEN CLOSE 1
END

BHandle:
  WINDOW 2,"Zum beenden bitte <Ende> benutzen!",(20,100)-(300,107),0,1
  LOCATE 1,16 : PRINT "OK?";
  test=0
  WHILE MOUSE(0)=0 : WEND
  WINDOW CLOSE 2
RETURN

