Solitaire Kugel Spiel Problem?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

bruce85

Betreff: Solitaire Kugel Spiel Problem?

BeitragFr, Jun 23, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
ich hab ja vor längerer Zeit Solitaire Spiel angefangen zu proggen und jetzt möchte ich das gerne fertig machen, nur weiss ich jetzt net so recht wie ich das hinbekomme wenn ich z.B. eine Kugel anklicke und dann das loch anklicke das dieser kugel dann dort hin plaziert wird und halt die übersprungene kugel in loch umgeändert wird, hier mal mein kompletter Quelltext:

Code: [AUSKLAPPEN]
Graphics 640,480,16,2
SetBuffer BackBuffer()

Global loch = LoadImage("loch.png")
MaskImage loch,255,0,255

Global kugel = LoadImage("kugel.png")
MaskImage kugel,255,0,255

;Spielfeld erstellen
Dim Spielfeld(6,6)

;Die Daten für die Map
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
Data 2,2,2,2,2,2,2
Data 2,2,2,0,2,2,2
Data 2,2,2,2,2,2,2
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1

;Map lesen
For y=0 To 6
  For x=0 To 6
    Read Spielfeld(x,y)
  Next
Next

Repeat
  ClsColor 127,127,127
  Cls

  ;Löcher und kugel malen
  For y=0 To 6
    For x=0 To 6
      map = Spielfeld(x,y)
      If map <> 1 Then DrawImage loch,x*34,y*34
      If map = 2 Then DrawImage kugel,x*34,y*34
    Next
  Next

  ;Überprüfen auf welches Feld die Maus sich befindet
  Feld_x = (MouseX()) / 34
  Feld_y = (MouseY()) / 34

  If Spielfeld(Feld_x,Feld_y) = 2 Then
    Color 0,128,255
    Oval Feld_x*34,Feld_y*34,34,34,1
    If MouseDown(1) Then

    EndIf
  EndIf

  Flip
Until KeyHit(1)

End


da wo If Spielfeld(Feld_x,Feld_y-2) = 0 Then steht soll dann der code rein, nur weiss ich jetzt net ob ich alles so richtig gemacht habe, könnt ihr mir vieleicht weiterhelfen wie man das macht?
danke euch schonmal Wink

Gruss Andreas
 

bruce85

BeitragSa, Jun 24, 2006 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
hat keiner ne idee wie ich das machen könnte?

ich hab mir überlegt wenn ich z.B. eine kugel anklicke das diese Kugel an die maus drangehängt wird und wenn man die kugel ins freie loch klickt das die dann abgelegt wird, nur wie?

Gruss Andreas

Rone

BeitragSa, Jun 24, 2006 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
mach dir doch einfach 2 hilfssvariablen (merkX=-1,markY=-1) die du mit neg. Werten initialisierst. Wenn dann die Maus über einer Kugel gedrückt wird, setzt du die Hilfsvariablen(merkX=feldX,merkY=FeldY).

Dann prüfst du ob die Hilfsvariablen positiv sind und die Maus über einem Loch gedrückt wird. Ist dies der Fall, dann setzt du das Map(feldX,feldY)=2 und Map(merkX,merkY) = 0 und Hilfsvariablen=-1.

oder:

wenn die kugel nach anklicken an der Maus bleiben soll, setzt du das entsprechende Feld beim anwehlen sofort auf 0 nachdem du die merker gestzt hast und setz darüber hinaus noch einen Merker (AnMAus=1)

dann machst :

if AnMaus then
Oval MausX(),MausY(),34,34,1
else
;normal zeichnen...
eindif

...beim absetzen der kugel Anmaus natürlich wieder loslassen...

edit: konnte es nicht lassen deinen code n bisschen abzuändern:
Code: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()
frametimer = CreateTimer(60)

Global loch = LoadImage("loch.bmp")
Global kugel = LoadImage("kugel.bmp")
;Spielfeld erstellen
Dim Spielfeld(6,6)
;Die Daten für die Map
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
Data 2,2,2,2,2,2,2
Data 2,2,2,0,2,2,2
Data 2,2,2,2,2,2,2
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
;Map lesen
For y=0 To 6
   For x=0 To 6
      Read Spielfeld(x,y)
   Next
