Thema: Schachzug-Validity

In diesem Thread sollen alle Aspekte der Prüfung von Zügen besprochen werden. Wir können Züge einfach als Koordinatenpaar (und mit den Schachbrettinformationen) in der Form e2f3 speichern (das weiss sicher jeder); für den Computer stellen wir das als Zahlentupel-paar ((5;2);(6;3)) dar. <BR>Um nicht zuviel Rechenzeit zu beanspruchen sollten zunächst die trivialsten (und schnellsten) Gültigkeitsprüfungen durchgeführt werden.<P>1. Prüfung (immer!): ist die Figur am ersten Punkt - hier (5;2) - von der Farbe des Spielers, der den Zug ausführt?!<P>2. Prüfung (nicht Bauer): ist die Figur am Zielpunkt - hier (6;3) - nicht von einer Figur der ausführenden Farbe (da gibt es glaub ich eine Ausnahme, aber die hab ich vergessen)?<P>dann wird nach Figur am 1. Punkt je eine andere Testroutine ausgeführt...<P>(das Thema ist ja auch bis jetzt relativ trivial)<P>nicht zu vergessen, die Prüfung, ob der Weg frei ist!<p>[ 30.08.2001: Beitrag editiert von: whiteheard ]

mfG whitehouse

Re: Schachzug-Validity

die Koordinatenparameter nenne ich: ((x1;y1);(x2;y2))<P>die (finde ich) einfachste Abfrage ist die für das Pferd: <P>entweder abs(x1-x2)==2 && abs(y1-y2)==1<BR>oder abs(x1-x2)==1 && abs(y1-y2)==2<P>die Prüfung auf ein Hinderniss ist unnötig...<p>[ 06.10.2001: Beitrag editiert von: whiteheard ]

mfG whitehouse

Re: Schachzug-Validity

spielerfarbe: SCHWARZ/WEISS<P>feld(x;y) gibt (als Objekt/Struktur) die Informationen zum Feld<P>feld(x;y).farbe ist SCHWARZ oder WEISS<BR>feld(x;y).figur gibt (analog zu feld selbst) Informationen zur Figur auf (x;y)<P>figur.typ ist der Typ: Bauer, ...; 0<BR>figur.farbe ist die  Zugehörigkeit der Figur, SCHWARZ/WEISS

mfG whitehouse

Re: Schachzug-Validity

Feld:<P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><HR><pre><BR>| sy(WEISS)<BR>V 1 2 3 4 5 6 7 8 sx(WEISS)<BR>1  | | | | | | |             8<BR> --+-+-+-+-+-+-+-<BR>2  | | | | | | |             7<BR> --+-+-+-+-+-+-+-<BR>3  | | | | | | |             6<BR> --+-+-+-+-+-+-+-<BR>4  | | | | | | |             5<BR> --+-+-+-+-+-+-+-<BR>5  | | | | | | |             4<BR> --+-+-+-+-+-+-+-<BR>6  | | | | | | |             3<BR> --+-+-+-+-+-+-+-<BR>7  | | | | | | |             2<BR> --+-+-+-+-+-+-+-<BR>8  | | | | | | |             1<BR>  8 7 6 5 4 3 2 1 sx(SCHWARZ)^<BR>  1 2 3 4 5 6 7 8 9 x        sy(SCHWARZ);y<BR></pre><HR></BLOCKQUOTE><P>[ 31.08.2001: Beitrag editiert von: whiteheard ]<p>[ 01.09.2001: Beitrag editiert von: whiteheard ]

mfG whitehouse

Re: Schachzug-Validity

es darf jeder helfen

mfG whitehouse

6

Re: Schachzug-Validity

Oki .. wie wärs erstmal mit ner schönen Routine, die eine Matrix in JavaScript darstellt. Sowas in der Art wie:<P>Matrix = new Array(7);<BR>for (i=0; i<7;i++) {<BR>  Matrix[i] = new Array(7);<BR>    for (j=0;j<7;j++) {<BR>      Matrix[i][j] = i*j;<BR>    }<BR>}<P>Darin sollte das Spielfeld abgebildet sein und bei jedem Zug diese Matrix mit den Spielfiguren aktualisiert werden ... Wäre jetzt ne schöne Aufgabe ein Beispielskript zu erstellen, das eine Matrix mit entsprechenden Werten füllt und dann die Elemente versetzten kann ...

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

7

Re: Schachzug-Validity

Oki ... hier das Brett  [img]images/icons/smile.gif" border="0[/img]<P>Matrix = new Array(7)<BR>for (i=0; i <= 7; i++) {<BR>   Matrix[i] = new Array(7)<BR>   for (j=0; j <= 7; j++) {<BR>      Matrix[i][j] = "["+i+","+j+"]"<BR>   }<BR>} <P>str = "";<BR>for (i=0; i<=7;i++) {<BR>    for (j=0;j<=7;j++) {<BR>      str += "["+i+","+j+"]";<BR>    }<BR>      str += "n"<BR>}<BR>alert( str )

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

