Schach -- Läufer

Hi,
ich hab wieder eine Aufgabe:

Das Programm bekommt ein X/Y Koardinatenpaar (zufällig oder vom User).
Dabei gilt:
Code:
X/Y < 9;
X/Y > 0;
Also von 1 bis 8.

Jetzt muss das Programm alle Felder berechnen auf die man kommen könnte wenn auf X/Y
ein Läufer steht.(Läufer dürfen nur diagonal bewegt werden)

Happy Coding
 
Wieso orientierst du dich bei deiner Arbeit nicht an die eigentlichen Schachkoordinaten.
So hast du es viel einfach die Züge zu berechnen.
Nehmen wir als Beispiel, folgender Koordinatenaufbau eine Schachbrettes:

A8 / B8 / C8 / D8 / E8 / F8 / G8 / H8
A7 / B7 / C7 / D7 / E7 / F7 / G7 / H7
A6 / B6 / C6 / D6 / E6 / F6 / G6 / H6
A5 / B5 / C5 / D5 / E5 / F5 / G5 / H5
A4 / B4 / C4 / D4 / E4 / F4 / G4 / H4
A3 / B3 / C3 / D3 / E3 / F3 / G3 / H3
A2 / B2 / C2 / D2 / E2 / F2 / G2 / H2
A1 / B1 / C1 / D1 / E1 / F1 / G1 / H1

Weiß steht auf den Linien 1 und 2 - Läufer auf C1 und F1.
Nehmen wir den Läufer auf C1 und der Bauer auf D2 macht ihm Platz. Egal wie er nun zu H6 vorrückt, es ändern sich die Buchstaben in alphabetischer Reihenfolge C/D/E/F/G/H
und die Zahlen 1/2/3/4/5/6.
Die Zahlen oder Buchstaben werden also gleichermaßen erhöht, oder heruntergesetzt.
Außer bei folgenden Beispiel:
Schwarzer Läufer auf C8 möchte bei freier Bahn auf H3 ziehen. Die Zahlen werden heruntergesetzt 8/7/6 ..., aber die Buchstaben alphabetisch hochgezählt. Im Prinzip in zwei gegengesetzte Richtungen.

Mit dieser Ansicht kannst du Programmiertechnisch auch viel anfangen, denn du würdest damit sicher gut hinkommen, wenn du die Zähler in der Programmierung nutzt.

Ich weiß zwar nicht, was für eine Programmiersprache du nutzt, aber bei C++ könnte ein Teil so aussehen:

Hier zählst du z.B. den weißen Läufer von C1, dessen Zug auf H6, mittels Zähler zur auf 6. Z ist in dem Fall der Zähler und h das Ziel, also die 6.
Code:
for(z=1; z<h; z++);
Natürlich brauchst du noch mehr Programmcode, um den Zug zu definieren, aber wenn du dich der Herausforderung gestellt hast, bringst du bestimmt das nötige Wissen mit. Und dein Thread sieht mir auch eher aus, als suchtest du anstatt einer Programmierlösung nach einer logischen Falllösung.
 
@Serow : Nein.
@Prometheus : Du siehst schon das das im Forum Programmieraufgaben steht,oder?
Ich bin durchaus in der Lage das zu lösen,aber darum gehts halt nicht ;-)

Xalon
 
Hi, ich habe zwar erst vor kurzem mit C++ angefangen, habe jedoch eine Lösung für die Aufgabe schreiben können. Da ich mich noch nicht so gut auskenne, ist es gut möglich, dass der Quellcode ein bisschen länger ist als nötig^^

Code:
#include <iostream>

int lx;            // Die Koordinaten des Läufers werden deklariert
int ly;
int i;

using namespace std;