Next
Local merkX=-1,merkY=-1,anMaus=0
Repeat
   ClsColor 127,127,127
   Cls
   ;Löcher und kugel malen
   For y=0 To 6
      For x=0 To 6
         map = Spielfeld(x,y)
         If map <> 1 Then DrawImage loch,x*34,y*34
         If map = 2 Then DrawImage kugel,x*34,y*34
      Next
   Next
   If AnMaus Then DrawImage kugel,MouseX()-17,MouseY()-17
   
   ;Überprüfen auf welches Feld die Maus sich befindet
   If  (MouseX()) / 34>=0 And  (MouseX()) / 34 <7 Then  Feld_x = (MouseX()) / 34
   If (MouseY()) / 34 >=0 And (MouseY()) / 34<7   Then  Feld_y = (MouseY()) / 34
   
   
   If MouseHit(1) Then
      If Not AnMaus Then
         If Spielfeld(Feld_x,Feld_y) = 2 Then
            AnMaus=1
            Spielfeld(Feld_x,Feld_y) = 0
         EndIf
      Else
         If Spielfeld(Feld_x,Feld_y) = 0 Then
            Spielfeld(Feld_x,Feld_y) = 2
            AnMaus=0
         EndIf
      EndIf
   EndIf
   
   Text 10,10,Feld_X+"    "+Feld_Y+"  "+AnMaus
   WaitTimer frametimer
   Flip
Until KeyHit(1)
End


Edit: Ops, jetzt gehts hoffentlich...
  • Zuletzt bearbeitet von Rone am Sa, Jun 24, 2006 4:35, insgesamt 2-mal bearbeitet

PSY

BeitragSa, Jun 24, 2006 2:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()

Global loch = LoadImage("loch.png")
MaskImage loch,255,0,255

Global kugel = LoadImage("kugel.png")
MaskImage kugel,255,0,255

;Spielfeld erstellen
Dim Spielfeld(6,6)

;Die Daten für die Map
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
Data 2,2,2,2,2,2,2
Data 2,2,2,0,2,2,2
Data 2,2,2,2,2,2,2
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1

;Map lesen
For y=0 To 6
  For x=0 To 6
    Read Spielfeld(x,y)
  Next
Next

Repeat
  ClsColor 127,127,127
  Cls

  ;Löcher und kugel malen
  For y=0 To 6
    For x=0 To 6
      map = Spielfeld(x,y)
      If map <> 1 Then DrawImage loch,x*34,y*34
      If map = 2 Then DrawImage kugel,x*34,y*34
    Next
  Next

  ;Überprüfen auf welches Feld die Maus sich befindet
    feld_x=mousex()/34
    feld_y=mousey()/34
 
    If MouseHit(1)
      If kugel_in_hand=false And Spielfeld(feld_x,feld_y) = 2
        spielfeld(feld_x,feld_y)=0
        origin_x=feld_x:origin_y=feld_y
        kugel_in_hand = True
      EndIf
    endif
       
      If MouseDown(1)
          If kugel_in_hand then DrawImage kugel,mousex(),mousey()
            Else
               If kugel_in_hand
                 If spielfeld(feld_x,feld_y)=0 Then spielfeld(feld_x,feld_y)=2 Else spielfeld(origin_x,origin_y)=2
                 kugel_in_hand=false
              endif
         endif

  Flip
Until KeyHit(1)

End


solange geklickt ist, lässt er den stein in der hand, wenn losgelassen wird, setzt er den stein entweder auf ein freies feld oder auf die ursprungsposition, je nachdem ob das feld unter der maus frei ist oder nicht Exclamation
das ganze ist nur ein ansatz, hoffe er bringt dich auf den richtigen weg Wink

musst natürlich auch dran denken, die maus auf unzulässige positionen beim klicken zu überprüfen, ansonsten könnts zu ungewollten problemen kommen (wg. spielfeld)Exclamation

l8er,
psy
  • Zuletzt bearbeitet von PSY am Sa, Jun 24, 2006 2:25, insgesamt einmal bearbeitet

PSY

Betreff: @bizar

BeitragSa, Jun 24, 2006 2:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@bizar

bei dir is noch ein kleiner fehler drin, nimm mal nen stein, setz ihn wieder ein, und klick dann auf das nächste freie feld, dann wird wieder ein stein gesetzt obwohl man keinen mehr in der hand hat

