BlitzTac - Windowsanwendung für eine Tac-Kartenverwaltung

Übersicht Sonstiges Projekte

Neue Antwort erstellen

 

bonajkukoj

Betreff: BlitzTac - Windowsanwendung für eine Tac-Kartenverwaltung

BeitragFr, Mai 29, 2020 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Kennt jemand das tolle Brett/Kartenspiel Tac? (Infos auf spieltac.de)

Da man das nur zu viert spielen kann, hatte ich coronabedingt die Motivation, meine 10 Jahre zurückliegenden BlitzBasic-Gehversuche auszubauen und mich an mein erstes vollständiges Programm zu wagen.

Gleich die erste große Hürde war für mich absoluten Laien eine Multiplayer-Verbindung hinzubekommen. Nachdem ich viele graue Haare wegen zufällig nicht ankommenden UDP-Paketen bekommen hatte, habe ich festgestellt, dass für so ein rundenbasiertes Spiel TCP ja absolut unkompliziert läuft.

Falls jemand von euch Tac kennt, oder auch nicht, ich freue mich über jede Form von Feedback.

Hier ein paar Screenshots:
user posted image
user posted image
user posted image

Das Programm ist noch nicht besonders bequem benutzbar, aber es läuft erstmal und hat alle nötigen Funktionen. Wenn ich noch Zeit finde, bastel ich gerne daran weiter.

Download der Exe und einer Anleitung:
EDIT: fmod.dll zum Download hinzugefügt, damit das Programm auch bei jedem läuft.

https://www.blitzforum.de/upload/file.php?id=13435


Hier der Code bei Interesse:

Code: [AUSKLAPPEN]

;BlitzTac Version 1.0
;
;
;by André Callegaro
;
;
;TO-DO-LISTE für kommende Versionen:
;Hauptmenü
;grafische Benutzeroberfläche zum login
;Aussuchen der Spielreihenfolge
;Host kann Zug rückgängig machen
;Sonderfälle Tac: prüfen/einbauen
;tac nach tac nach teufel??
;Irrer Sonderfall: a:8, b wirft Narr ab, c Tac-->durch Narr bekommt er noch einen Tac, was tut dieser? 8 nochmal finden
;bug mit foolTac bei Engel (nach getEigth)


;globale Konstanten, Arrays:
Dim client%(2)                   ;Hier werden die drei Client-Streams für den Host gespeichert
Global clients%=0                ;Anzahl der angemeldeten Clients
Global ip$=""                        ;Server-IP für Clients
Dim name$(3)                   ;Namen der 4 Spieler in Spielreihenfolge
Global port%=54322                ;Serverport, muss beim Host freigeschaltet werden
Dim event$(4)                   ;5 letzte Züge werden rechts oben angezeigt
Dim card%(103)                   ;Name ist Position im Stapel, Inhalt ist Kartentyp (z.B. 0-8 eine 1), Wert 104 ist leer/ausgespielt.
Dim temp%(5)                   ;Hilfsarray für tauschen und Teufel
Dim paint%(3)                   ;Hilfsarray zum zeichnen
Dim move$(8)                   ;Speichert die letzten 9 ausgespielten Karten als String
Global stream = 0                ;Sende- und Empfangsstream         
Global counter% = 0                ;Spielposition, 0 = Host = fängt an
Global host=2                   ;Client (0) oder Host(1)?
Global round=0                   ;wer ist dran? bei 0 ist host dran, 1-3 Clients, 99 Kartentausch, 98 fertig getauscht
Global cardCounter=0              ;um zu prüfen, ob 5 oder 6 Karten ausgeteilt werden
Global isFool%=False             ;um zu prüfen, ob der Narr gespielt wurde
Global isDevil%=False             ;um zu prüfen, ob der Teufel gespielt wurde
Global throwsAway=False             ;um zu prüfen, ob ausgesetzt wird
Global isTac=False                ;um zu prüfen, ob ein Tac gespielt wurde
Global foolTac=False             ;Wenn ein abgeworfener Narr getacct werden kann
Global isEigth=False             ;Wenn eine 8 durch einen Tac wieder aktiviert wird