int main()
{
    cout << "Wie lautet die x-Koordinate des Laeufers (1-8)?";      // Der User gibt die Koordinaten an
    cin >> lx;                                                     
    
    while (1 == 1)                                                  // Hier wird die Eingabe des Users überprüft
    {                                                               // und solange wiederholt bis sie korrekt ist
          
    if (lx > 8)
    {
          cout << "Ungueltige Eingabe, die Zahl ist zu hoch" << endl;
          cout << "Wie lautet die x-Koordinate des Laeufers (1-8)?";
          cin >> lx;
          continue;
    }
    else if (lx < 1)
    {
         cout << "Ungueltige Eingabe, die Zahl ist zu niedrig" << endl;
         cout << "Wie lautet die x-Koordinate des Laeufers (1-8)?";
         cin >> lx;
         continue;
    }
    else
    {
         break;    
    }
    }
    
       
    cout << "Wie lautet die y-Koordinate des Laeufers (1-8)?";
    cin >> ly; 
   
    while (1 == 1)
    {
          
    if (ly > 8)
    {
          cout << "Ungueltige Eingabe, die Zahl ist zu hoch" << endl;
          cout << "Wie lautet die y-Koordinate des Laeufers (1-8)?";
          cin >> ly;
          continue;
    }
    else if (ly < 1)
    {
         cout << "Ungueltige Eingabe, die Zahl ist zu niedrig" << endl;
         cout << "Wie lautet die y-Koordinate des Laeufers (1-8)?";
         cin >> ly;
         continue;
    }
    else
    {
    break;
    }
    }

cout << " " << endl;                                                       // Hier werden die Felder
cout << "Felder die nach rechts-unten gegangen werden koennen:" << endl;    // berechnet und ausgegeben
    
int ay = ly;    
for (int ax = lx + 1; ax < 9; ax++)
{
      ay = ay + 1;
      if (ay < 9)
      {
          cout << ax << "/" << ay << endl;
      }
      else
      {
          ax = 9;
      }
             
}

cout << " " << endl;
cout << "Felder die nach rechts-oben gegangen werden koennen:" << endl;

int by = ly;
for (int bx = lx + 1; bx < 9; bx++)
{
      by = by - 1;
      if (by > 0)
      {
          cout << bx << "/" << by << endl;
      }
      else
      {
          bx = 9;
      }
}

cout << " " << endl;
cout << "Felder die nach links-unten gegangen werden koennen:" << endl;

int cx = lx;
for (int cy = ly + 1; cy < 9; cy++)
{
      cx = cx - 1;
      if (cx > 0)
      {
          cout << cx << "/" << cy << endl;
      }
      else
      {
          cy = 9;
      }
}

cout << " " << endl;    
cout << "Felder die nach links-oben gegangen werden koennen:" << endl;
    
int dy = ly;    
for (int dx = lx - 1; dx > 0; dx--)
{
      dy = dy - 1;
      if (dy > 0)
      {
          cout << dx << "/" << dy << endl;
      }
      else
      {
          dx = 0;
      }
}
cin.get();
cin.get();

}

Ich bin für konstruktive Kritik immer offen und kann sie mit sicherheit gebrauchen =)
 
Wie wäres mit code-tags (und falls es noch nicht eingerückt, das nachholen, es ist sehr schwer den Code so zu lesen, bei derart vielen Klammern...) :)
Ansonsten sieht deine Eingabeprüfung etwas komisch aus... wann wird check gesetzt? Worauf? (Was passiert, wenn du einen falschen y-wert eingibst und danach richtige?)

Da die Aufgabenstellung es nicht explizit gesagt hat, muss man nicht nach rechts-oben etc unterscheiden. Daher ist dein Code schon ziemlich lang...
 
Hi,
erstmal danke ich dir für den "Tipp" mit den Code-Tags^^ Jetzt sind auch meine Einrückungen automatisch übernommen worden :D

Zum Programm:

Ansonsten sieht deine Eingabeprüfung etwas komisch aus... wann wird check gesetzt? Worauf?

Ich weiß um ehrlich zu sein garnicht mehr, warum ich mir die Mühe mit der check Variable gemacht habe. Ursprünglich war sie dazu gedacht, die Schleife im richtigen Moment zu beenden. Ich hab mir die Variabe dann doch ersparrt, indem ich einfach ne Unendlich-Schleife eingesetzt habe, die im richtigen Moment mit "break" beendet wird.:)

