Entwickler-Ecke
Sonstiges (Delphi) - Schachprogramm [mal wieder]
Timo93 - Fr 24.06.11 18:31
Titel: Schachprogramm [mal wieder]
Hallo :D
In der Schule haben wir im Informatikunterricht eine Aufgabe bekommen und ich hab das Schachprogramm erwischt.
Ich bin natürlich gleich an die Sache ran gegangen und habe mein möglichstes versucht.
Allerdings bin ich nicht sehr weit gekommen.
Ich habe bisher ein Spielfeld durch ein 2-dimensionales Array erstellt und die Figuren zugeordnet die sich dann auf
( Spielfeld[1,1].Figur:=Turm; ) befinden. Allerdings weiß ich jetzt nicht wie ich weitermachen soll....
Darum wollte ich fragen, wie ich die Züge der einzelnen Figuren implementieren kann ohne bei jedem Feld ein Image einzusetzen um es somit
anklickbar zu machen und dadurch dann durch tausende if-Anweisungen zum Ziel zu kommen.
Mit freundlichen Grüßen
Timo
Ps: Ich hab mir schon die anderen Beiträge zu Schachprogrammen angeschaut aber nicht viel verstanden....war viel mit KI usw.....
Mein Auftrag besteht nur aus einem 2-D Schachprogramm, indem 2 Spieler gegeneinander spielen können an einem Computer.
ALF - Fr 24.06.11 20:19
Du kannst das ganze auch per Eingabe machen über Editfelder, so wie man sich halt ein Schachzug aufschreibt. Die Prüfung lässt sich allerdings auch nicht ohne Ifs durchführen, um zu Prüfen ob der Zug durchgeführt werden kann.
Gruss ALf
Jann1k - Fr 24.06.11 22:39
Was immer du auch tust, nimm bitte nur ein Image für das gesamte Schachbrett inkl. Figuren. Dann hast du mehrere Möglichkeiten:
1. Eingabe der Felder in entsprechende Edit/Comboboxen.
2. Du lässt die Spieler mit Pfeiltasten o.ä. ein "Auswahlfeld" übers Spielfeld schieben -> Figur auswählen -> Zielfeld markieren -> Figur wird dahin gezogen.
3. Du nutzt das OnClick Ereignis des Images. Mit Mouse.cursorpos bekommst du die aktuelle Position der Maus (hier aufpassen du musst die Werte noch auf dein Fenster umrechnen) und kannst dir dann errechnen auf welches Feld geklickt wurde.
Timo93 - Sa 25.06.11 00:45
Vielen Dank für eure 2 schnellen Antworten. Ich werde das mal mit den Edit/Comboboxen versuchen und mich dann nochmal melden, wenn ich nochmal Hilfe brauche.
Vielen Dank vorerst und freundliche Grüße
Timo
Stundenplan - Sa 25.06.11 09:20
Jann1k hat folgendes geschrieben : |
| 3. Du nutzt das OnClick Ereignis des Images. Mit Mouse.cursorpos bekommst du die aktuelle Position der Maus (hier aufpassen du musst die Werte noch auf dein Fenster umrechnen) und kannst dir dann errechnen auf welches Feld geklickt wurde. |
In OnMouseDown/OnMouseUp des Images gäbs schon X und Y, direkt auf sein Image zugerechnet! :zwinker:
Zudem wärs glaube ich besser, wenn er ne PaintBox nehmen würde.
Viele Grüße,
Stundenplan.
Timo93 - Sa 25.06.11 11:42
Hallo :D
@ Stundenplan: Was meinst du mit PaintBox? Hab ich noch nicht mit gearbeitet. Inwiefern würde das die Arbeit "erleichtern"?
Ich hab mir das jetzt mal mit Editboxen angeschaut und überlegt, dass wenn ich dort den Namen eines Feldes eingebe, (A1,A2,...,usw)
Delphi prüfen soll, welche Figur sich darauf befindet und dann in einer anderen Box die möglichen Felder angezeigt werden, die man machen kann.
Allerdings müsste ich da für jedes Feld viel schreiben. Oder wie kann man das leichter machen?
Viele Grüße,
Timo
Jann1k - Sa 25.06.11 11:55
Was meinst du mit "viel schreiben"? Du kennst die Figur und das Feld auf dem sie sich befindet, mit den Indexen kannst du dann doch relativ leicht errechnen, welche Felder zum Ziehen möglich sind. Dabei musst du nur aufpassen, dass du die Arraygrenzen nicht überschreitest, ob die Zielfelder überhaupt frei sind (oder eine eigene Figur drauf steht) und ob der Weg dahin blockiert wird (Turm kann von a1 nicht auf a3, wenn auf a2 eine Figur steht). Etwas Tricky wirds auch noch beim Bauern, da seine Zugmöglichkeiten sich erweitern, wenn gegnerische Figuren schräg vor ihm stehen (von en passant mal ganz zu schweigen).
Ich würde mit der Bewegung vom Springer anfangen, der ist denke ich am einfachsten.
ALF - Sa 25.06.11 12:04
Mit einer PaintBox das alles zu machen, als Einsteiger, würde ich erst mal verwerfen.
Schau Dir mal Drawgrid an, da sparst Du Dir jede menge arbeit :wink:
Dadurch hast Du schon die einzelnen Felder. Wie Du die Felder zeichnest findest Du hier in der Suche 'DrawCell'. Oder hier auch mal ein Beispiel
http://www.delphi-forum.de/viewtopic.php?t=67102&highlight=drawgrid1drawcell
Und Schon hast Du dein Schachbrett
Was die Eingabefelder betrifft klar wird es nicht einfach, 'K A1,A2' zB musst Du natürlich auseinandernehmen. K für König, A1 seine jetztige Position, A2 wo er hinsoll. Dann die Möglichjkeiten prüfen ob der König da hingehen kann oder nicht.
Der Rest ist dann so wie @Jann1k geschrieben hat.
Gruss Alf
Timo93 - Sa 25.06.11 19:00
Ehrlich gesagt steh ich gerade ein wenig auf dem Schlauch, was die Indexen die du genannt hast angeht. Welche Indexen? :D Entschuldigt....komm mir grad bisschen doof vor^^
und sind ja auch noch Ferien :D
Ich habe schon ein Schachfeld gezeichnet und bei mir liegt gerade das Problem eher an den Zügen der einzelnen Schachfiguren. Ich hab auch schon definiert wie die Felder heißen, (A1,A2,...,) dann hab ich nach Farbe geteilt (Schwarz, Weiß, LeeresFeld) und auch noch nach Figuren. Vielleicht ist ja auch irgendwas davon überflüssig. Bin mir grad bisschen unsicher.
Danke, dass ihr euch Zeit für mich nehmt.
Liebe Grüße
Timo
Jann1k - Sa 25.06.11 19:16
Du hast doch dein Array Spielfeld, mit den Indexen mein ich zB, dass das Feld d4 mit Spielfeld[4,4] angesteuert wird (vllt auch andere Werte als die 4 je nachdem von wo aus du zählst und ob dein Array bei 1 oder 0 anfängt).
Kleines Beispiel:
Du hast einen Springer auf d1 (Spielfeld[4,1]). Wohin kann dieser Springer ziehen? Der Springer bewegt sich 2 Schritte in eine Richtung und dann einen Schritt im rechten Winkel dazu. Als Möglichkeiten haben wir also:
Spielfeld[4+2,1+1]
Spielfeld[4+2,1-1]
Spielfeld[4-2,1+1]
Spielfeld[4-2,1-1]
Spielfeld[4+1,1+2]
Spielfeld[4+1,1-2]
Spielfeld[4-1,1+2]
Spielfeld[4-1,1-2]
Von diesen Möglichkeiten müssen, wir jetzt diejenigen rausnehmen, die das Spielfeld verlassen würden (Index >8 oder Index <1), dann bleiben noch:
Spielfeld[6,2]
Spielfeld[2,2]
Spielfeld[5,3]
Spielfeld[3,3]
Jetzt müssten noch die Felder entfernt werden, die durch eigene Figuren blockiert sind.
Timo93 - Sa 25.06.11 19:33
Okay. Das hab ich verstanden. Aber der Springer steht ja nicht immer auf Spielfeld[4,1]... so müsste ich doch für jedes Feld, im Falle dass sich ein Springer darauf befindet, das gleiche nochmal tippen.
Kann ich da nicht einfach die aktuelle Springerposition einfügen und dann eben dieses +2 , +1 , usw (Spielfeld[n+2,m+1]) eingeben lassen?
Ich weiß auch noch nicht, wie ich diese Möglichkeiten anzeigen lassen soll, die übrig bleiben.
Grüße
Timo
Jann1k - Sa 25.06.11 19:42
| Zitat: |
| Kann ich da nicht einfach die aktuelle Springerposition einfügen und dann eben dieses +2 , +1 , usw (Spielfeld[n+2,m+1]) eingeben lassen? |
Vom User eingeben lassen? Das du das automatisch berechnen lässt ist hoffentlich klar, das für jedes Feld einzutippen wäre grober Unfug. Oben steht ja auch nur ein Beispiel ;)
| Zitat: |
| Ich weiß auch noch nicht, wie ich diese Möglichkeiten anzeigen lassen soll, die übrig bleiben. |
Je nachdem, wie das Programm am Ende aussehen soll, musst du das gar nicht anzeigen, aber du wirst es brauchen, um zu testen ob ein eingegebener Zug überhaupt erlaubt ist.
Timo93 - Sa 25.06.11 19:49
Ja :D Das hatte ich ja gemeint... aber wie mach ich das denn mit dem automatisch berechnen... nicht wie, eher wo :D
Hab mir jetzt überlegt, rechts neben das Schachfeld ein Edit Feld anzubringen, wo man das Feld auswählt (A1 zb.)
und dann in einem anderen Feld (ListBox????weiß ich nicht genau) die möglichen Züge anzeigen zu lassen und dann dort auswählen und mit
einem O.K-Button den Zug letztendlich ausführt...
was meinst du dazu?
Timo
Jann1k - Sa 25.06.11 20:01
Also ich bin kein Fan einer Editfeld-Listbox-Eingabe, es funktioniert zwar, aber wirkt doch etwas umständlich. Wie oben schon gesagt würde ich mit Klicks auf dem Image arbeiten, das ist am Ende für den User auch intuitiver. (Wenn du wie von Stundenplan vorgeschlagen, die OnMouseDown/OnMouseUp Ereignisse nimmst, hast du ja schon die Koordinaten auf dem Image, von da aus kommt man sehr leicht zum entsprechenden Feld). Aber wie gesagt, klappen tut beides.
| Zitat: |
| Ja :D Das hatte ich ja gemeint... aber wie mach ich das denn mit dem automatisch berechnen... nicht wie, eher wo :D |
Das Wo Entscheidest du, willst du dem Spieler seine Zugmöglichkeiten anzeigen, musst du das ganze berechnen, wenn er eine Figur auswählt, willst du nur einen Zug auf Gültigkeit überprüfen, brauchst du es erst berechnen, wenn er Figur und Zielfeld ausgewählt hat. Ich würde mal sagen eine Funktion die als Parameter eine Figur + derzeitige Koordinaten kriegt und deren Zugmöglichkeiten berechnet, kann nicht schaden. Und wo du sie dann aufrufen musst, siehst du dann ja wenn du den Spielverlauf machst.
Timo93 - Sa 25.06.11 20:55
Dann werde ich das wohl doch lieber mit der OnMouseDown/Up funktion versuchen. So...nun wie mach weiter? :D
Wie kann ich denn die Felder auswählen? :D Ist doch schließlich nur ne Matrix....kann ich doch nirgends draufklicken.
Timo
Jann1k - Sa 25.06.11 21:08
Wie stellst du denn dein Spielfeld jetzt für den User eigentlich dar?
Timo93 - Sa 25.06.11 21:33
Ich hab mit Canvas so n Spielfeld gezeichnet.
Jann1k - Sa 25.06.11 21:42
Na, denn ich denke mal die Canvas ist Teil eines TImage, dieses hat das OnMouseDown Ereignis, dieses liefert dir direkt die X bzw. Y-Koordinate des Mauszeigers auf dem Bild. Wie kommen wir jetzt von dieser Zahl auf die Feldindexe? Ich nehme jetzt mal an, auf der Canvas wird nur das 8x8 Spielfeld gezeichnet, dann teilst du einfach die X bzw. Y Koordinate durch die Breite eines Feldes und hast den entsprechenden Index (je nachdem wo bei dir der Koordinatenursprung liegt, oder deine Arraygrenzen liegen, musst du den Wert noch anpassen).
Timo93 - Sa 25.06.11 21:50
Ja stimmt. Ich hab n Image wo ich das reingezeichnet habe. Allerdings gibts da nen kleinen Rand...kann ich aber ja eigentlich anpassen...
Aber wie komm ich denn auf die Feldindexe? Und ich kann ja auch noch kein Feld anklicken....oder muss ich das dann mit diesem Mouse.Cursorpos machen?
Timo
Jann1k - Sa 25.06.11 22:04
Du kannst das TImage anklicken ;)
Wähl das TImage aus, geh im Objektinspector auf Ereignisse und such dann das OnMouseDown-Event und dann machst du:
| Zitat: |
| das OnMouseDown Ereignis, dieses liefert dir direkt die X bzw. Y-Koordinate des Mauszeigers auf dem Bild. Wie kommen wir jetzt von dieser Zahl auf die Feldindexe? Ich nehme jetzt mal an, auf der Canvas wird nur das 8x8 Spielfeld gezeichnet, dann teilst du einfach die X bzw. Y Koordinate durch die Breite eines Feldes und hast den entsprechenden Index (je nachdem wo bei dir der Koordinatenursprung liegt, oder deine Arraygrenzen liegen, musst du den Wert noch anpassen). |
Timo93 - Sa 25.06.11 22:24
Okay. Hab ich gemacht.....kann ich die Werte die bei diesem Vorgang rauskommen auch i.wo einsehen?
IndexZ := ((Mouse.CursorPos.X -50) div 50);
IndexB := ((Mouse.CursorPos.Y -50) div 50);
...keine Ahnung, ob ich das jetzt richtig verstanden habe.
Jann1k - Sa 25.06.11 22:39
Die Werte kannst du dir ja einfach in nem Label o.ä. reinschreiben und so einsetzen, oder du nutzt den Debugger ^^
Und nein so wirds nicht gehen mouse.cursorpos liefert dir die Position des Mauszeigers auf dem Desktop. Um das auf dein Image anzugleichen, müsstest du noch die Position deiner Form auf dem Desktop und die Position deines Images auf der Form davon abziehen - oder du nimmst gleich die X und Y Werte die dir OnMouseDown liefert.
Timo93 - Sa 25.06.11 22:48
Kannst du mir nen kleinen Anstoss geben?
Wie schreib ich das denn, dass da nur die MousePosition im Image genommen werden soll und durch die Breite geteilt werden soll......
Bestimmt hast du dir schon mit der Hand an die Stirn geschlagen, wenn du meine unwissenden Beiträge hier liest :D
Timo
Timo93 - Sa 25.06.11 23:12
Okay....hab zu voreilig geschrieben.....
Habs jetzt kapiert, was du mit den x, y werten direkt aus OnMouseDown gemeint hattest und die Felder sind so anklickbar.
Wie kann ich das jetzt aber auf die Figuren übertragen? :D
Jann1k - So 26.06.11 10:31
Denk halt mal nach, wenn du bei jeder Kleinigkeit hier sofort nachfragst wird das bestimmt nichts ;)
Timo93 - So 26.06.11 11:08
Also ich hab jetzt schon ne Weile nachgedacht :D
Aber ich komm einfach nicht drauf, wie ich diese Indexe.....(geht ja dann 2 mal von 1 bis 8) in die Prüfung der Schachzüge einbauen kann....
Warum muss ich immer nur so schwere Sachen machen -.- ^^
Timo
Timo93 - So 26.06.11 21:59
Jannik :D Ich hab schon voll die Fortschritte gemacht....vielen Dank dir :D
Das Programm läuft jetzt soweit, dass die Bauern machen was sie solln :D
Allerdings ist das alles noch relativ Theoretisch und man sieht noch nichts.......
ich hänge gerade an dem Punkt, die Images der Bauern auf die Anwendungen zu übertragen....d.h welches Image ist auf welchem Feld....
ich hoffe aber, dass ich das noch hinbekomme :D
Wollte mich nur nochmal bedanken.
Viele Grüße Timo
Jann1k - So 26.06.11 22:10
Immer wieder gerne ;)
Timo93 - Mo 27.06.11 14:51
Hey Jannik....nochmal ne Frage....wie kann ich den da z.B ein Bild für alle 8 schwarzen Bauern einfügen.... oder wie stell ich das am besten dar?
Timo
Jann1k - Mo 27.06.11 17:02
Angenommen du hast das Bild eines Bauern in bauer.bmp gespeichert und der Hintergrund vom Bauernbild ist in der Farbe clFuchsia:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var bit:tbitmap;
bit:=tbitmap.Create(); bit.LoadFromFile('bauer.bmp'); bit.TransparentColor:=clFuchsia; bit.Transparent:=true;
image1.canvas.draw(20,20,bit); |
Timo93 - Mo 27.06.11 18:40
Muss ich das dann für jede Figur extra machen?
oder geht das dann so ähnlich:
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i:= 1 to 8 do begin if Figur = Bauer then begin ImSpielfeld.canvas.draw((50*i)+10,105,bit); end; end; |
Weil wie kann ich die Figuren denn jetzt bewegen, wenn z.b der Bauer von B1 auf C1 will?
Timo
Moderiert von
Narses: Delphi-Tags hinzugefügt
Jann1k - Mo 27.06.11 18:57
So wie du's geschrieben hast geht es ungefähr.
Wenn du keine animierte Bewegung brauchst, ist das Bewegen doch ganz einfach, du setzt in deinem Spielfeldarray die alte Position des Bauern auf "leer" und die neue Position auf "Bauer". Dann einmal das SPielfeld neuzeichnen und schon hat sich dein Bauer bewegt.
P.S. Wenn der Bauer von B1 auf C1 will, sollte ihm jemand sagen, dass er das nicht darf ^^
beastofchaos - Mo 27.06.11 19:33
Nochmal zur Mouse-Position: Es gibt auch die Methode von Klassen namens "ScreenToClient(Mouse.CursorPos)". Das kansnte für Images, Forms, etc. benutzen ohne, dass du selbst das berechnen musst ;) (Spart Quelltext)
Gruß, Thomas
Timo93 - Mo 27.06.11 19:42
@ beastofchaos
Jo hatte ich schon versucht, aber dann durch das einfügen von Indexen übebrückt bei OnMouseDown....
somit hat gerade jedes Feld seinen eigenen Index....
@ Jannik: wie kann ich das denn neu zeichnen lassen? :D
Bisher ist es schon so, dass da dann dransteht, wenn der Bauer von B1 auf C1 gezogen ist:
wenn ich C1 anklicke := Sie haben einen schwarzen Bauern ausgewählt.
und wenn ich B1 anklicke := Spielfeld ist leer, es wurde keine Figur ausgewählt.
Allerdings bewegen sich die Images die ich für die Bauern eingefügt habe nicht mit, wenn sich ein Bauer bewegt :D
Ich muss also 'Bauer' irgendwie ein Image zuordnen....das bekomm ich aber i.wie nicht gebacken.
Bisschen komisch.....
Grüße
Timo
Boldar - Mo 27.06.11 19:47
Hast du jetzt einzelne Images für die Figuren?
Das war gerade das, was du nicht machen solltest.
Du musst die Bilder in ein TBitmap laden, und dann wie oben mit canvas.draw zeichnen. Siehe auch den Beitrag von Jann1k.
Bedenke: Bitmap!=Image.
Mit canvas.refresh entfernst du alles gezeichnete.
Dann musst du mit draw nochmal alle Figuren mit den geänderten Koordinaten zeichnen.
Am besten machst du dir eine Klasse Figur, welche Koordinaten und Bild speichert sowie eine Methode zur Validitätsprüfung der Züge bereitstellt.
mfg Boldar
Timo93 - Mo 27.06.11 20:13
Jap....hab's wieder geändert.
Hab die Images raus und über das Bitmap die Figuren zeichnen lassen.
Delphi-Quelltext
1: 2: 3: 4:
| for i:= 1 to 8 do begin ImSpielfeld.canvas.draw(50*i+10,104,bit); ImSpielfeld.canvas.draw(50*i+10,354,sec); end; |
bit sind die schwarzenBauern
sec sind die weißenBauern
Jetzt sieht das schonmal ganz gut aus und ich hab auch nicht Hunderte Images für die ganzen Bauern :D
Wo mach ich das am besten rein mit dem Canvas.refresh und dem Zeichnen?
Geht das bei dem Button der die Züge ausführt?
Da wird grade alles geändert....
Timo
Danke für die schnelle Antwort Boldar :D
Moderiert von
Narses: Delphi-Tags hinzugefügt
Jann1k - Mo 27.06.11 20:16
Naja, ich würde das Zeichnen überall dort hinmachen, wo sich etwas ändert. D.h. nach jedem Zug.
Timo93 - Mo 27.06.11 20:52
Also mach ich das bei dem Button 'Mach den Zug!' rein :D. Alles klar.
Wie kann ich denn das Feld speichern, wie es vorm letzten Zug war....dass ich das dann wieder öffne und nur einen Zug hinzufüge.
oder was macht Canvas.Refresh genau? Alle gezeichneten Figuren löschen? :D
Boldar - Mo 27.06.11 21:13
refresh löscht alles.
Das heisst, du musst danach alles neuzeichnen.
Am besten machst du dir da eine Prozedur. Wenn du die Figuren als Objekte hast, kannst du die in einem array verwalten und dann das array mit ner schleife durchgehen und alle zeichnen. Mach dir dafür am besten eine zeichenprozedur, in der zuerst refresh aufgerufen wird und dann alles neugezeichnet wird.
Timo93 - Mo 27.06.11 21:53
Hab das jetzt hinbekommen, dass sich die Figur immer richtig zeichnet, bei nem Zug von nem Bauer. (Ohne alles zu löschen)
Nächstes Problem: An der Ausgangsposition des Bauern ist immer noch das Bild eines Bauern gemalt...kann man das übermalen, oder wieder löschen? :D
Timo
Boldar - Mo 27.06.11 22:23
Genau deshalb doch refresh und neuzeichnen.
Du kriegst das sonst einfach nicht vernünftig hin.
Lies nochmal meinen Post oben und überlege, was ich dir damit sagen will; vorallem das mit der Zeichenprozedur.
Boldar
Timo93 - Di 28.06.11 20:42
Hallo mal wieder :D
Also @Boldar... ich hab bisher noch keine Ahnung, wie das mit Klassen funktioniert :D Und das mit Refresh hab ich mehrmals versucht...
Hab dann ne Weile überlegt und dann kam mir die Idee.....
Ich mal den Bauer einfach auf seiner Zukünftigen Position nochmal.... hab ich so gemacht:
ImSpielfeld.Canvas.Draw(IndexB*50+10,((IndexZ+o)*50)+5,bit);
Das funktioniert auch einwandfrei....allerdings ist dann an der Startposition des Bauern immernoch ein Bauer dargestellt....dieses Probelm wollte ich so beheben:
with ImSpielfeld.Canvas do begin
Brush.Color := clwhite;
with Spielfeld[IndexB,IndexZ] do rectangle(IndexB*50,IndexZ*50,IndexB*50+50,IndexZ*50+50);
end;
Allerdings fehlt hier noch eine if-Anweisung, wann er weiß und wann schwarz malen soll.....
Hast du da eventuell ne Idee für die Bedingung?
Hab's schon versucht mit
if (IdenxZ(AusgangspositionX) = 1 or 3 or 5 or 7) and (IdenxB(AusgangspositionY) = 1 or 3 or 5 or 7) then begin
....
Weil wenn beide Koordinaten ungerade bzw. gerade sind ist es schwarz und wenn ein Koordinat gerade und der Andere ungerade ist, ist es weiß....
Weiß jemand warum das nicht klappt? :D
Viele Grüße
Timo
Jann1k - Di 28.06.11 21:54
| Zitat: |
Weil wenn beide Koordinaten ungerade bzw. gerade sind ist es schwarz und wenn ein Koordinat gerade und der Andere ungerade ist, ist es weiß....
Weiß jemand warum das nicht klappt? :D |
Das klappt schon in der Theorie nicht, weil deine Annahmen falsch sind. Die Felder a1([1,1]) und a3([1,3]) sind beide schwarz. Eine richtige Bedingung wäre zB wenn (X+Y) mod 2 = 0 dann schwarz ansonsten weiß.
Im Übrigen ist dein Ansatz des "nur die Figur neuzeichnen die bewegt wird und die alte Position übermalen" etwas unschön. Es wäre gut (wie Boldar dir übrigens auch schon vorgeschlagen hat), wenn du dir eine Funktion schreibst, die dir das komplette Feld inklusive Figuren so wie es gerade abgespeichert ist zeichnet. So kannst du nämlich deine Spiellogik weitesgehend von der Darstellung des Spiels trennen und musst nicht einzelne Bereiche neuzeichnen. Nach einer Bewegung rufst du einfach die zeichenprozedur auf und schwupps hast du ein aktualisiertes Feld auf dem Bildschirm.
Timo93 - Di 28.06.11 22:02
jop :D vielen Dank dir Jannik :D das mit mod 2 = 0 oder <> 0 hat funktioniert.
Bei mir geht es jetzt nicht mehr um schön oder unschön... übermorgen ist bei uns Abgabetermin und das Programm läuft, wie es soll :D
dank allen, die mir hier geholfen haben. Ich bin grad soooo gut drauf :D
Hat aber i.wie viel Spaß gemacht....
Was meint ihr, würde mein "Können" in Delphi verbessern? Irgendwelche Übungen oder Programmvorschläge? :D
DAAAANNNNKEEEE euch :D !
Timo
beastofchaos - Mi 29.06.11 11:13
Da du das jetzt schon einmla gemacht hast, ist das sicher langweilig, aber sonst mach dir dieses Programm nochmal und versuch das so anzugehen. Du willts im OnClick folgendes stehen haben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| CurrentFigur: TPoint; FigurClicked: Boolean;
Procedure Image1.OnClick(Sender: TObject) var Maus: TPoint; begin Maus := Image1.ScreenToClient(Mouse.CursorPos); CurrentFigur := Maus; if FigurClicked begin Act(Maus, CurrentFigur); FigurClicked := False; end; else if IsAFigur(CurrentFigur) begin SetPositionPossibilities(CurrentFigur); FigurCicked := True; end; else ShowMessage("Fehler !!");
Image1.invalidate; end; |
Dann musst du dir überlegen, wie du "function getFigur(P: TPoint)", "procedure Act(M: TPoint, Fig: TPoint)", "function IsAFigur(Fig: TPoint): boolean", "SetPositionPossibilities(Fig: TPoint)" und das "Image1.OnPaint" aufbaust ;)
Wenn du dann zur Objektorientierung gehst, kannst du daraus machen: "CurrentFigur.act", "CurrentFigur.IsAFigur", "CurrentFigur.SetPositionPossibilities", "CurrentFigur.draw".
Aber das ist ein anderes Thema :P
Gruß, Thomas
Timo93 - Sa 02.07.11 15:44
Also....falls es euch interessiert :D
Mein Lehrer hat gemeint, es werden so zwischen 15 und 10 Punkten. :D
Ist ja schließlich mein erstes Jahr Info :D, da werden normalerweise noch nicht solche Projekte "versucht" oder auch beenden.
Wollte nur nochmal vielen lieben Dank sagen, weil ich finde, dass hier die Hilfe von Leuten in Foren teilweise viel zu wenig gewürdigt wird :D
Viele Grüße
Timo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!