Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Schach -- Läufer

Diskussion: Schach -- Läufer im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Hi, ich hab wieder eine Aufgabe: Das Programm bekommt ein X/Y Koardinatenpaar (zufällig oder vom User). Dabei gilt: Code: ...

Antwort
Alt 26.10.06, 14:33   #1 (permalink)
 
Registriert seit: 23.05.05
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Likes: 0
Standard Schach -- Läufer

Anzeige

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
Xalon ist offline   Mit Zitat antworten
Alt 26.10.06, 14:51   #2 (permalink)
Senior Member
 
Registriert seit: 26.03.06
Serow Leistung: 8086
Likes: 16
Standard

stehen da noch andere Figuren auf dem Schachbrett?
Serow ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 26.10.06, 15:45   #3 (permalink)
Senior Member
 
Registriert seit: 01.01.04
Prometheus Leistung: Facit NTK
Prometheus eine Nachricht über ICQ schicken
Likes: 0
Standard

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.
Prometheus ist offline   Mit Zitat antworten
Alt 26.10.06, 16:36   #4 (permalink)
Themenstarter
 
Registriert seit: 23.05.05
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Likes: 0
Standard

@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
Xalon ist offline   Mit Zitat antworten
Alt 26.10.06, 23:33   #5 (permalink)
 
Registriert seit: 25.10.06
Pendran Leistung: Facit NTK
Likes: 0
Standard

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^^

Schach -- Läuferl   
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 =)
Pendran ist offline   Mit Zitat antworten
Alt 27.10.06, 10:41   #6 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

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...
lagalopex ist offline   Mit Zitat antworten
Alt 27.10.06, 11:31   #7 (permalink)
 
Registriert seit: 25.10.06
Pendran Leistung: Facit NTK
Likes: 0
Standard

Hi,
erstmal danke ich dir für den "Tipp" mit den Code-Tags^^ Jetzt sind auch meine Einrückungen automatisch übernommen worden

Zum Programm:

Zitat:
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.

Zitat:
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.

Zitat:
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
Pendran ist offline   Mit Zitat antworten
Alt 27.10.06, 12:26   #8 (permalink)
 
Registriert seit: 08.12.04
freak4fun Leistung: Facit NTK
Likes: 0
Standard

Verbesserungsvorschläge   
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
freak4fun ist offline   Mit Zitat antworten
Alt 27.10.06, 15:09   #9 (permalink)
Senior Member
 
Registriert seit: 01.01.04
Prometheus Leistung: Facit NTK
Prometheus eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
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
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.
Prometheus ist offline   Mit Zitat antworten
Alt 27.10.06, 17:35   #10 (permalink)
 
Registriert seit: 25.10.06
Pendran Leistung: Facit NTK
Likes: 0
Standard

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

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

Schach -- Läufer mit Funktionen:   
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
Pendran ist offline   Mit Zitat antworten
Alt 01.11.06, 15:48   #11 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

Dann hier auch mal meine Lösung...
C++   
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;
}
lagalopex ist offline   Mit Zitat antworten
Alt 26.01.07, 20:52   #12 (permalink)
 
Registriert seit: 12.01.07
Ivan Dolvich Leistung: Facit NTK
Likes: 0
Standard RE: Schach -- Läufer

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
Ivan Dolvich ist offline   Mit Zitat antworten
Alt 07.03.07, 16:49   #13 (permalink)
 
Benutzerbild von Extinction
 
Registriert seit: 02.01.07
Extinction Leistung: Facit NTK
Likes: 0
Standard

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. -.-°
Extinction ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Schach -- Läufer
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Schach Spielverlauf visualisieren ivegotmail Programmieraufgaben 0 17.06.07 14:10
Wer hat lust mit mir Schach zu spielen? frostimicha Umfragen 2 10.05.04 23:37
Endliche Anzahl an möglichen Schach-Partien? Indi Off topic-Zone 40 05.05.02 16:02


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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61