;Farben
Global bground=$778899              ;Hintergrundfarbe
Global lineColor=$000000              ;Linienfarbe schwarz
Global cardColor=$FFFFFF            ;Kartenfarbe weiß
Global textColor=$000000             ;Textfarbe  schwarz
Global activeColor=$DA07D6           ;aktiver Kreis
Global redColor=$EE0000              ;rot, Daumen runter und Sonderkarten 1,4,7,8,13
Global greenColor=$00EE00            ;grün, Daumen hoch

AppTitle "BlitzTac"             ;Programmablauf
login()
game()
close()


Function login()                             ;Startbildschirm zum Verbinden, Namen speichern
Print ""
Print ""
Print ""
Print "Willkommen bei BlitzTac!" 
Print ""
h$=Input("Bitte 1 eingeben, um einen Server zu "+Chr(148)+"ffnen, 0 um einem Server beizutreten: ")
Repeat
   If h="1" Then
      host=1
   ElseIf h="0" Then
      host=0
   Else
      h=Input("Auswahl falsch, bitte 1 oder 0 eintippen: ")
   EndIf
Until host <2
currentName$=""
While currentName$=""
   currentName=Input("Wie ist dein Name? ")
   If Len(currentName)>11 Then currentName=Input("W"+Chr$(132)+"hle lieber einen k"+Chr(129)+"rzeren Namen f"+Chr(129)+"r eine bessere Darstellung: ")
Wend
If host Then                                     ;Für den Host, Stream aufbauen, 3 Clients hinzufügen
   name(0)=currentName
   stream = CreateTCPServer(port)
   If stream = 0 Then
      Print "Verbindung konnte nicht aufgebaut werden."
      timer=CreateTimer(1)           ;1 Sekunde warten
      WaitTimer(timer)
      FreeTimer timer
      close()
   Else
      Print "Hallo "+name$(0) +", die Verbindung wurde aufgebaut."
       Print "Du spielst auf Position 1, warte auf Mitspieler..."
      Print "Finde deine IP auf www.wieistmeineip.de heraus und teile sie deinen Mitspielern mit."
      counter=0
      Repeat    ;auf Clients horchen, Namen speichern und Position zurückgeben
         currentClient=AcceptTCPStream (stream)
         If currentClient <> 0 Then
            client(clients)=currentClient
            currentClient=0
            name$(clients+1)=ReadString(client(clients))
            WriteByte client(clients), (clients+1)      ;Counter wird verschickt, also 1-3
            Print name$(clients+1)+" hat sich erfolgreich verbunden und spielt auf Position "+(clients+2)
            clients=clients+1
         EndIf
      Until clients=3
   EndIf
Else                                          ;Für die Clients, IP übernehmen und mit Host verbinden
   ip=Input("Hallo "+currentName$+", um dich zu verbinden, gib die IP des Servers ein: ")
   stream = OpenTCPStream (ip, port)
   If stream = 0
      Print "Verbindung konnte nicht aufgebaut werden."
      timer=CreateTimer(1)           ;1 Sekunde warten
      WaitTimer(timer)
      FreeTimer timer
      close()
   Else
      WriteString stream, currentName
      counter=0
      While counter=0
         If ReadAvail(stream) Then
            counter=ReadByte(stream)
            Print "Verbindung wurde hergestellt, du spielst auf Position "+(counter+1)
         EndIf
      Wend
   EndIf
EndIf
init()
End Function

Function init()                    ;Initialisierung, ASCII-Umwandlung der Namen, noch nicht alle Zeichen möglich, Namen verschicken
   If host Then
      For i = 0 To 4                ;Arrays werden leer initialisiert
         event(i)=""
      Next
      For i=0 To 8
         move(i)=""
      Next
      For i = 0 To 5
         temp(i)=0
      Next
      For i = 0 To 3
         paint(i)=0
      Next
      For i=0 To 3 
         correctASCII(i)         ;Sonderzeichen in Namen werden angepasst
      Next
      For i=0 To 2
         For j=0 To 3
            WriteString client(i), name(j)       ;an jeden Client alle Namen schicken
         Next
      Next
      Print "Spiel wird gestartet..."
   Else
      Print "Spiel wird gestartet..."
      check=0
      Repeat
         If ReadAvail(stream) Then            ;Namen empfangen und speichern
            For i=0 To 3
               name(i)=ReadString(stream)
            Next
            check=1
         EndIf
      Until check=1
   EndIf
