Kein Befehl-Fehler,aber es funktioniert nicht richtig.

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

GoldDave

Betreff: Kein Befehl-Fehler,aber es funktioniert nicht richtig.

BeitragFr, Okt 12, 2012 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Morgen Leute,

ich bin es mal wieder. Hoffe ich nerve nicht.

Ich habe mich nach meinem letzten Beitrag hingesetzt und in meiner Freizeit ein kleines Tic Tac Toe Spiel programmiert, (nur die Spieloberfläche ohne Menü und Features) mithilfe des Tutorials von Midimaster und vielen mehr.
Nun stecke ich mal wieder an einem kniffligen Punkt fest.

Code: [AUSKLAPPEN]
   
;Spieler 1 Sieg.
      
If Feld(1) = 1 And Feld(2) = 1 And Feld(3) = 1 Then
   Text 10,10,"Spieler 1 hat gewonnen!"
   Brettvorbereitung()
EndIf


Dieser Text-Befehl malt nicht in die Spieleconsole den "Spieler 1 hat gewonnen!" Text. Mir kommt es so vor, als würde er einfach nicht reagieren.

Außerdem fängt daraufhin das Spiel komischerweise von neu an, jedoch das der Spieler der gewonnen hat, dann automatisch dort hingemalt hat, wo er als letztes hinmalte um zu gewinnen.
Wenn ich das ganze mit Print Befehlen machen, läuft es gut, jedoch möchte ich das der Text in der Spielekonsole angezeigt wird und nicht in der seperaten Konsole. Ist das überhaupt möglich?

Würde mich auf eine schnelle Antwort freuen.
(Wenn jemand den gesamt Code sehen möchte, einfach drunter schreiben)

DAK

BeitragFr, Okt 12, 2012 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Kanns sein, dass du danach vergessen hast, irgendeine Art Pause einzubauen? Verwendest du SetBuffer(Backbuffer())? In diesem Fall fehlt dir noch ein Flip(). Schreib mal einfach unter den Text-Befehl folgendes:

BlitzBasic: [AUSKLAPPEN]
Flip()
WaitKey


und schau, ob das hilft.


Wie's klingt lässt du ihn direkt nach dem Text weiter zeichnen (und dabei wohl u.A. den Schirm leeren (CLS())).
Gewinner der 6. und der 68. BlitzCodeCompo
 

GoldDave

BeitragFr, Okt 12, 2012 9:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe alles schonmal getestet.
Evtl. würde dir mein ganzer Code weiterhelfen.
SetPuffer Backpuffer() ist vorhanden.

Der Flip-Befehl ist auch da, aber vill. an der falschen Stelle.

Code: [AUSKLAPPEN]
Graphics 900,600,32,2

;Variablen definieren.(Global = überall erreichbar & veränderbar) (Local = innerhalb einer Funktion)
;x% Variable für Zahlen : x$ Variable für Zeichenketten

Global X_Bild          = LoadImage("C:\Users\****\Desktop\Sonstiges\X_Bild.png")
Global O_Bild          = LoadImage("C:\Users\****\Desktop\Sonstiges\O_Bild.png")
Global Hintergrund_Bild   = LoadImage("C:\Users\****\Desktop\Sonstiges\Hintergrund_Bild.png")
;Global Jubel_Sound      = LoadSound("..")
;Global Spielername1$   = Input$
;Global Spielername1$   = Input$

Global Spieler          = 1

Dim SpielerWechsel(2)
SpielerWechsel(1) = 2
SpielerWechsel(2) = 1

;0 = leere Felder; (1 = X_Bild; 2 = O_Bild)
Dim Feld(9)

Brettvorbereitung()

;Wohin er malt.
Dim FeldX(9)
FeldX(1)         = 40
FeldX(2)         = 340
FeldX(3)         = 640
FeldX(4)         = 40
FeldX(5)         = 340
FeldX(6)         = 640
FeldX(7)         = 40
FeldX(8)         = 340
FeldX(9)         = 640