Ansonsten sieht deine Eingabeprüfung etwas komisch aus... wann wird check gesetzt? Worauf? (Was passiert, wenn du einen falschen y-wert eingibst und danach richtige?)

Ich hab mir das Programm nochmal angeguckt und gesehen, was du gemeint hast. Ich hab den Fehler jetzt behoben und noch ne zweite Schleife hinzugefügt.

Da die Aufgabenstellung es nicht explizit gesagt hat, muss man nicht nach rechts-oben etc unterscheiden. Daher ist dein Code schon ziemlich lang...

Das hab ich um ehrlich zu sein nicht gemacht, damit es am Ende im Programm schöner aussieht, sondern weil mir nicht eingefallen ist wie man es ansonsten machen könnte. Ich hab leider noch kaum Erfahrung mit Cpp, möglicherweise liegt es daran. Naja, ich hoffe das wird in Zukunft besser :)

MfG Pendran
 
Code:
while (lx <= 8) and (lx >= 1)
Code:
by = by + 1; --> by++;

Du könntest deine Prüfungen/Berechnungen in Funktionen auslagern, da sie das gleiche machen. Als Wert übergibst du dann den Wert, der geprüft wird, bzw. bei der EIngabeprüfung (1-8) kannst du dann noch den x bzw. y Wert für die Ausgabe übergeben.

Das würde die Sache sehr verkürzen. :)

MfG
freak
 
Original von Xalon
@Serow : Nein.
@Prometheus : Du siehst schon das das im Forum Programmieraufgaben steht,oder?
Ich bin durchaus in der Lage das zu lösen,aber darum gehts halt nicht ;-)

Xalon

:D Oh, Sorry. Jetzt verstehe ich es. Das ist ein Thread um den Programmieranfängern eine kleine Aufgabe zu geben, diese sie mittels Programmcode, den sie dann hier posten, lösen können.
Ich dachte nur das du gerade ein Schachprogramm bastelst und nicht weißt wie du den Läufer einbringen kannst. Da habe ich mich wohl geirrt.

Zwar bin ich mir auch bewusst, wie ich den Programmcode hierfür basteln würde, denoch finde ich mal so eine kleine Aufgabe sehr schöhn.
Diese Aufgabe hat mich auch wieder zum nachdenken gebracht und daher war dein Thread schonmal nicht schlecht, auch wenn ich ihn nicht richtig verstanden habe - Die Frage bzw. Aufgabe habe ich schon verstanden.
Aber ich lasse jetzt lieber den Aufgabenlöser oder den Anfängern den Vortritt. :D
 
So, ich hab das Programm nochmal überarbeitet mithilfe der Tipps von freak4fun. (also ich glaube zumindestens das er das so meinte:)

-ich habe eine Funktion für das Überprüfen der Eingabe geschrieben
-ich habe eine Funktion für das Berechnen der Felder geschrieben
-ich hab die "by = by + 1" durch "by++" ersetzt :D

Dadurch hab ich das Programm immerhin von 135 auf 98 Zeilen verkleinert:

Code:
#include <iostream>

int lx;                                                                         // Die Koordinaten des Läufers werden deklariert
int ly;
int i;

using namespace std;

void rechnung(int x, int y, int z)
{ 
     while ((x <= 8) and (y >= 1) and (y <= 8) and (x >= 1))
     {     
            switch (z)
            {
            case 1:
                 y++;
                 x++;
                 break;
            case 2:
                 y--;
                 x++;
                 break;
            case 3:
                 y++;
                 x--;
                 break;
            case 4:
                 y--;
                 x--;
                 break;
      }
      
      if (((x <= 8) and (x >= 1)) and ((y <= 8) and (y >= 1))) cout << x << "/" << y << endl;
}             
} 