End Function

Function game()                             ;Spielfunktion, je nachdem ob Host (1) oder Client (0)
   Graphics 800,600,32,2
   SetBuffer BackBuffer()
   SeedRnd MilliSecs()
   Repeat                                     ;Hauptspielroutine, Karten immer wieder neu mischen
      If host Then                              ;Routine für Host
         cardCounter=0                          ;Kartenzähler zurücksetzen
         shuffleCards()                         ;Karten werden neu gemischt
         For i=0 To 4                             ;5 Mal werden Karten verteilt, letztes Mal mit 6 Karten pro Person
            cardCounter=20*i                   ;Kartenzähler wird angepasst
            t=round                            ;Runde wird zwischengespeichert, dann Kartentausch
            round=99
            update()                         ;Spieldaten verschicken, Spielfeld zeichnen
            swapCards()                         ;Karten tauschen
            cardsLeft=20                      ;Zähler für die vorhandenen Karten
            If cardCounter>=80 Then cardsLeft=24
            For k=0 To 5                        ;6 Karten werden der Reihe nach ausgespielt (nur beim letzten Mal, sonst vorher exit)
               If k=5 And i<4 Then Exit
               For j=0 To 3                    ;4 Spieler machen ihren Zug
                  If isFool=True Then            ;Manipulation von Runde und j wieder richten
                     If j=3 And (k=5 Or (k=4 And i<4)) Then
                        foolCorrect=True
                        Exit   
                     EndIf                  
                     isFool=False
                     foolCorrect=True             ;Problem des falschen Gebers nach Narr ausgleichen
                  EndIf
                  If cardsLeft=0 Then Exit       ;wenn alle Karten schon gespielt wurden
                  If round=98 Then round=t
                  If isDevil Then
                     For l=0 To 5                           ;Karten des Teufel-Spielers werden zwischengespeichert
                        If l=5 And cardCounter<80 Then Exit
                        temp(l)=card(cardCounter+4*l+round)
                        card(cardCounter+4*l+round)=card(cardCounter+4*l+correctInc(round,1))
                     Next
                  EndIf
                  update()                               ;Spieldaten aktualisieren
                  If round=0 Then                        ;wenn Host spielt
                     If isEigth Then                      ;wenn eine 8 reaktiviert wurde
                        getEigth(1)
                        Exit
                     Else
                        cardNumber=pickCard(0,"Bitte mit 1 bis 6 eine Karte auswählen.")
                     EndIf
                  Else                                      ; wenn Clients spielen
                     check=0
                     Repeat                             ;warten auf Eingabe des Clients
                        If ReadAvail(client(round-1)) Then
                           cardNumber=ReadInt(client(round-1))
                           check=1                  
                        EndIf
                     Until check=1
                     If isEigth Then
                        If cardNumber=0 Then getEigth(0) Else getEigth(-1)
                        Exit
                     EndIf
                  EndIf
                  If isDevil Then
                     isDevil=False
                     For l=0 To 5                           ;Karten des Teufel-Spielers werden wieder angezeigt
                        If l=5 And cardCounter<80 Then Exit
                        card(cardCounter+4*l+round)=temp(l)
                     Next
                     round=correctInc(round,1)                  ;ausgespielt wird die Karte des nächsten Spielers
                  EndIf
                  neg%=0
                  If cardNumber<0 Then                        ;wenn bei einer 8 der nächste Spieler aussetzen soll
                     cardNumber = 0-cardNumber
                     neg%=0-card(cardNumber)
                  EndIf   
                  If cardNumber=104 Then                     ;Sonderfall, erste Karte (0) kann nicht negativ gemacht werden
                     cardNumber=0
                     neg=0-card(cardNumber)
                  EndIf
                  If neg<0 Then
                     updateEvent(neg)                  ;negative Zahl für zusätzlichen Text   
                  Else
                     If card(cardNumber)>88 And card(cardNumber)<93 And (Not throwsAway) Then isTac=True ;Wenn ein Tac gespielt wurde
                     updateEvent(card(cardNumber))         ;aktiver Spieler spielt aktive Karte
                  EndIf
                  If (Not throwsAway) Then
                     If move(0)="den Narren" Then isFool=True        ;Narr gespielt
                     If move(0)="den Teufel" Then isDevil=True      ;Teufel gespielt
                  EndIf
                  If throwsAway Then throwsAway=0        ;nach dem Abwerfen wieder normal
                  If neg<0 Then throwsAway=1            ;damit im nächsten Zug keine Sonderfunktion ausgelöst wird
                  card(cardNumber)=104                  ;ausgespielte Karte wird "deaktiviert"      
                  cardsLeft=cardsLeft-1                   ;Übrige Karten aktualisiert      
                  If (Not isFool) And (Not isDevil) And (Not isEigth) Then round=correctInc(round,1)      ;aktiver Spieler wird angepasst
                  If isFool Then fool()
               Next
            Next
            round=correctInc(round,1)                   ;beim neuen Mischen verschiebt sich die Runde
            If foolCorrect=True Then
               round=correctInc(round,1)
               foolCorrect=False
            EndIf   
         Next
      Else                                        ;Hauptstpiel Client
         If round<>99 Then update()
         If round=99 Then swapCards()
         If counter=round Then                           ;wenn dieser Client dran ist
            If isEigth Then
               cardNumber=pickEigth(round)
            Else
               cardNumber=pickCard(0,"Bitte mit 1 bis 6 eine Karte auswählen.")
            EndIf
            WriteInt stream, cardNumber
         EndIf
      EndIf
   Until KeyHit(1)         ;momentan beendet das Programm bei esc einfach sofort.
