GoBang über TCP

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

D2006

Administrator

Betreff: GoBang über TCP

BeitragMi, Okt 13, 2004 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich und BladeRunner wollten gestern Extreme GoBang von 4pac und Dirk Knoop gegeneinander spielen. Leider ging es absolut nicht.

Es lag anscheind an UDP. Jedenfalls haben wir nun ein mini GoBang zusammengeschustert über TCP. Es ist nur ein Grundgerüst, aber funktionert.

Hier ist der Code des Clienten:

BlitzBasic: [AUSKLAPPEN]

;### CLIENT by BladeRunner & D2006. Open Source.
;### Version 1.0.0.1.1 ... mit Chat
ip$=\"127.0.0.1\"
ip$=\"xxx.xxx.xxx.xxx\"

AppTitle \"GoBang Client\"
Graphics 500,260,32,2
SetBuffer BackBuffer()

Cls
Text 120,120,\"Verbindungsaufbau ...\",1,1
Flip

stream=OpenTCPStream(ip$,8080)
WriteLine stream,\"hallo\"
CloseTCPStream stream


Dim map(12,12), chat$(20,2)

spieler=1
time=MilliSecs()

While Not KeyHit(1)
mouse = MouseHit(1)
Cls

For y=0 To 11
For x=0 To 11
Color 155,155,155
Rect x*20,y*20,20,20,0
If map(x,y) Then
If map(x,y)=1 Then Color 255,255,0 Else Color 255,0,0
Oval x*20+1,y*20+1,18,18,1
EndIf
Next
Next

;CHAT AUSGABE
For t=1 To 20
If chat$(t,2)=1 Then Color 255,255,0 Else Color 255,0,0
Text 250,t*12-12,chat$(t,1)
Next


a = winnersearch(1)
If a=1 Then Flip:RuntimeError \"Sie haben verloren!\"
a = winnersearch(2)
If a=2 Then Flip:RuntimeError \"Sie haben gewonnen!\"

Color 0,255,0
Text 250,242,echat$

;CHAT EINGABE
a = GetKey()
If a>31 And Len(echat$)<30 And chat_st=0 Then echat$ = echat$+Chr$(a)
If KeyHit(14) And Len(echat$)>0 And chat_st=0 Then echat$ = Left$(echat$,Len(echat$)-1)
If KeyHit(28) Or KeyHit(156) Then chat_st=1

Color 255,255,255
If spieler=1 Then Text 5,242,\"Ihr Gegner ist am Zug.\" Else Text 5,242,\"Sie sind dran!\"
If eingabe=0 And spieler=2 Then
mx = Floor(MouseX()/20.0)
my = Floor(MouseY()/20.0)
If mouse And mx=>0 And mx<12 And my>=0 And my<12 And map(mx,my)=0 Then ex=mx:ey=my:eingabe=1
EndIf

If MilliSecs()>time+500 Then
stream=OpenTCPStream(ip$,8080)
If spieler=1 Then
If chat_st=1 Then
WriteLine stream,\" M\"+echat$
add_chat(echat$,2)
echat$=\"\"
chat_st=0
Else
WriteLine stream,\"\"
EndIf
dat$=ReadLine$(stream)
If Left$(dat$,2)=\" M\" Then
add_chat(Mid$(dat$,3),1)
ElseIf dat$<>\"\"
gx%=dat$
gy%=ReadLine$(stream)
map(gx,gy)=1
spieler=2
EndIf
Else
If eingabe=0 Then
If chat_st=1 Then
WriteLine stream,\" M\"+echat$
add_chat(echat$,2)
echat$=\"\"
chat_st=0
Else
WriteLine stream,\"\"
EndIf
Else
WriteLine stream,ex
WriteLine stream,ey
map(ex,ey)=2
eingabe=0
spieler=1
EndIf
dat$=ReadLine$(stream)
If Left$(dat$,2) =\" M\" Then add_chat(Mid$(dat$,3),1)

EndIf
CloseTCPStream stream
time=MilliSecs()
EndIf