l8er
psy
 

bruce85

BeitragSa, Jun 24, 2006 2:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ich danke euch,
das wüsste ich ja, mein problem ist ja wie ich wenn ich die kugel dann überspringe das halt die kugel weg geht, ich habs probiert, aber meistens kommt immer: array index out of bonds, wieso?

Gruss Andreas

Rone

BeitragSa, Jun 24, 2006 4:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

das wüsste ich ja


hä?


Zitat:


mein problem ist ja wie ich wenn ich die kugel dann überspringe das halt die kugel weg geht, ich habs probiert


...ich nehme an, du willst das die Kugel die übersprungen wird verschwindet?!
überlegen+probieren Smile


Zitat:

array index out of bonds, wieso?

wenn du feld_x und feld_y ausrechnest musst du prüfen ob die errechneten Werte innerhalb des Spielfeldes sind...
Code: [AUSKLAPPEN]

:
If  (MouseX()) / 34>=0 And  (MouseX()) / 34 <7 Then  Feld_x = (MouseX()) / 34
   If (MouseY()) / 34 >=0 And (MouseY()) / 34<7   Then  Feld_y = (MouseY()) / 34
:


Steht aber auch in den anderen beiden Antworten schon. Hast du dir den Code nicht angeguckt - also bei mir kommt da kein array index out of bonds.
Im übrigen kann man solche Fehler auch innerhalb von 2 Sekunden mit dem Debugger finden, gerade wenns nur ein paar zeilen code sind...

mfg
 

bruce85

BeitragSa, Jun 24, 2006 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo nochmal Wink

ich habe das jetzt mal so probiert:

Code: [AUSKLAPPEN]
If MouseDown(1) Then
    ;wenn maus gedrückt und kugel in hand, zeichne kugel an mausposition
    If kugel_in_hand Then DrawImage kugel,MouseX()-10,MouseY()-10
    ;maus nicht gedrückt oder losgelassen?
    Else
    If kugel_in_hand
      ;wenn kugel in hand und spielfeld über maus leer, lass kugel fallen, andernfalls setze auf originalposition zurück
      If spielfeld(feld_x,feld_y)=0 Then spielfeld(feld_x,feld_y)=2 Else spielfeld(origin_x,origin_y)=2
        If spielfeld(origin_x,origin_y-2) = 0 Then
          If spielfeld(origin_x,origin_y-1) = 2 Then
            spielfeld(origin_x,origin_y-1) = 0
          EndIf
        EndIf
      kugel_in_hand=False
      EndIf
  EndIf


also wenn ich eine kugel anklicke dann wird ja das Feld gemerkt, und wenn -2 Felder ein loch ist und -1 Feld kugel ist dann ist der zug möglich, aber die kugel geht dann nicht weg wenn ich die kugel überspringe, wenn ich die kugel doppelt anklicke dann wird sie gelöscht, wisst ihr vieleicht was da falsch ist?

danke euch schonmal Wink

Gruss Andreas

Rone

BeitragSa, Jun 24, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

wie gesagt: Wenn man was nicht auf einem Blick durchschaut, geht man die schleife einmal schritt für schritt mit dem Debugger durch, dann sieht man meistens direkt wo/wann was falsches gemacht wird...

Ansonsten schau dir mal folgenden Code genau an, da funktioniert das.
Sollte dir helfen:
Code: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()
frametimer = CreateTimer(60)

Global loch = LoadImage("loch.bmp")
Global kugel = LoadImage("kugel.bmp")
;Spielfeld erstellen
Dim Spielfeld(8,8)
;Die Daten für die Map
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
Data 2,2,2,2,2,2,2
Data 2,2,2,0,2,2,2
Data 2,2,2,2,2,2,2
Data 1,1,2,2,2,1,1
Data 1,1,2,2,2,1,1
;Map lesen
For y=1 To 7
   For x=1 To 7
      Read Spielfeld(x,y)
   Next