End Function

Function shuffleCards()                           ;Array card initialisieren und neu mischen
   For i = 0 To 103
      card(i)=i
   Next
   For i = 0 To 1000
      j=Rand(0,103)
      k=Rand(0,103)
      If j=k Then
         k=j+1
         If k=104 Then k=0
      EndIf
      l=card(j)
      card(j)=card(k)
      card(k)=l
   Next
End Function
   
Function swapCards()            ;Karten tauschen
   cardNumber=pickCard(1,"Welche Karte möchtest du tauschen? Drücke 1 bis 6")
   partner=correctInc(partner,2)
   message("Du tauschst "+getCard(card(cardNumber))+", warte auf "+name(partner)+".")
   If host Then
      temp(counter)=cardNumber
      check=0      ;Client-Tauschkarten ermitteln
      Repeat
         For i=0 To 2
            If ReadAvail(client(i)) Then
               tcounter=ReadInt(client(i))
               temp(tcounter)=ReadInt(client(i))
               check=check+1
            EndIf
         Next
      Until check=3
      round=98   ;von tauschen auf getauscht umschalten
      i=card(temp(0))
      card(temp(0))=card(temp(2))
      card(temp(2))=i
      i=card(temp(1))
      card(temp(1))=card(temp(3))
      card(temp(3))=i
   Else                 ;Für die Clients
      WriteInt stream, counter
      WriteInt stream, cardNumber
   EndIf
   update() ;neue Karten anzeigen
   message("Du hast von "+name(partner)+" "+getCard(card(cardNumber))+" bekommen.")
   timer=CreateTimer(0.4)           ;neue Karte 2,5 Sekunden anzeigen
   WaitTimer(timer)
   FreeTimer timer
End Function   

Function update()
;allen Spielern veränderte Daten schicken: Runde, Cardcounter, Ereignisse 0-4, Karten 0-103, diverse Spielzustands-Booleans
;dann aktive Spieler zeichnen und Texte eintragen, Karten zeichnen
   If host Then   ;Host schickt alles rum
   For i=0 To 2
      WriteInt client(i), round
      WriteInt client(i), cardCounter
      For j=0 To 4
         WriteString client(i), event(j)
      Next
      For j=0 To 103
         WriteInt client(i), card(j)
      Next
      WriteByte client(i), throwsAway
      WriteByte client(i), isDevil
      WriteByte client(i), isEigth
   Next
   Else        ;Clients speichern alles
      check=0
      Repeat
         If ReadAvail(stream) Then
            round=ReadInt(stream)
            cardCounter=ReadInt(stream)
            For i=0 To 4
               event(i)=ReadString(stream)
            Next
            For i=0 To 103
               card(i)=ReadInt(stream)
            Next
            throwsAway=ReadByte(stream)
            isDevil=ReadByte(stream)
            isEigth=ReadByte(stream)
            check=1
         EndIf
      Until check=1
   EndIf
   drawBoard()    ;Tisch anzeigen