Dim FeldY(9)
FeldY(1)         = 400
FeldY(2)         = 400
FeldY(3)         = 400
FeldY(4)         = 200
FeldY(5)         = 200
FeldY(6)         = 200
FeldY(7)         = 0
FeldY(8)         = 0
FeldY(9)         = 0




;Laden von Bilder.

LoadImage Hintergrund_Bild
LoadImage X_Bild
LoadImage O-Bild

SetBuffer BackBuffer()

y_H = 0
x_H = 0



Repeat
   Cls
   
   ;Tastaturbelegung
   
   If KeyDown(79) And Feld(1) = 0 Then    
      Feld(1) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(80) And Feld(2) = 0 Then   
      Feld(2) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(81) And Feld(3) = 0 Then   
      Feld(3) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(75) And Feld(4) = 0 Then   
      Feld(4) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(76) And Feld(5) = 0 Then   
      Feld(5) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(77) And Feld(6) = 0 Then   
      Feld(6) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(71) And Feld(7) = 0 Then   
      Feld(7) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(72) And Feld(8) = 0 Then   
      Feld(8) = Spieler
      Spieler = SpielerWechsel(Spieler)
   ElseIf KeyDown(73) And Feld(9) = 0 Then   
      Feld(9) = Spieler
      Spieler = SpielerWechsel(Spieler)
   EndIf
   
   ;Unentschieden
   
   If Feld(1) = 0 Or Feld(2) = 0 Or Feld(3) = 0 Or Feld(4) = 0 Or Feld(5) = 0 Or Feld(6) = 0 Or Feld(7) = 0 Or Feld(8) = 0 Or Feld(9) = 0 Then
      
   Else
      Text 10,10,"Unentschieden"
      Brettvorbereitung()
   EndIf
      
   ;Spieler 1 Sieg.
      
   If Feld(1) = 1 And Feld(2) = 1 And Feld(3) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   
   If Feld(4) = 1 And Feld(5) = 1 And Feld(6) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(7) = 1 And Feld(8) = 1 And Feld(9) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(1) = 1 And Feld(5) = 1 And Feld(9) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(3) = 1 And Feld(5) = 1 And Feld(7) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(1) = 1 And Feld(4) = 1 And Feld(7) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(2) = 1 And Feld(5) = 1 And Feld(8) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(3) = 1 And Feld(6) = 1 And Feld(9) = 1 Then
      Text 10,10,"Spieler 1 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   
   ;Spieler 2 Sieg.
   
   If Feld(1) = 2 And Feld(2) = 2 And Feld(3) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(4) = 2 And Feld(5) = 2 And Feld(6) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(7) = 2 And Feld(8) = 2 And Feld(9) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(1) = 2 And Feld(5) = 2 And Feld(9) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(3) = 2 And Feld(5) = 2 And Feld(7) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(1) = 2 And Feld(4) = 2 And Feld(7) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(2) = 2 And Feld(5) = 2 And Feld(8) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   If Feld(3) = 2 And Feld(6) = 2 And Feld(9) = 2 Then
      Text 10,10,"Spieler 2 hat gewonnen!"
      Brettvorbereitung()
   EndIf
   
      

      
   DrawImage Hintergrund_Bild, x_H, y_H
   
   For Draw_durchlauf = 1 To 9
      If Feld(Draw_durchlauf) = 1 Then
         DrawImage X_Bild, FeldX(Draw_durchlauf), FeldY(Draw_durchlauf)
      ElseIf Feld(Draw_durchlauf) = 2 Then
         DrawImage O_Bild, FeldX(Draw_durchlauf), FeldY(Draw_durchlauf)
      EndIf
   Next   
   
   
   
   
   Flip
Until KeyHit(1)
End

Function Brettvorbereitung()
   Feld(1)         = 0          
   Feld(2)         = 0
   Feld(3)         = 0
   Feld(4)         = 0
   Feld(5)         = 0
   Feld(6)         = 0
   Feld(7)         = 0
   Feld(8)         = 0
   Feld(9)         = 0
Spieler          = 1
End Function

Dicker Hobbit

BeitragFr, Okt 12, 2012 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Golddave