Next
Local merkX=-1,merkY=-1,anMaus=0
Repeat
   ClsColor 127,127,127
   Cls
   ;Löcher und kugel malen
   For y=1 To 7
      For x=1 To 7
         map = Spielfeld(x,y)
         If map <> 1 Then DrawImage loch,x*34,y*34
         If map = 2 Then DrawImage kugel,x*34,y*34
      Next
   Next
   If AnMaus Then DrawImage kugel,MouseX()-17,MouseY()-17
   
   ;Überprüfen auf welches Feld die Maus sich befindet
   If  (MouseX()) / 34>=1 And  (MouseX()) / 34 <8 Then  Feld_x = (MouseX()) / 34
   If (MouseY()) / 34 >=1 And (MouseY()) / 34<8   Then  Feld_y = (MouseY()) / 34
   
   
   If MouseHit(1) Then
      If Not AnMaus Then
         If Spielfeld(Feld_x,Feld_y) = 2 Then
            AnMaus=1
            Spielfeld(Feld_x,Feld_y) = 0
            merkX=feld_X
            merkY=feld_Y
         EndIf
      Else
         If Spielfeld(Feld_x,Feld_y) = 0 Then
            tempX=Feld_X-merkX
            tempY=Feld_Y-merkY
            If Feld_x=merkX And feld_Y=merkY Then
               Spielfeld(Feld_x,Feld_y) = 2
               AnMaus=0
            ElseIf ( (tempX=2 Or tempX=-2) And tempY=0  ) Then 
               If tempX=-2 And Spielfeld(Feld_x+1,Feld_y) = 2 Then
                  Spielfeld(Feld_x,Feld_y) = 2
                  AnMaus=0
                  Spielfeld(Feld_x+1,Feld_y) = 0   
               ElseIf tempX=2 And Spielfeld(Feld_x-1,Feld_y) = 2
                  Spielfeld(Feld_x,Feld_y) = 2
                  AnMaus=0
                  Spielfeld(Feld_x-1,Feld_y) = 0
               EndIf 
            ElseIf ( (tempY=2 Or tempY=-2) And tempX=0  ) Then
               If tempY=-2 And Spielfeld(Feld_x,Feld_y+1) = 2 Then
                  Spielfeld(Feld_x,Feld_y+1) = 0
                  Spielfeld(Feld_x,Feld_y) = 2
                  AnMaus=0
               ElseIf tempY=2 And Spielfeld(Feld_x,Feld_y-1) = 2 Then
                  Spielfeld(Feld_x,Feld_y-1) = 0
                  Spielfeld(Feld_x,Feld_y) = 2
                  AnMaus=0
               EndIf 
            EndIf
         EndIf
      EndIf
   EndIf
   
   WaitTimer frametimer
   Flip
Until KeyHit(1)
End


mfg

edit: hopalla... Confused war noch nen fehler drin, jetzt gehts aber...
  • Zuletzt bearbeitet von Rone am Sa, Jun 24, 2006 16:08, insgesamt einmal bearbeitet

PSY

BeitragSa, Jun 24, 2006 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

If spielfeld(feld_x,feld_y)=0 Then spielfeld(feld_x,feld_y)=2 Else spielfeld(origin_x,origin_y)=2


wenn das feld leer ist wird ein stein gesetzt, also kann

Code: [AUSKLAPPEN]

        If spielfeld(origin_x,origin_y-2) = 0 Then


nie mehr eintreffen, da der stein ja gesetzt wurde mit spielfeld(feld_x,feld_y)=2 !
( origin_x,origin_y-2 ist ja in diesem fall = feld_x,feld_y und das wurde in der ersten codezeile ja auf 2 gesetzt Wink )

l8er,
psy
 

bruce85

BeitragSa, Jun 24, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich danke euch, jetzt funzt es, aber noch ein einziges problem gibts da, und zwar die felder werden bei mir falsch berechnet.
ich lasse ja so die Felder positionieren:

Code: [AUSKLAPPEN]
For y=0 To 7
    For x=0 To 7
      map = Spielfeld(x,y)
      If map <> 1 Then DrawImage loch,64+x*48,64+y*48
      If map = 2 Then DrawImage kugel,64+x*48,64+y*48
    Next
  Next


und wie muss ich es hier berechnen, weil / 60 is glaub zuviel oder so:

Code: [AUSKLAPPEN]
If (MouseX()) / 60>=0 And (MouseX()) / 60<7 Then  Feld_x = (MouseX()) / 60
   If (MouseY()) / 60>=0 And (MouseY()) / 60<7 Then  Feld_y = (MouseY()) / 60


sry, aber ich habe noch net soviel ahnung mit Dim Felder wie man was berechnet Crying or Very sad