End Function

Function drawBoard()    ;Spielfeld zeichnen
;Position der Namen (counter), Markierung für aktiven Spieler (round), Ereignisse (5 letzte Spielzüge), Message, Karten
   ClsColor 0,0,bground
   Cls
   Color 0,0,lineColor
   Rect 0,295,800,10,1      ;zwei Linien
   Rect 336,0,10,300,1
   Oval 118,10,100,100,1    ;Kreise für Spieler, außen
   Oval 118,190,100,100,1
   Oval 10,100,100,100,1
   Oval 226,100,100,100,1
   For i=0 To 665 Step 133  ;6 leere Karten zeichnen
      Color 0,0,lineColor
      Rect i+5,360,123,230,1
      Color 0,0,cardColor
      Rect i+10,365,113,220,1
      Color 0,0,bground
      Line i+10,365,i+123,585
      Line i+10,585,i+123,365
      Line i+10,475,i+122,475
   Next
   Color 0,0,textColor        ;Nummerierung der Kartenslots
   fnt=LoadFont("arial",20)
   SetFont fnt
   For i=0 To 5
      Text i*133+66,335, (i+1)
   Next
   ;Koordinaten für Innen-Ovale, unten beginnt, im UZS:
   x0=123 : y0=195
   x1=15  : y1=105
   x2=123 : y2=15
   x3=231 : y3=105
   Color 0,0,bground      ;Innenkreise für Spieler
   Oval x0,y0,90,90,1
   Oval x1,y1,90,90,1
   Oval x2,y2,90,90,1
   Oval x3,y3,90,90,1
   If round<=3 Then
      Color 0,0,activeColor
      i=correctInc(round,-counter)                   ; Variable für Positionsverschiebung, aktives Oval zeichnen
      Select i
         Case 0
         Oval x0,y0,90,90,1
         Case 1
         Oval x1,y1,90,90,1
         Case 2
         Oval x2,y2,90,90,1
         Case 3
         Oval x3,y3,90,90,1
      End Select
   ElseIf round=99         ;wenn Daumen hoch/runter angezeigt werden sollen
      For j=0 To 3  ;für jeden Spieler
         For i=0 To 5  ;jede Karte prüfen
            If i=5 And cardCounter<80 Then Exit
            If card(cardCounter+4*i+j)<18 Then
               paint(j)=1    ;Daumen hoch
               Exit
            Else paint(j)=0   ;Daumen runter
            EndIf
         Next
      Next                         ;alle vier Kreise zeichnen
      findColor(counter)
      Oval x0,y0,90,90,1
      findColor(correctInc(counter,1))
      Oval x1,y1,90,90,1
      findColor(correctInc(counter,2))
      Oval x2,y2,90,90,1
      findColor(correctInc(counter,3))
      Oval x3,y3,90,90,1
   EndIf
   Color 0,0,textColor               ;Spielerbeschriftungen (Ausrichtung)
   fnt = LoadFont ("arial",18)
   SetFont fnt
   x0=168 : y0=240
   x1=60  : y1=150
   x2=168 : y2=60
   x3=276 : y3=150
   Text x0,y0, name$(counter),1,1
   Text x1,y1,name$(correctInc(counter,1)),1,1
   Text x2,y2,name$(correctInc(counter,2)),1,1
   Text x3,y3,name$(correctInc(counter,3)),1,1
   Color 0,0,textColor    ;Ereignisse
   tcount=0
   For i=4 To 0 Step -1
      If event$(i) <> "" Then
         Text 360,60+(20*tcount), event$(i)
         tcount=tcount+1
      EndIf
   Next
   fnt=LoadFont ("arial",35)                  ;Karten beschriften
   SetFont fnt
   For i=0 To 5
      If i=5 And cardCounter<80 Then Exit
      txt$=getCard2$(card(cardCounter+(4*i)+counter))
      If txt$="leer" Then                  ;ausgespielte Karten verdecken
         Color 0,0,bground
         Rect (133*i+5),360,123,230,1
         Color 0,0,lineColor
         Rect i*133+5,360,123,230,0
         Color 0,0,textColor
      ElseIf card(cardCounter+(4*i)+counter) <40   ;Wenn die Karte rot ist
         Color 0,0,redColor
         Text (133*i)+66,400, txt$,1,1
         Text (133*i)+66,540, txt$,1,1
      Else                               ;wenn die Karte schwarz ist
         Color 0,0,textColor
         Text (133*i)+66,400, txt$,1,1
         Text (133*i)+66,540, txt$,1,1
      EndIf
   Next
   If cardCounter<80 Then
      Color 0,0,bground
      Rect 670,360,123,230,1
      Color 0,0,lineColor
      Rect 670,360,123,230,0
   EndIf
   Flip     ;jetzt erst alles anzeigen
   FreeFont fnt