Nach schnellem Überfliegen würde ich sagen, dass der Text zwar geschrieben wird, du aber sofort mit dem Programm weitermachst.

Also bau, wie schon DAK gesagt hat,
Flip(0)
Waitkey()

nach dem Textbefehl ein und dann müsste es klappen.

Lg Dicker Hobbit

Midimaster

BeitragFr, Okt 12, 2012 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Der WaitKey() gehört meiner Meinung nach nach dem ...
BlitzBasic: [AUSKLAPPEN]
     Text 10,10,"Unentschieden"
WaitKey()

..rein

Es kann auch sein, dass in dem Moment wo der letzte Stein zum Sieg gesetzt wird, der Spieler gar nicht so schnell von der Taste wegkommt und dies gleich dem WaitKey reicht um durchzuwinken.

Daher würde ich empfehlen, vor dem Text noch eine Sekunde zu warten:
BlitzBasic: [AUSKLAPPEN]
   If Feld(1) = 0 Or Feld(2) = 0 Or Feld(3) = 0 Or Feld(4) = 0 Or Feld(5) = 0 Or Feld(6) = 0 Or Feld(7) = 0 Or Feld(8) = 0 Or Feld(9) = 0 Then

Else
SiegTimer=MilliSecs()+1000
EndIf
If ( SiegTimer<MilliSecs() ) And ( SiegTimer>0 )
Text 10,10,"Unentschieden"
Brettvorbereitung()
WaitKey()
EndIf

Wichtig: Dieser SiegTimer% muss global sein und in den Brettvorbereitungen gehört dann dieser Timer wieder auf 0 gestellt für die nächste Spielrunde.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Dicker Hobbit

BeitragFr, Okt 12, 2012 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
1 Frage--> 3 mal fast die gleiche Antwort Wink

Es würde doch reichen einfach

Code: [AUSKLAPPEN]
FlushKeys()


vor Waitkey() zu setzen, um dass Problem mit den bereits gedrückten Tasten zu lösen?

Xeres

Moderator

BeitragFr, Okt 12, 2012 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Jopp, FlushKeys sollte nicht fehlen.

Was sonst noch auffällt:
Du benutzt absolute Pfade für Bilder.
Code: [AUSKLAPPEN]
LoadImage("C:\Users\****\Desktop\Sonstiges\X_Bild.png")

Wenn du ein Spiel mal an jemand anderes weitergeben willst (z.B. hier im Forum) solltest du relative Pfade verwenden.
Code: [AUSKLAPPEN]
LoadImage("Ressourcen\Bilder\X_Bild.png") ;Relative Angabe zu dem Ordner, in dem der Code liegt


Bei Ticktacktoe gibt es natürlich noch viele Sonderfälle, aber trotzdem könntest du mit ein paar For...next Schleifen deinen Code kürzen. Ein Paar mehr Funktionen für die Abschnitte könnten auch noch drin sein. Aber das nur mehr oder minder am Rande.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

GoldDave

BeitragMo, Okt 15, 2012 8:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die vielen Antworten.
Ich werde mich im laufe des Tages wieder dran setzen.
Tut mir Leid, dass ich erst so später zurück schreibe, jedoch steht bald ein Umzug an und ich hatte viel am Wochenende zu tuen.
 

GoldDave

BeitragMo, Okt 15, 2012 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank nochmal. Es hat funktioniert.
Der Code sieht jetzt wie folgt aus.

Code: [AUSKLAPPEN]

If Feld(1) = 1 And Feld(2) = 1 And Feld(3) = 1 Then
   FlushKeys()
   Text 10,10,"Spieler 1 hat gewonnen!"
   Flip(0)
   WaitKey()
   Brettvorbereitung()
EndIf
 

PhillipK

BeitragMo, Okt 15, 2012 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde es sehr nett, wenn leute sich mit einem "Hat geklappt, hier code" zurückmelden.

Es gab schon so manches problem, da hätte ich ein bisschen spicken gebrauchen können^^

Aber ein doppelpost muss nicht sein Razz Edit reicht hier vollkommen^^

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group