none
Schachclient - Zugüberprüfung für Springer / C# /WinForms RRS feed

  • Frage

  • Hallo Leute,

    folgender Code der die Gültigkeit für Springerzüge im Schach überprüfen soll, scheint stimmig zu sein. Mich würde interessieren, ob er tatsächlich stimmig ist? Kann er eventuell noch optimiert werden - können mitunter Bedingungen eingespart werden? Mit welchen Testframeworks könnte man überprüfen, ob die Resultate der Methode für alle möglichen Züge stimmig sind?

     xAlt = Anhebposition(horizonal,also A-H) ; xNeu=Ablegposition ; yAlt = Anhebposition(vertikal,also 1-8) ; xNeu=Ablegposition

    public bool IsMoveLegal(Piece piece, int xAlt, int xNeu, int yAlt, int yNeu, bool bauerHasMoved) { //befindet sich die Figur auf dem Brett? if (yNeu > 7 || xNeu > 7 || xNeu < 0 || yNeu < 0) return false; // ist das Feld bereits belegt? if (!FigureCanBeDeleted(piece, xAlt, xNeu, yAlt, yNeu)) { if (this.GetPiece(xNeu, yNeu) != null) return false; } . . //durch den Absolutbetrag gelten für Weiß und Schwarz dieselben Konditionen } else if (piece.Type == PieceType.Springer) { if (xAlt == xNeu || //der Springer hat sich horizontal nicht bewegt yAlt == yNeu || //der Springer hat sich vertikal nicht bewegt Math.Abs(xAlt - xNeu) > 2 || //Der Spinger hat sich horizontal mehr als 2 Einheiten bewegt Math.Abs(yAlt - yNeu) > 2 || //Der Spinger hat sich vertikal mehr als 2 Einheiten bewegt (Math.Abs(xAlt - xNeu) == 2 && Math.Abs(yAlt - yNeu) == 2) || //Der Springer hat sich sowohl horizontal als auch vertikal genau 2 Einheiten bewegt (Math.Abs(xAlt - xNeu) == 1 && Math.Abs(yAlt - yNeu) == 1)) //Der Springer hat sich sowohl horizontal als auch vertikal genau 1 Einheit bewegt return false;

    }

    . .

    return true;








    • Bearbeitet tklustig Samstag, 6. Juli 2019 13:18
    Samstag, 6. Juli 2019 13:09

Antworten

  • Zusammenfassen lässst sich das ganze doch mit

    Math.Abs(xAlt - xNeu) + Math.Abs(yAlt - yNeu) == 3
    Math.Abs(Math.Abs(xAlt - xNeu) - Math.Abs(yAlt - yNeu)) == 1

    Also die Summe der beiden ist immer 3 und die Differenz immer 1 (genau genommen, eines ist 2, das andere ist 1)

    Wenn eine der beiden Ausagen also nicht stimmt -> return false;
    Montag, 8. Juli 2019 08:04