8

Re: Schachzug-Validity

Hm ... wo bleiben die Freaks?    [img]images/icons/grin.gif" border="0[/img] <P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><HR><pre><BR>schach = new Array(7);<BR>schach[0] = new Array('t1s','s1s','l1s','d1s','k2s','l2s','s2s','t2s');<BR>schach[1] = new Array('b1s','b2s','b3s','b4s','b5s','b6s','b7s','b8s');<BR>schach[2] = new Array('','','','','','','','');<BR>schach[3] = new Array('','','','','','','','');<BR>schach[4] = new Array('','','','','','','','');<BR>schach[5] = new Array('','','','','','','','');<BR>schach[6] = new Array('b1w','b2w','b3w','b4w','b5w','b6w','b7w','b8w');<BR>schach[7] = new Array('t1w','s1w','l1w','d1w','k2w','l2w','s2w','t2w');<P><BR>function zeicheSchachBrett() {<BR>  schachBrett = "";<BR>  for (i=0; i<=7;i++) {<BR>    for (j=0;j<=7;j++) {<BR>      schachBrett += "[ " +schach[i][j]+ " ] ";<BR>     }<BR>    schachBrett += "n";<BR>  }<BR>  return schachBrett;<BR>}  <P>alert( zeicheSchachBrett() );   <BR>schach[0][0] = 1000000;<BR>alert( zeicheSchachBrett() ); <BR></pre><HR></BLOCKQUOTE><p>[ 05.09.2001: Beitrag editiert von: J|G ]

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: Schachzug-Validity

nur, darum geht es nicht hauptsächlich *g*<P>ach ja: für den Bauer:<BR>immer sy2 - sy1 == 1<BR>if feld(x2;y2).figur.farbe != spielerfarbe then abs(x2-x1) == 1<BR>immer x2 == x1

mfG whitehouse

10

Re: Schachzug-Validity

Ich gestatte mir ein paar Anmerkungen:<P><BR>---feld(x;y).farbe ist SCHWARZ oder WEISS<P>kannst Du ermitteln mit feld(x+y)%2,<BR>ist entweder 0 oder eins, also schwarz oder weiss.<P>---ach ja: für den Bauer:<BR> immer sy2 - sy1 == 1<P>jeder Bauer kann als ersten Schritt einen Doppelschritt ausführen.<P>---immer x2 == x1<P>ein Bauer schlägt schräg.<P>Zu Bedenken ist auch die Bedingung für die jeweils einmalige Möglichkeit des en passant-Schlagens, und natürlich, für diesen Glücksfall, die Umwandlung.<P>gruß<P>matho

Re: Schachzug-Validity

hehe, das ist doch Erweiterungsfähig - hab's ja nur mal aus dem Arm geschüttelt.<BR>ach ja: was bitte ist en passant (kenn mich in Schach halt nur grundlegend aus) - natürlich übersetzt "nebenbei, unbemerkt" *g*<P>versuchs doch mal in ne Art Formel umzuwandeln - einfach ist das nicht

mfG whitehouse

Re: Schachzug-Validity

und: (x+y)%2 - meine Güte, das hab ich doch längst gesagt - weiss ich doch *g*

mfG whitehouse

13

Re: Schachzug-Validity

En passant Schlagen bedeutet:<BR>Angenommen, Du spielst weiss, und ein feindlicher Landmann hat sich bis auf's Feld<BR>g4 rangepirscht - Wenn Du nun z.B. Bh2-h4 spielst, kann im unmittelbar darauffolgenden Zug (und nur dann) Dein Gegner mit dem g4-Bauern auf h3 schlagen, obwohl Dein eigner bereits auf h4 steht. Das begründet sich damit, daß Du, indem Du den Doppelschritt gewählt hast, den Zwischenschritt h3 ausgelassen hast, und damit Deinem Gegner scheinbar diese Option des Schlagens genommen hast. Wie gesagt: das en passant Schlagen ist ausschließlich im nächstfolgenden Gegenzug gestattet.<P>gruß<P>matho

14

Re: Schachzug-Validity