int check(int o, int p)
{
    while ((o > 8) or (o < 1))
    {
          switch (p)
          {
                 case 1:
                      cout << "Ungueltige Eingabe" << endl;
                      cout << "Wie lautet die x-Koordinate des Laeufers (1-8)?";
                      cin >> o;
                      break;
                 case 2:
                      cout << "Ungueltige Eingabe" << endl;
                      cout << "Wie lautet die y-Koordinate des Laeufers (1-8)?";
                      cin >> o;
                      break;
          }
    }
return o;
}

int main()
{
    cout << "Wie lautet die x-Koordinate des Laeufers (1-8)?";                   // Der User gibt die Koordinaten an
    cin >> lx;                                                     
    lx = check(lx, 1);
       
    cout << "Wie lautet die y-Koordinate des Laeufers (1-8)?";
    cin >> ly; 
    ly = check(ly, 2);

cout << " " << endl;                                                        // Hier werden die Felder
cout << "Felder die nach rechts-unten gegangen werden koennen:" << endl;    // berechnet und ausgegeben
    
int ay = ly;  
int ax = lx;
rechnung(ax, ay, 1);

cout << " " << endl;
cout << "Felder die nach rechts-oben gegangen werden koennen:" << endl;

int by = ly;
int bx = lx;
rechnung(bx, by, 2);

cout << " " << endl;
cout << "Felder die nach links-unten gegangen werden koennen:" << endl;

int cx = lx;
int cy = ly;
rechnung(cx, cy, 3);

cout << " " << endl;    
cout << "Felder die nach links-oben gegangen werden koennen:" << endl;
    
int dy = ly;    
int dx = lx;
rechnung(dx, dy, 4);

cin.get();
cin.get();
}

MfG Pendran
 
Dann hier auch mal meine Lösung...
Code:
#include <iostream>

using namespace std;

int main()
{
	int x, y;

	cout << "Position des Laeufers (1-8):" << endl;
	do {
		cout << "X = " << flush;
		cin >> x;
	} while (x < 1 || x > 8);
	do {
		cout << "Y = " << flush;
		cin >> y;
	} while (y < 1 || y > 8);

	cout << "\nX / Y\n-----" << endl;

	for (int i = 1; i < 8; ++i)
		for (int k = 0; k < 4; ++k) {
			int xt = x + ((k % 4 < 2)? 1 : -1) * i;
			int yt = y + (((k + 1) % 4 < 2)? 1 : -1) * i;
			if (xt > 0 && xt < 9 && yt > 0 && yt < 9)
				cout << xt << " / " << yt << endl;
		}

	return 0;
}
 
Hi, hier meine Lösung in Groovy. Checkt alle 4 Diagonal-Richtungen hintereinander.

Code:
def printMoves(x, y) 
{
    printDiagonal(x, y,  1, 9,  1, 9)   // NE
    printDiagonal(x, y, -1, 0,  1, 9)   // NW
    printDiagonal(x, y, -1, 0, -1, 0)   // SW
    printDiagonal(x, y,  1, 9, -1, 0)   // SE
}

def printDiagonal(x, y, incX, stopX, incY, stopY) 
{
    while (((x += incX) != stopX) && ((y += incY) != stopY))
        print "($x|$y) "
}

printMoves(3, 7)  // (4|8) (2|8) (2|6) (1|5) (4|6) (5|5) (6|4) (7|3) (8|2)

Bin mir sicher es kürzer geht, vielleicht mit einer Funktionalen Sprache?
Habe vorher versucht mit dem Modulo-Operator die Grenzen zu überspringen und nur zwei statt vier durchläufe zu machen, hat aber nicht geklappt weil die Koordinaten als 1..8 und nicht als 0..7 gegeben waren.

Viele Grüße,
Ivan Dolvich
 
Hmm... also wenn das jemanden interessiert, der auch Dark Basic benutzt:
Ich hab mal ein ganzes Schachspiel in DBPro geproggt. Mit Rochade, En Passant, Nicht überspringen von figuren, korrekt abschmeißen etc...
Wenn jemand Interesse daran hat, soll er sich melden, aber das Thema is ja schon n Monat alt. -.-°
 
Zurück
Oben