Computergegner?

Anfängerfragen zum Programmieren mit PureBasic.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Computergegner?

Beitrag von Tompazi »

Hi, das hier ist die vereinfachtere Version (ohne Bilder, Ton oder animationen) meines ersten Spieles oder besser gesagt das erste was ich je mi PB programmiert habe...
Es ist ein Ping Pong Spiel für 2 Spieler, Ich will das jetzt aber erweitern das auch Einspieler Modus mit Computergegner und 3 Schwierigskeitstufen möglich ist.
Mir fehlt leider jeder Anhaltspunkt wie das gehen soll...

Wie funktioniert das im Prinzip?

Weiters fliegen die Bälle oft durch die Schläger und sogar durch die SchlägerWand ... Wie kann ich das ändern?

Code: Alles auswählen

InitSprite()
InitKeyboard()
If OpenWindow(0, 100, 200, 200, 100, "Spieloptionen", #PB_Window_BorderLess |#PB_Window_ScreenCentered) 
 If CreateGadgetList(WindowID(0))
 StringGadget(1,70,10, 100, 20,"Spieler 1") 
 TextGadget(2, 10, 10, 60, 20, "Spieler 1:") 
 StringGadget(3,70,30, 100, 20,"Spieler 2") 
 TextGadget(4, 10, 30, 60, 20, "Spieler 2:")
 TextGadget(6, 10, 70, 60, 20, "Level:") 
 SpinGadget(5, 70, 70, 30, 20, 0,7,#PB_Spin_ReadOnly | #PB_Spin_Numeric)
 ButtonGadget(0, 140, 66, 50, 24, "GO") 
 EndIf
EndIf
Repeat
EventID = WaitWindowEvent() 
 If EventID = #PB_Event_Gadget 
  If EventGadget() = 5
  SetGadgetText(5, Str(GetGadgetState(5))) 
  EndIf
   Select EventGadget() 
    Case 0 
    Player1$ = GetGadgetText(1) 
    Player2$ = GetGadgetText(3)
    Level = GetGadgetState(5)
    EventID = #PB_Event_CloseWindow 
   EndSelect 
 EndIf
Until EventID = #PB_Event_CloseWindow

OpenScreen(1024,768,32 ,"Ping-Pong BETA")

X = 1
Y = 1
SP1 = 0
SPL = 0
SP2 = 0
SPR = 0
SchlaegerWand = 0
SchlaegerWand1 = 0
pause = 0
Punkte1 = 0
Punkte2 = 0
BallX = 500 
BallY = 380
Ball2X = 520
Ball2Y = 390
BewegX = -level - 1
BewegY = -level - 1
Beweg2X = level + 1
Beweg2Y = level + 1
SchlaegerRX = 1007
SchlaegerRY = 384
SchlaegerLX = 0
SchlaegerLY = 384

Repeat
 ClearScreen($000000) 
 StartDrawing(ScreenOutput())
 DrawingMode(1)
 FrontColor($FFFFFF)
 Circle(BallX, BallY,10)
 Circle(Ball2X, Ball2Y,10)
 Box(0,0,1024,32)
 Box(0,736,1024,32)
 Box(SchlaegerLX - 10, SchlaegerLY,10,48)
 Box(SchlaegerRX + 10, SchlaegerRY,10,48)
  If SchlaegerWand = 1
  Box(SchlaegerLX - 10,0,10,768)
  EndIf
 If SchlaegerWand1 = 1
 Box(SchlaegerRX + 10,0,10,768)
 EndIf
 DrawText(0,40,Player1$+Chr(10)+": " + Str(Punkte1))
 DrawText(0,60,"Special: " + Str(SPL))
 DrawText(912,40,Player2$+Chr(10)+": " + Str(Punkte2))
 DrawText(912,60,"Special: " + Str(SPR))
 DrawText(480,5,"Level:" + Str(Level))
 StopDrawing()
 FlipBuffers()

 ExamineKeyboard()
 If KeyboardReleased(#PB_Key_P)
  If pause = 0
  pause = 1
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  FrontColor($FFFFFF)
  If pause = 1
   DrawText(480,380,"-PAUSE-")
   EndIf
  StopDrawing()
  FlipBuffers()
 Repeat
   pause = 1 
   Delay(1) 
   ExamineKeyboard() 
 Until KeyboardReleased(#PB_Key_P)
   pause = 0
  EndIf
  EndIf
 
 If X = 1
  If KeyboardPushed(#PB_Key_Up)
  SchlaegerRY - level -2
  EndIf
   If KeyboardPushed(#PB_Key_Down)
   SchlaegerRY + level +2
   EndIf
  If KeyboardPushed(#PB_Key_Left)
  SchlaegerRX - level -2
  EndIf
   If KeyboardPushed(#PB_Key_Right)
   SchlaegerRX + level +2
   EndIf
 EndIf
 
 If Y = 1
  If KeyboardPushed(#PB_Key_A)
  SchlaegerLX - level -2
  EndIf
   If KeyboardPushed(#PB_Key_D)
   SchlaegerLX + level +2
   EndIf
  If KeyboardPushed(#PB_Key_W)
  SchlaegerLY - level -2
  EndIf
   If KeyboardPushed(#PB_Key_S)
   SchlaegerLY + level +2
   EndIf
 EndIf
 
 If SPL > 0
  If KeyboardReleased(#PB_Key_Space)
  SPL = SPL - 1
  uts4 = Date() 
  X = 0 
  EndIf 
 EndIf
 If (Date() > uts4 + 4) And (x=0) 
 X = 1 
 EndIf
 If SPL > 0
  If KeyboardReleased(#PB_Key_LeftShift)
  SPL = SPL - 1
  uts3 = Date() 
  SchlaegerWand = 1
  EndIf 
 EndIf
 If (Date() > uts3 + 4) And (SchlaegerWand=1) 
 SchlaegerWand = 0 
 EndIf
 If SchlaegerWand = 1
  If BallX > SchlaegerLX And BallX < SchlaegerLX + 10
  BewegX = -BewegX
  EndIf
  If Ball2X > SchlaegerLX And Ball2X < SchlaegerLX + 10
  Beweg2X = -Beweg2X
  EndIf
EndIf

 If SPR > 0
  If KeyboardReleased(#PB_Key_Return)
  SPR = SPR - 1
  uts1 = Date() 
  Y = 0 
  EndIf 
 EndIf
 If (Date() > uts1 + 4) And (Y=0) 
 Y = 1 
 EndIf 
 If SPR > 0
  If KeyboardReleased(#PB_Key_RightControl)
  SPR = SPR - 1
  uts2 = Date() 
  SchlaegerWand1 = 1
  EndIf
 EndIf 
 If (Date() > uts2 + 4) And (SchlaegerWand1=1) 
 SchlaegerWand1 = 0 
 EndIf
 If SchlaegerWand1 = 1
  If BallX > SchlaegerRX And BallX < SchlaegerRX + 10
  BewegX = -BewegX
  EndIf
  If Ball2X > SchlaegerRX And Ball2X < SchlaegerRX + 10
  Beweg2X = -Beweg2X
  EndIf
 EndIf
 
 If SchlaegerRY < 33
 SchlaegerRY = 32
 EndIf
  If SchlaegerRY > 688
  SchlaegerRY = 688
  EndIf
 If SchlaegerRX < 0
 SchlaegerRX = 0
 EndIf
  If SchlaegerRX > 998
  SchlaegerRX = 998
  EndIf
 If SchlaegerLY < 33
 SchlaegerLY = 32
 EndIf
  If SchlaegerLY > 688
  SchlaegerLY = 688
  EndIf
 If SchlaegerLX < 10
 SchlaegerLX = 10
 EndIf
  If SchlaegerLX > 1008
  SchlaegerLX = 1008
  EndIf
 
 BallX + BewegX
 BallY + BewegY
 Ball2X + Beweg2X
 Ball2Y + Beweg2Y
 
 If Ball2Y < 42
 Beweg2Y = -Beweg2Y
 EndIf
  If Ball2Y > 726
  Beweg2Y= -Beweg2Y
  EndIf  
 If BallY < 42
 BewegY = -BewegY
 EndIf
  If BallY > 726
  BewegY= -BewegY
EndIf
  If BallX > SchlaegerLX And BallX < SchlaegerLX + 10 And BallY > SchlaegerLY And BallY < SchlaegerLY + 48
  BewegX = -BewegX
  EndIf
  If Ball2X > SchlaegerLX And Ball2X < SchlaegerLX + 10 And Ball2Y > SchlaegerLY And Ball2Y < SchlaegerLY + 48
  Beweg2X = -Beweg2X
  EndIf
  If BallX > SchlaegerRX And BallX < SchlaegerRX + 10 And BallY > SchlaegerRY And BallY < SchlaegerRY + 48
  BewegX = -BewegX
  EndIf
 If Ball2X > SchlaegerRX And Ball2X < SchlaegerRX + 10 And Ball2Y > SchlaegerRY And Ball2Y < SchlaegerRY + 48
  Beweg2X = -Beweg2X
  EndIf
  
 If BallX = < 0
 Punkte2 = Punkte2 + 1
 BallX = 512
 BallY = 384
 BewegX = -level - 1
 BewegY = -level - 1
 EndIf
 If BallX = > 1024
 Punkte1 = Punkte1 + 1
 BallX = 512
 BallY = 384
 BewegX = -level - 1
 BewegY = -level - 1
 EndIf
 If Ball2X = < 0
 Punkte2 = Punkte2 + 1
 Ball2X = 512
 Ball2Y = 384
 Beweg2X = level + 1
 Beweg2Y = level + 1
 EndIf
 If Ball2X = > 1024
 Punkte1 = Punkte1 + 1
 Ball2X = 512
 Ball2Y = 384
 Beweg2X = level + 1
 Beweg2Y = level + 1
 EndIf
 
 If (Punkte1/ 10) + 1 > SP1
 SP1 = SP1 + 1
 SPL = SPL + 1
 EndIf
 If (Punkte2/ 10) + 1 > SP2
 SP2 = SP2 + 1
 SPR = SPR + 1
 EndIf
 
Until KeyboardPushed(1)

CloseScreen()

If Punkte1 > Punkte2
Winner$ = Player1$
 ElseIf Punkte1 < Punkte2
  Winner$ = Player2$
 ElseIf  Punkte1 = Punkte2
  Winner$ = "Niemand"
EndIf
MessageRequester("Spiel Beendet",Winner$ + " gewinnt! " + "Punktestand: " + Str(Punkte1) + ":" + Str(Punkte2),0)
Danke Tompazi

Ps: falls wer ausprobiert....
Steurung: Linker Schläger WASD, Rechter Schläger Pfeiltasten, Wand für linken Schläger left Shift, Wand für rechten Schläger right Strg, Gegnerischer Spieler bleibt stehen SPACE für den linken Spieler und Enter für den rechten Spieler.
Empfohlene Levels 2-5
Zuletzt geändert von Tompazi am 08.11.2007 22:25, insgesamt 4-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Sorry,. nicht direkt zum Problem, aber ich wollte dir #PB_Spin_Numeric zeigen.
Damit brauchst du nicht selbstständig das SpinGadget() aktualisieren.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Also ersteinmal vorweg, für ein erstes Spiel absolut passabel. Da hat jemand fleißig Tutorials gebüffelt ;)

Aber leider gibt es noch viele Bugs in der Kollisionsabfrage, sowie dem Abprall des Balles an den Wänden. Hab jetzt leider keine Zeit deinen Code durchzuschauen, aber vielleicht findeste ja selber die Bugs :allright:

Thema KI: Ich würde ersteinmal die Bugs beheben, dann mit der KI anfangen. Erster Anhaltspunkt wäre die Ballverfolgung des Schlägers. Wenn das klappt, könntest du per Zufall eine Reaktionszeit und eine Zielgenauigkeit ermitteln, die mit der eingestellten Schwierigkeit verbessert wird.

weiter so!
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

Erstmal Danke
ja ich habe fleißig Tutorials gebüffelt <)
Immer wenn ich KI höre denke ich immer an etwas sehr kompliziertes nunja ich habe mich damit noch nie wirklich auseinandergesetzt...
Erster Anhaltspunkt wäre die Ballverfolgung des Schlägers.
wie mache ich das? ich habe mir gedacht (jetzt vorest nur mal Y-Achse) , dass der Schläger mit der aufs Level bezogenen Geschwindigkeit Richtung Ball(2)Y (halt zu dem ball der auf der X-Achse näher ist) fährt. Aber Wie schreibe ich das?

Danke Tompazi

Ps: Danke für #PB_Spin_Numeric kann ich sicher gut gebrauchen :D
PPs: ersten bug gefunden der nur durchs kopieren entstanden ist... ein Y war weg... Ein fataler fehler
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> ersten bug gefunden der nur durchs kopieren entstanden ist... ein Y war weg... Ein fataler fehler
Eigentlich hätte ich das ja vorhin sagen können, ich habe den Code ja vorhin ausprobiert. Wenn ein Bal nach links fliegt und dabei an die obere Wand kommt, bleibt er an der Decke kleben.
War das dieser Fehler?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

ja
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Ok sehr gut.

Noch Punkte die ich beheben würde sind folgende:

Bei zu schnellen Bewegungen geht die Kollisionsabfrage baden, der Schläger geht durch den Ball.

Zudem ist derzeit der Punkt, der für Kollisionsabfragen genutzt wird, zentral in dem Ball. Daher versinkt der Ball bis zur Hälfte. Bei der Kollisionsabfrage den Radius noch mit einbeziehen
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag von Tompazi »

ok das könnte ich beheben in dem ich sage es gibt nur 0 - 5 Levels
Zudem ist derzeit der Punkt, der für Kollisionsabfragen genutzt wird, zentral in dem Ball. Daher versinkt der Ball bis zur Hälfte. Bei der Kollisionsabfrage den Radius noch mit einbeziehen
Tut er nicht, die Grafik des Schlägers ist so verschoben, dass der Ball direkt an ihm abprallt... außer natürlich der Ball kommt von hinten ...
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Oben und unten an den Wänden aber nicht :lol:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Code: Alles auswählen

  If EventGadget() = 5 
  SetGadgetText(5, Str(GetGadgetState(5))) 
  EndIf 
Hey Tompazi!
Dieses Stück Code kannst du jetzt rausnehmen, denn dafür hast du doch #PB_Spin_Numeric. Dieses Flag sorgt ja dafür dass das Spielen mit den zahlen automatisch aktualisiert wird. Du musst nichts mehr machen!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten