BlitzTac - Windowsanwendung für eine Tac-Kartenverwaltung
Übersicht Sonstiges Projekte
bonajkukojBetreff: BlitzTac - Windowsanwendung für eine Tac-Kartenverwaltung |
Fr, Mai 29, 2020 0:44 Antworten mit Zitat |
|
---|---|---|
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: 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 |
||
Übersicht Sonstiges Projekte
Powered by phpBB © 2001 - 2006, phpBB Group