Flip
Wend
End

Function add_chat(dat$,spielernummer)
For t=1 To 19
chat$(t,1)=chat$(t+1,1)
chat$(t,2)=chat$(t+1,2)
Next
chat$(20,1)=dat$
chat$(20,2)=spielernummer
End Function

Function winnersearch(spielernummer) ;returned Spielernummer bei Gewinn (5 gleichen Waagerecht, senkrecht oder Diagonal)
For x= 0 To 7
For y= 0 To 7
If map(x,y)=spielernummer Then
weiter=1
For z= 1 To 4
If map(x+z,y)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
For z= 1 To 4
If map(x+z,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
For z= 1 To 4
If map(x,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
If x>3 Then
For z= 1 To 4
If map(x-z,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
End If
End If
Next
Next
End Function


Anmerkungen:
Ist eigentlich unsauber jedesmal eine neue TCP Verbindung aufzubauen, aber es funzt. Anders hätte es bestimmt nicht funktionert, da zB. BladeRunner nur Server sein kann und nicht ich (warum auch immer).
RUNTIMEERORR ist ne unschöne Arte ein Spiel zu beenden, aber was solls. Ist ja nur ein Grundgerüst.

MfG
D2006

EDIT: Syntax Highlighting hinzugefügt.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
  • Zuletzt bearbeitet von D2006 am Mo, Dez 06, 2004 14:45, insgesamt 3-mal bearbeitet

BladeRunner

Moderator

BeitragMi, Okt 13, 2004 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Und hier noch der Server.
EDIT: VERBESSERTE Version Online, Bugfrei soweit. Thx D2006.
Nun mit Chat.
EDIT ": Nommal neue Version. nu aber echt fehlerfrei.

BlitzBasic: [AUSKLAPPEN]
;### SERVER 

AppTitle "GoBang Server"
Graphics 500,260,32,2
SetBuffer BackBuffer()

Dim map(12,12)
Dim chat$(20,2)

Cls
Text 120,120,"Warte auf Verbindung...",1,1
Flip

server = CreateTCPServer(8080)

spieler = 1
Repeat
stream = AcceptTCPStream(server)
If KeyHit(1) Then CloseTCPServer(server):End
Until stream>0
ReadLine$(stream)
AppTitle "GoBang Server- Client Online!"
While Not KeyHit(1)
mouse=MouseHit(1)
Cls

For y=0 To 11
For x=0 To 11
Color 155,155,155
Rect x*20,y*20,20,20,0
If map(x,y) Then
If map(x,y)=1 Then Color 255,255,0 Else Color 255,0,0
Oval x*20+1,y*20+1,18,18,1
EndIf
Next
Next

;CHAT AUSGABE
For t=1 To 20
If chat$(t,2)=1 Then Color 255,255,0 Else Color 255,0,0
Text 250,t*12-12,chat$(t,1)
Next


a = winnersearch(1)
If a=1 Then Flip: RuntimeError "Sie haben gewonnen!":End
a = winnersearch(2)
If a=2 Then Flip: RuntimeError "Sie haben verloren!":End

Color 255,255,255
If spieler=2 Then Text 5,242,"Ihr Gegner ist am Zug." Else Text 5,242,"Sie sind dran!"

Color 0,255,0
Text 250,242,echat$

;CHAT EINGABE
a = GetKey()
If a>31 And Len(echat$)<30 And chat_st=0 Then echat$ = echat$+Chr$(a)
If KeyHit(14) And Len(echat$)>0 And chat_st=0 Then echat$ = Left$(echat$,Len(echat$)-1)
If KeyHit(28) Or KeyHit(156) Then chat_st=1
If eingabe=0 And spieler=1 Then
mx = Floor(MouseX()/20.0)
my = Floor(MouseY()/20.0)
If mouse And mx>=0 And mx<=11 And my>=0 And my<=11 And map(mx,my)=0 Then ex=mx:ey=my:eingabe=1
EndIf

stream = AcceptTCPStream(server)
If stream Then
If spieler=1 Then
dat$=ReadLine$(stream)
If Left$(dat$,2)=" M" Then add_chat(Mid$(dat$,3),2)
If eingabe=0 Then
If chat_st=1 Then
WriteLine stream," M"+echat$
add_chat(echat$,1)
echat$=""
chat_st=0
Else
WriteLine stream,""
EndIf
Else
WriteLine stream,ex
WriteLine stream,ey
map(ex,ey)=1
eingabe=0

spieler=2

EndIf
Else
dat$=ReadLine$(stream)
If Left$(dat$,2) =" M" Then
add_chat(Mid$(dat$,3),2)
ElseIf dat$<>""
gx%=dat$
gy%=ReadLine$(stream)
map(gx,gy)=2

spieler=1

EndIf
If chat_st=1 Then
WriteLine stream," M"+echat$
add_chat(echat$,1)
echat$=""
chat_st=0
Else
WriteLine stream,""
EndIf

EndIf
EndIf

Flip
Wend
CloseTCPServer(server)
End


Function add_chat(dat$,spielernummer)
For t=1 To 19
chat$(t,1)=chat$(t+1,1)
chat$(t,2)=chat$(t+1,2)
Next
chat$(20,1)=dat$
chat$(20,2)=spielernummer
End Function

Function winnersearch(spielernummer) ;returned Spielernummer bei Gewinn (5 gleichen Waagerecht, senkrecht oder Diagonal)
For x= 0 To 7
For y= 0 To 7
If map(x,y)=spielernummer Then
weiter=1
For z= 1 To 4
If map(x+z,y)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
For z= 1 To 4
If map(x+z,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
For z= 1 To 4
If map(x,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
weiter=1
If x>3 Then
For z= 1 To 4
If map(x-z,y+z)<>spielernummer Then weiter=0
Next
If weiter = 1 Then Return spielernummer
End If
End If
Next
Next
End Function


Have Fun !
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
  • Zuletzt bearbeitet von BladeRunner am Fr, Okt 15, 2004 15:31, insgesamt 2-mal bearbeitet
 

Kekskiller

BeitragMi, Okt 13, 2004 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur zu schade, dass sich sofort nach dem Starten ein "Invalid Stream Handle"-
Fehler aufbaut ^_^ .

BladeRunner

Moderator

BeitragMi, Okt 13, 2004 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Keks, hast du den Server gestartet? Oder hatte dein mitspieler den Server schon am laufen? Denn ohne Server kannst du nix empfangen (das hab ich heut gelernt Wink)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

D2006

Administrator

BeitragMi, Okt 13, 2004 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@Kekskiller:

ist logisch. Der Serber muss erstmal stehen, bevor der Client starten darf.
Übrigens die erste IP$ die da steht, ist für ein Spiel an einem Computer.

Ansonsten kriegt man seine IP hier raus: www.whatismyip.com

Have Fun!
 

Kekskiller

BeitragMi, Okt 13, 2004 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Tschuldigt, ich hatte schneller auf Beantworten geklickt, als der zweite
Post kam. Und dann habe ich den Rest nicht gesehen Wink .

D2006

Administrator

BeitragDo, Okt 14, 2004 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
So, kleines Update:

jetzt mit Chatfunktion *yeah* Wink

Bekannte Bugs:
o man kann gegnerische Steine überschreiben
o die Chateingabe hinkt mitunter (liegt am dreckigen Netcode)
o der Client könnte zwischendurch sich abmelden und neustarten Twisted Evil
o der Client kriegt ne dreckige Fehlermeldung, wenn der Server beendet

Mal gucken, ob die nächste Version auch noch OpenSource wird.
Wenn ja, dann wird alles besser Surprised

MfG

BladeRunner

Moderator

BeitragFr, Okt 15, 2004 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT2: neuer server und client online.

- placementbug ist raus.
- gewinnmeldung korrekt.
- tcp-handling weiter dirty. aber hey- es rockt Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group