End Function

Function fool()                                 ;Beim Narren Karten nach rechts weitergeben
   For i=0 To 5                              
      If i=5 And cardCounter<80 Then Exit            ;Abfrage, ob 5 oder 6 Karten
      var=card(cardCounter+4*i+0)
      card(cardCounter+4*i+0)=card(cardCounter+4*i+1)
      card(cardCounter+4*i+1)=card(cardCounter+4*i+2)
      card(cardCounter+4*i+2)=card(cardCounter+4*i+3)
      card(cardCounter+4*i+3)=var
   Next
End Function

Function tac()         ;aufgerufen während updateEvent, um die getaccte Karte herauszufinden
   previous=correctInc(round,-1)   ;vorherigen Spieler herausfinden
   event(0)=name(previous)+" wird getacct und "+name(round)+" spielt "+move(1)+"."
   If move(1)="den Narren" And (move(2)<>"") Then event(0)=Replace(event(0),move(1), move(2)) ;wenn die letzte Karte der Narr war
   If foolTac Then             ;wenn der Narr abgeworfen worden ist und wiederbelebt werden kann
      foolTac=False
      isFool=True
      event(0)=name(round)+" hat den Narren mit seinem Tac wiederbelebt."
   EndIf
   If move(1)="eine 8" Or ((move(1)="einen Narren") And (move(2)="eine 8")) Or (move(1)="einen Tac" And move(2)="eine 8") Then isEigth=True
;wenn eine 8 wiederbelebt wird, auch vor Narren oder vor Tac
End Function

Function message(msg$)  ;aktivem Spieler eine Eingabeaufforderung schicken
   drawBoard()
   Color 0,0,textColor
   fnt=LoadFont ("arial", 22)
   SetFont fnt
   Text 20,310,msg$
   Flip
   FreeFont fnt
End Function

Function updateEvent(c)  ;Ereignisliste wird aktualisiert
   For i = 3 To 0 Step -1
      If event(i) <> "" event(i+1)=event(i)
   Next
   ctr=correctInc(round,1)      ;Spieler, der aussetzen muss
   isMoving%=1         ;Bei 8 ziehen
   If c<0 Then      ;Bei 8 aussetzen lasen
      c=0-c
      isMoving%=0
   EndIf
   If isEigth Then
      If isMoving Then
         event(0)=name(round)+" aktiviert die getaccte 8 und zieht mit seiner Kugel."
      Else
         event(0)=Replace(event(0),"zieht mit seiner Kugel","lässt "+name(ctr)+" aussetzen")
      EndIf
      Return
   EndIf
   event(0)=name(round) +" spielt "+getCard(c)+"."
   If getCard(c)="eine 8" And (Not throwsAway) Then
      If isMoving Then
         event(0)=Replace(event(0),"."," und zieht mit seiner Kugel.")
      Else
         event(0)=Replace(event(0),"."," und lässt "+name(ctr)+" aussetzen.")
      EndIf
   EndIf
   If throwsAway Then event(0)=name(round)+" wirft "+getCard(c)+" ab."
   For i=7 To 0 Step -1
      move(i+1)=move(i)
   Next
   If getCard(c)="einen Tac" And (Not throwsAway) And (move(0)<>"") And (Not ((move(1)="den Narren") And (move(2)=""))) Then tac()
