| Autor |
Beitrag |
Timo93
      
Beiträge: 23
|
Verfasst: Fr 24.06.11 18:31
Hallo
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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: 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
      
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: 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!
Zudem wärs glaube ich besser, wenn er ne PaintBox nehmen würde.
Viele Grüße,
Stundenplan.
|
|
Timo93 
      
Beiträge: 23
|
Verfasst: Sa 25.06.11 11:42
Hallo
@ 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
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 www.delphi-forum.de/...ht=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
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Timo93 
      
Beiträge: 23
|
Verfasst: 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?  Entschuldigt....komm mir grad bisschen doof vor^^
und sind ja auch noch Ferien
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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: Sa 25.06.11 19:49
Ja  Das hatte ich ja gemeint... aber wie mach ich das denn mit dem automatisch berechnen... nicht wie, eher wo
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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 Das hatte ich ja gemeint... aber wie mach ich das denn mit dem automatisch berechnen... nicht wie, eher wo |
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 
      
Beiträge: 23
|
Verfasst: Sa 25.06.11 20:55
Dann werde ich das wohl doch lieber mit der OnMouseDown/Up funktion versuchen. So...nun wie mach weiter?
Wie kann ich denn die Felder auswählen?  Ist doch schließlich nur ne Matrix....kann ich doch nirgends draufklicken.
Timo
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 25.06.11 21:08
Wie stellst du denn dein Spielfeld jetzt für den User eigentlich dar?
|
|
Timo93 
      
Beiträge: 23
|
Verfasst: Sa 25.06.11 21:33
Ich hab mit Canvas so n Spielfeld gezeichnet.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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). |
|
|
|