Solitaire Kugel Spiel Problem?
Übersicht

bruce85Betreff: Solitaire Kugel Spiel Problem? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Gruss Andreas |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() das ganze ist nur ein ansatz, hoffe er bringt dich auf den richtigen weg ![]() 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) ![]() l8er, psy |
||
- Zuletzt bearbeitet von PSY am Sa, Jun 24, 2006 2:25, insgesamt einmal bearbeitet
![]() |
PSYBetreff: @bizar |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo nochmal ![]() 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 ![]() Gruss Andreas |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() |
||
- Zuletzt bearbeitet von Rone am Sa, Jun 24, 2006 16:08, insgesamt einmal bearbeitet
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() l8er, psy |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Gruss Andreas |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
cool ich danke dir es klappt wunderbar ![]() Gruss Andreas |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Gruss Andreas |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() mfg |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Und danke dir für deine Hilfe ![]() Gruss Andreas |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
hab mal aus langeweile etwas weiter daran rumgefriemelt und noch ein paar Grafiken gemacht... ![]() Das ist dabei rausgekommen: http://www.sa-tec.net/Solitaire.rar mfg edit: Hmmm..geht aber nicht immer ![]() edit: So jetzt aber.. ![]() |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dein Spiel is auch gut geworden vor allem die Graphic ![]() Hier kannst du mal mein Spiel Testen, ich muss mir aber noch überlegen was ich noch dazu machen soll ![]() hier der link: http://blitz-forum.de/bruce85/Spiele/Solitaire.rar Gruss Andreas |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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? ![]() ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group