;Tac nur wenn er nicht abgeworfen wird, und wenn nicht der Narr die erste Karte war und im Anschluss ein Tac kommt.
   isTac=False
   move(0)=getCard(c)
   If throwsAway And (move(0)="den Narren") Then foolTac=True         ;wenn ein Narr abgeworfen wurde, kann er reaktiviert werden.
End Function

Function getCard$(c) ;Aus Zahl 0-103 einen Akkusativ machen (z.B. "eine 5" oder "einen Trickser")
   If c < 9 Then Return "eine 1"
   If c >8 And c <18 Then Return "eine 13"
   If c >17 And c <25 Then Return "eine 4"
   If c >24 And c <33 Then Return "eine 7"
   If c >32 And c <40 Then Return "eine 8"
   If c >39 And c <47 Then Return "eine 2"
   If c >46 And c <54 Then Return "eine 3"
   If c >53 And c <61 Then Return "eine 5"
   If c >60 And c <68 Then Return"eine 6"
   If c >67 And c <75 Then Return "eine 9"
   If c >74 And c <82 Then Return "eine 10"
   If c >81 And c <89 Then Return "eine 12"
   If c >88 And c <93 Then Return "einen Tac"
   If c >92 And c <100 Then Return "einen Trickser"
   If c=100 Then Return "den Narren"
   If c=101 Then Return "den Engel"
   If c=102 Then Return "den Krieger"
   If c=103 Then Return "den Teufel"
End Function

Function getCard2$(c) ;Aus Zahl 0-103 eine Kartenbeschriftung machen (z.B. "5" oder "Trickser"), mit 104 für abgespielte Karte
   If c < 9 Then Return "1"
   If c >8 And c <18 Then Return "13"
   If c >17 And c <25 Then Return "4"
   If c >24 And c <33 Then Return "7"
   If c >32 And c <40 Then Return "8"
   If c >39 And c <47 Then Return "2"
   If c >46 And c <54 Then Return "3"
   If c >53 And c <61 Then Return "5"
   If c >60 And c <68 Then Return "6"
   If c >67 And c <75 Then Return "9"
   If c >74 And c <82 Then Return "10"
   If c >81 And c <89 Then Return "12"
   If c >88 And c <93 Then Return "Tac"
   If c >92 And c <100 Then Return "Trickser"
   If c=100 Then Return "Narr"
   If c=101 Then Return "Engel"
   If c=102 Then Return "Krieger"
   If c=103 Then Return "Teufel"
   If c=104 Then Return "leer"
End Function

