C
vfbf4n1893 schrieb:
Doch leider bekomme ich auf keine gescheite Formel, wie ich auf die diaagonalen Felder komme, wo die Dame erreichen kann. Wie bekomme ich das hin??? Habt ihr das Tipps für eine gescheite Formel?
Man kann die Diagonalen des Schachbretts als Geraden mit der Steigung 1 und -1 betrachten. Durch das Damen-Feld können zwei solche Geraden verlaufen, deren allgemeine Geradengleichung so aussieht:
y = m*x + b
Mach doch erstmal deinen Code soweit klar mit einer Ausgabe etc. Z.B. so:
#include <stdio.h>
// Anzahl der Felder einer Spalte/Zeile.
// Je nach Geschmack auch mit enum machbar.
#define S 8
#define Z 8
// dito
#define LE 218 // linke Ecke oben
#define RE 191 // rechte Ecke oben
#define LU 192 // linke Ecke unten
#define RU 217 // rechte Ecke unten
// Das Feld ließe sich auch als char feld [feldgroesse_x] schreiben und mit einem puts auf einmal ausgeben.
void anzeige_feld ( char feld [ Z ] [ S ] )
{
int s, z;
puts (" a b c d e f g h");
printf ( " %c-----------------%c\n", LE, RE );
for ( z = Z-1; z >= 0; z-- ) {
printf ( "%d | ", z + 1 );
for ( s = 0; s < S; s++ ) {
printf ( "%c ", feld [ z ] [ s ] );
}
printf ( "| %d", z + 1 );
puts ("");
}
printf ( " %c-----------------%c\n", LU, RU );
puts (" a b c d e f g h\n");
}
void markiere_spielbereich_dame ( char feld [ Z ] [ S ], int z_dame, int s_dame )
{
int s, z;
// Senkrechter und waagerechter Spielbereich.
for ( z = 0; z < Z; z++ ) {
for ( s = 0; s < S; s++ ) {
if ( s == s_dame && z == z_dame )
continue; // Überschreiben der Dame vermeiden.
if (( s == s_dame || z == z_dame )) // && ( s != s_dame || z != z_dame ) == !( s == s_dame && z == z_dame )
feld [ z ] [ s ] = 'X';
}
}
// Die Diagonalen des Spielfeldes sind Geraden mit der Steigung m = 1 und m = -1.
// Koordinatenursprung ist hier die linke untere Ecke.
// Allgemeine Geradengleichung: y = m*x + b. Setze z := y und s := x ergibt: z = m*s + b
// Umstellen nach b: b = z - m*s.
// m ist positiv und negativ -> zwei b Werte -> zwei Geradengleichungen
// b1 = z - s mit m = 1
// b2 = z + s mit m = -1
// Die Koordinaten der Dame erfüllen die Gleichung:
// z_dame = 1 * s_dame + b1
// Umstellen nach b1: b1 = z_dame - s_dame
// Also b1 = z - s = z_dame - s_dame (1)
// Die Koordinaten der Dame erfüllen auch die Gleichung:
// z_dame = -1 * s_dame + b2 -> b2 = z_dame + s_dame
// also b2 = z + s = z_dame + s_dame (2)
// Zusammengefasst gilt:
// z - s = z_dame - s_dame (1)
// z + s = z_dame + s_dame (2)
// Jetzt brauchst du nur noch alle Felder zu durchlaufen und prüfen, ob Gleichungen (1) und (2)
// erfüllt sind und entsprechend die 'X' setzen.
}
int main ( void )
{
char feld [ Z ] [ S ] = { 0 };
char dame = 'D';
// Das Einlesen der Position der Dame und die Umrechnung und die Prüfung der Koordinaten hab ich mir gespart.
int s = 4; // Spalte e als Arraykoordinate
int z = 5; // Zeile 6 als Arraykoordinate
feld [ z ] [ s ] = dame; // Die Dame wird aufs Feld gesetzt.
markiere_spielbereich_dame ( feld, z, s );
anzeige_feld ( feld ); // selbstredend...
return 0;
}