Oki ... ich werde mal das Schachspiel evtl. in einzelne Lektionen aufteilen. Die Grundlage ist eine Matrix mit 8x8 Feldern. <P>Hier mal die 1te Lektion für die Prüfung des Bauers (zu mehr hab ich heut keine Lust mehr *g*):<P>Bauer<P><BR>Bewegung<P>Darf nur gerade nach vorne ziehen.<BR>Darf nicht zurück und nicht nach links oder rechts ziehen.<BR>Darf zum Start 1 oder 2 Felder ziehen.<BR>Darf sonst nur 1 Feld ziehen<P>Kampf<P>Darf nur 1 Feld, diagonal nach vorne schlagen.<P>Logik<P>1.    x-Position prüfen: <P>ungültig für beide Farben, wenn:<P>alte xPos nicht gleich neue xPos<P><BR>2.    Bewegung prüfen:<P>a) weißer Bauer<P>ungültig wenn: <BR>alte yPos-1 nicht gleich neue yPos <BR>   und <BR>(<BR>alte yPos-2 nicht gleich neue yPos <BR>oder<BR>alte yPos nicht gleich 6<BR>)<P><BR>b) schwarzer Bauer<P>ungültig wenn:<BR>alte yPos+1 nicht gleich neue yPos<BR>   und<BR>(<BR>alte yPos+2 nicht gleich neue yPos<BR>oder<BR>alte yPos nicht gleich 1<BR>)<P>3.    Kollision prüfen (Weg frei?)<P>neue yPos darf nicht besetzt sein<P><BR>4.    Kämpfen<P><BR>--- Logik folgt noch (bin müde *g*) ---<P><BR>Nun, ja ... mit dieser theoretischen Abhandlung dürfte es eigentlich ein Leichtes sein, die Bedingungen in der gew. Sprache zu formulieren    [img]images/icons/smile.gif" border="0[/img]<P>Ach ja, mein Schach läuft schon mal ganz gut .. hab ein Drag&Drop Schach mit DHTML programmiert ... zeigs aber erst her, wenn Ihr Euer Hirnschmalz etwas brodeln läßt *g*. Bin ja mal schon auf die Ideen und Umsetzungen anderer Sichtweisen gespannt ...  oh mannnn Theoria kann ja auch ganz spannend sein     [img]images/icons/grin.gif" border="0[/img] <P>Hannes<p>[ 05.09.2001: Beitrag editiert von: J|G ]

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: Schachzug-Validity

bitte - bitte - les dir doch mal bisherige Beiträge GENAU durch, bevor du postest<BR>so einiges wurde schon gesagt - und das mit der 8x8 Matrix ist logisch

mfG whitehouse

Re: Schachzug-Validity

nicht vergessen: prüfen, ob weg frei ist (möchte das zunächst nicht unbedingt einbeziehen)<P>nun der Grundansatz der TURMlogik:<P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><HR><pre><BR>((x1 == x2) && (y1 != y2)) || ((x1 != x2) && (y1 == y2))<BR></pre><HR></BLOCKQUOTE>

mfG whitehouse

Re: Schachzug-Validity

is das hier alles noch javascript???

---------------------------------
bLuEtooTh
bluetooth22@web.de
ICQ: 129663697

18

Re: Schachzug-Validity

Das hier ist grad Sprachunabhänig und liefert die Programmierlogik  [img]images/icons/wink.gif" border="0[/img] Die Umsetzung kann mit einer bliebigen Sprache erfolgen ...

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: Schachzug-Validity

ausserdem. hier ist NICHT fas JavaScript Forum !<BR>demenstprechend sind derartige Kommentare unangebracht

mfG whitehouse

Re: Schachzug-Validity

so, der Läufer (damit hab ich scheins J|G ganz irre gemacht *g*):<P>abs(x2 - x1) == abs(y2 - y1)<P>gute formel *g*

mfG whitehouse

Re: Schachzug-Validity

und noch ein Streich:<P>König:<P>(abs(x2-x1) <= 1) && (abs(y2-y1) <= 1)

mfG whitehouse

22

Re: Schachzug-Validity

Ne hast mich nicht ... wir hatten nur über den turm gesprochen .. und auf einmal gehts beim Läufer weiter *g*.<P>Läufer<P>ym=toy-fromy; xm=tox-fromx;<BR>aym=Math.abs(ym); axm=Math.abs(xm);<BR>if(aym!=axm) return false;

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: Schachzug-Validity

ho doch: das ist nämlich exakt das gleiche (Läufer), nur andersrum *g*<P>statt Math.abs() sag ich kürzer abs()

mfG whitehouse

Re: Schachzug-Validity

Ich habe mal ein Schach programmiert, wo 2 Leute in Ermangelung eines Brettes vor'm gleichen PC sitzen und "normal" gegeneinander spielen.<P>Dieses Schach ist zwar etwas langsam, aber leicht verständlich. Man klickt die Figur, die man bewegen will, an und es werden alle möglichen Zielfelder angezeigt. Das gewünschte Zielfeld wird dann angeklickt und - voila - die Figur wird bewegt.<P>Es gibt keine Prüfung auf "Schach Matt" und "Remis" und bei einer Rochade wird noch nicht geprüft, ob der König bedroht wird oder sich über ein bedrohtes Feld bewegt. Dies verbietet eigentlich eine Rochade. Genausowenig wird die Regel "Die zuerst berührte Figur muß, wenn es möglich ist, gezugen werden." umgesetzt.<P><A HREF="http://www24.brinkster.com/schach/" TARGET=_blank>Schaut das Euch am besten mal selbst an!</A>

Re: Schachzug-Validity

hey, als IE 6 User will ich das haben - DOM wär am besten<BR>(indexof('MSIE 5.')!!!)<P>dann gib doch mal n paar Beiträge

mfG whitehouse