Function pickCard(texttype, question$)             ;eine Karte zum Ausspielen, tauschen oder Abwerfen auswählen
   If throwsAway Then
      question="Du musst aussetzen und eine Karte abwerfen. Wähle mit 1 bis 6"
      texttype=2
   EndIf
   If isDevil Then question="Bitte mit 1 bis 6 eine Karte für "+name$(correctInc(counter,1))+" ausspielen!"
   If cardCounter<80 Then question=Replace(question,6,5)  ;nur in der letzten Runde gibt es 6 Karten
   FlushKeys()      ;alte Tastendrücke löschen
   isSelected=False
   cardNumber=104
   message(question)
   key=0                ;gedrückte Taste (1-6 = 49-54)
   Repeat                                  ;Eingabe überprüfen
      key=WaitKey()
      If key >48 And key<54 Then                 ;wenn 1 bis 5 gedrückt wurde
         cardNumber=cardCounter+4*(key-49)+counter
      ElseIf key=54 And cardCounter>=80 Then      ;wenn 6 gedrückt wurde
         cardNumber=cardCounter+4*(key-49)+counter
      EndIf
      If cardNumber<104 Then
         If card(cardNumber)<104 Then
            isSelected=True
         Else
            isSelected=False
         EndIf   
      EndIf
      If isSelected=True Then
         Select texttype
            Case 0
               temptext$="Willst du "+getCard(card(cardNumber))+" ausspielen? Drücke Enter."
            Case 1
               temptext$="Willst du "+getCard(card(cardNumber))+" tauschen? Drücke Enter."
            Case 2
               temptext$="Willst du "+getCard(card(cardNumber))+" abwerfen? Drücke Enter."
         End Select
         message(temptext$)
      EndIf
   Until key=13 And isSelected=True
   If isDevil Then                                  ;beim Teufel die "echte" Karte, nicht nur angezeigte Karte übergeben
      If cardNumber Mod 4 = 3 Then
         cardNumber=cardNumber-3
      Else
         cardNumber=cardNumber+1
      EndIf
   EndIf
   If round<4 And getCard(card(cardNumber))="eine 8" And (Not throwsAway) Then               ;bei 8 prüfen ob laufen oder aussetzen
      If pickEigth(counter)=0 Then    ;Wenn ausgesetzt werden soll
         If cardNumber>0 Then       ;wird eine negative Zahl ausgegeben
            Return (0-cardNumber)   ;außer bei der ersten Karte (card(0)
         Else                ;hier wird 104 übergeben an game
            Return 104
         EndIf
      EndIf
   EndIf
   Return cardNumber
End Function

Function findColor(i)                  ;Hilfsfunktion fürs Zeichnen der Spielerkreise (rot/grün)
   If paint(i) Then
      Color 0,0,greenColor  ;grün
   Else
      Color 0,0,redColor   ;rot
   EndIf
End Function

Function correctASCII(i%) ;Sonderzeichen bei der Namensanzeige  (noch nicht vollständig)
   name(i)=Replace(name(i),Chr(132),"ä")
   name(i)=Replace(name(i),Chr(148),"ö")
   name(i)=Replace(name(i),Chr(129),"ü")
   name(i)=Replace(name(i),Chr(142),"Ä")
   name(i)=Replace(name(i),Chr(153),"Ö")
   name(i)=Replace(name(i),Chr(154),"Ü")
   name(i)=Replace(name(i),Chr(225),"ß")
   name(i)=Replace(name(i),Chr(130),"é")
   name(i)=Replace(name(i),Chr(138),"è")
   name(i)=Replace(name(i),Chr(136),"ê")
   name(i)=Replace(name(i),Chr(160),"á")
   name(i)=Replace(name(i),Chr(133),"à")
   name(i)=Replace(name(i),Chr(147),"ô")
End Function

Function pickEigth(ctr%)      ;Auswahl ob bei 8 gezogen oder ausgesetzt wird, übernimmt aktuellen Spieler
   ctr=correctInc(ctr,1)
   message("Wähle aus: 8 Felder ziehen (Drücke 1), "+name(ctr)+" aussetzen lassen (Drücke 0)")
   key=0
   answer=2
   Repeat
      FlushKeys()
      key=WaitKey()
      If key=49 Then
         answer%=1
      ElseIf key=48 Then
         answer=0
      EndIf
      If answer<2 Then
         Select answer
            Case 1:
               message("Du möchtest 8 Felder ziehen? Bestätige mit Enter")
            Case 0:
               message("Du möchtest, dass "+name(ctr)+" aussetzen muss? Bestätige mit Enter")
         End Select
      EndIf
   Until key=13 And answer<2
   Return answer
End Function

Function correctInc(num%,count%)
;Hilfsfunktion, um den Wert num um count zu in- oder dekrementieren, aber als Ergebnis nur Werte von 0-3 zuzulassen
   num=num+count
   If num>3 Then num=num-4
   If num<0 Then num=num+4
   Return num
End Function

Function getEigth(h%)               
   ;Hilfsfunktion bei reaktivieren einer 8, Auswahl ziehen/aussetzen. 1=host, 0=client lässt aussetzen, -1=client zieht acht Felder
   ;wenn eine negative answer an updateEvent übergeben wird, soll ausgesetzt werden, ansonsten wird gezogen
   answer=-1
   If h=1 Then answer%=pickEigth(round)-1
   If h=-1 Then answer=0
   updateEvent(answer)
   round=correctInc(round,1)
   If answer=-1 Then throwsAway=True
   isEigth=False
End Function

Function close()                        ;Spiel "sauber" beenden
   If host Then
      CloseTCPServer stream
      For i=0 To 2
         CloseTCPStream(client(i))
      Next
   Else
      CloseTCPStream stream
   EndIf
   End
End Function

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group