Gruss Andreas

Rone

BeitragSa, Jun 24, 2006 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]


Local tileBreite  = 48
Local tileHoehe   = 48
Local mapXoffset = 64
Local mapYoffset = 64

If ( (MouseX() - mapXoffset) / tileBreite) >= 0 And ( (MouseX() - mapXoffset) / tileBreite) < 7 Then
   Feld_x = (MouseX() - mapXoffset) / tileBreite)
   
If ( (MouseY() - mapYoffset) / tileHoehe) >= 0 And ( (MouseY() - mapYoffset) / tileHoehe) < 7 Then
   Feld_y = (MouseY() - mapYoffset) / tileHoehe)

 

bruce85

BeitragSa, Jun 24, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
cool ich danke dir es klappt wunderbar Very Happy

Gruss Andreas
 

bruce85

BeitragSo, Jun 25, 2006 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo nochmal,
ich wollte mal fragen wie ich überprüfe ob kein zug mehr möglich ist?
weil wenn kein zug mehr möglich ist dann soll man sich in der Highscoreliste eintragen, alles ist schon fertig, brauch nur ein befehl zum prüfen ob kein zug mehr möglich ist.

Danke euch schonmal Wink

Gruss Andreas

Rone

BeitragSo, Jun 25, 2006 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
moin,

lauf dein Spielfeld durch und wenn an einer Stelle ein Stein ist, prüfst du ob darüber, darunter, links oder rechts davon noch ein Stein ist. Ist dies der Fall,dann ist noch ein Zug möglich.

Ich würde mir dafür ne Function schreiben:

Code: [AUSKLAPPEN]

Function Check()
   For iy = 0 To 7
      For ix = 0 To 7
         If Feld(ix , iy) = 2 Then
            If Feld(ix - 1 , iy) = 2 Or Feld(ix + 1 , iy) = 2 Or Feld(ix , iy - 1) = 2 Or Feld(ix , iy+1) = 2 Then
               Return(0)
            EndIf
         EndIf
      Next
   Next
   Return (1)
End Function

If Check() Then
    ; Kein Zug mehr möglich
EndIf



Poste mal ne Zip von deinem Spiel, wenn du fertig bist...
würde mich interessieren wie es geworden ist Wink

mfg
 

bruce85

BeitragSo, Jun 25, 2006 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
okay, aba da gibts ein Problem, wenn jetzt z.B. ganz rechts 3 steine ober einander liegen dann ist ja auch kein zug mehr möglich, aba ich werde es dann mal versuchen ob ich es hinbekomme, sobald mein Spiel Fertig ist, dann poste ich ein Download Link Wink

Und danke dir für deine Hilfe Very Happy

Gruss Andreas

SpionAtom

BeitragSo, Jun 25, 2006 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss auch immer 3 Felder prüfen, die nebeneinander oder übereinander liegen. 2 nebeneinander liegende Felder müssen belegt sein, und das dritte muss frei sein.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Rone

BeitragSo, Jun 25, 2006 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hab mal aus langeweile etwas weiter daran rumgefriemelt und noch ein paar Grafiken gemacht... Smile

Das ist dabei rausgekommen:
http://www.sa-tec.net/Solitaire.rar

mfg

edit: Hmmm..geht aber nicht immer Confused

edit: So jetzt aber.. Smile
 

bruce85

BeitragSo, Jun 25, 2006 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Spiel is auch gut geworden vor allem die Graphic Very Happy .
Hier kannst du mal mein Spiel Testen, ich muss mir aber noch überlegen was ich noch dazu machen soll Wink
hier der link:
http://blitz-forum.de/bruce85/Spiele/Solitaire.rar

Gruss Andreas

SpionAtom

BeitragSo, Jun 25, 2006 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@bizar98
Ist gut geworden. Hab keine Fehler entdeckt.

@bruce85
Ist gut geworden, hab aber einen Fehler entdeckt. Bei mir waren keine Züge mehr möglich, jedoch hat er das nicht erkannt. Da stimmt also noch nicht alles. Aber das mit den verschiedenen Feldern und Belegungen ist eine Idee für die Langzeitmotivation. Und? Sind alle Felder lösbar, sodass nur eine Kugel am Ende übrigbleibt? Wink Rolling Eyes
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group