Welche Bedeutung hat die Initialisierung von Richtungs-Arrays unten mit gegebenen Werten bei der Entwicklung eines Schachprogramms?
Lesezeit: 5 Minuten
ejjrex
Ich bin neu in der kompetitiven Programmierung, und mir ist häufig aufgefallen, dass viele der großen Programmierer diese vier Zeilen in ihrem Code haben (insbesondere in denen, die Arrays beinhalten):
Was bedeutet das wirklich und wofür wird Technik verwendet?
benutze ich oft d={0,1,0,-1,0} dafür: Artikelpaare für d[i], d[i+1] Gib mir vier Himmelsrichtungen.
– Sergej Kalinitschenko
3. Mai 2013 um 0:50 Uhr
Das ist eine überraschend gute Frage. … Lässt sich am Titel etwas machen?
– Luser Drog
3. Mai 2013 um 0:55 Uhr
Sie haben also nicht daran gedacht zu erwähnen, dass dieser Code von einer Schach-Engine stammt? Daran hast du auch nicht gedacht sehen selbst, wie diese Werte verwendet wurden?
– Trojaner
3. Mai 2013 um 6:17 Uhr
„Viele der großen Programmierer haben diese vier Zeilen […]” – Ich bin hier pingelig, aber wenn sie großartige Programmierer wären, würde ihr Code Sie nicht dazu bringen, sich zu fragen: “Was ist das für ein Konstrukt?!”
– utnapistim
3. Mai 2013 um 11:02 Uhr
@utnapistim Wenn Sie den größten Teil des Codes schreiben, haben Sie Recht, aber hier verfehlen Sie den Punkt. Dieser Fall ist eine legitime Ausnahme von dieser Regel. Wenn Sie Code für einen Wettbewerb und unter Zeitdruck schreiben, ist Quick-and-Dirty fast immer besser als Clean-and-Wartbar. In diesem Fall jetzt für Sie lesbar Ja wirklich ist alles was zählt. Ein großartiger Programmierer schreibt sehr gut ein nicht wartbares, unlesbares Durcheinander in diesem Zusammenhangauch wenn der Großteil ihres regulären Codes gut lesbar und wartbar ist.
– Ben Lee
7. Mai 2013 um 21:12 Uhr
Patashu
Dies ist eine Technik, um alle Richtungen als Arrays zu codieren – jedes Paar von di[i],dj[i] ist eine andere Richtung.
Wenn wir uns vorstellen, dass wir ein Stück an einem Ort x,y haben und wir seinen x- und seinen y-Wert addieren möchten, um es an einen nahe gelegenen Ort zu verschieben, ist 1,0 Osten, -1,0 Westen, 0,1 ist Süden, 0,-1 ist Norden und so weiter.
(Hier habe ich gesagt, dass oben links 0,0 und unten rechts 4,4 ist, und gezeigt, welche Bewegung jeder Index der Arrays vom Mittelpunkt X bei 2,2 machen wird.)
.....
.536.
.1X0.
.724.
.....
Die Art und Weise, wie es eingerichtet ist, wenn Sie dies tun ^1 (^ bitweises XOR) auf dem Index erhalten Sie die entgegengesetzte Richtung – 0 und 1 sind Gegensätze, 2 und 3 sind Gegensätze und so weiter. (Eine andere Möglichkeit, es einzurichten, besteht darin, von Norden aus im Uhrzeigersinn zu gehen – dann ^4 bringt Sie in die entgegengesetzte Richtung.)
Jetzt können Sie alle Richtungen von einem bestimmten Punkt aus testen, indem Sie eine Schleife über Ihre ziehen di und dj Arrays, anstatt jede Richtung in eine eigene Zeile schreiben zu müssen (für insgesamt acht!) (Vergessen Sie nur nicht, die Grenzen zu überprüfen 🙂 )
diK und djK alle bilden Ritter Richtungen anstelle aller angrenzenden Richtungen. Hier, ^1 dreht sich entlang einer Achse, ^4 gibt dem gegenüberliegenden Springer einen Sprung.
.7.6.
0...5
..K..
1...4
.2.3.
Was sind “Ritteranweisungen”?
– David
3. Mai 2013 um 0:51 Uhr
Vielen Dank für Ihre Antwort. Könnten Sie mich bitte verlinken oder mir vielleicht einen Code zeigen, um es besser zu veranschaulichen? (Ich bin ein bisschen Anfänger … wenn Sie verstehen könnten:) Nochmals vielen Dank
– ejjrex
3. Mai 2013 um 0:53 Uhr
Ich begrüße Patashus Antwortversuch. Während es scheint, dass viele seine Erklärung verstanden haben, war ich nicht in der Lage, sie gut zu verstehen. Wenn jemand das bereits Gesagte ergänzen kann, wäre ich sehr dankbar.
– Tiefgang
3. Mai 2013 um 2:03 Uhr
@deepak Stellen Sie sich vor, eine Position wird durch ein dargestellt x,y Tupel im 2D-Raum. Für jedes Paar di[i], dj[i] füge es hinzu x,y und du wirst bekommen x,y nacheinander in jede Richtung transponiert. Ist das sinnvoll?
– Patashu
3. Mai 2013 um 2:40 Uhr
@ Patashu Ja, ich glaube, ich verstehe es jetzt. Ich war am meisten verwirrt über die Figuren, die du gezeichnet hattest und wie du sie bekommen hast. Endlich habe ich diese Zahlen verstanden.
– Tiefgang
3. Mai 2013 um 16:08 Uhr
Für diejenigen, die Patashus Erklärung schwer verständlich finden, werde ich versuchen, sie klarzustellen.
Stellen Sie sich vor, Sie versuchen, jeden möglichen Zug von einem bestimmten Punkt auf einem Schachbrett aus in Betracht zu ziehen.
Wenn Sie die di- und dj-Arrays durchlaufen und die di-Werte als x-Offsets und die dj-Werte als y-Offsets interpretieren, decken Sie jede der möglichen 8 Richtungen ab.
Angenommen, positives x ist Osten und positives y ist Süden (wie in Patashus Antwort), erhalten Sie Folgendes:
Die diK- und djK-Arrays können auf die gleiche Weise interpretiert werden, um die möglichen Züge für die Springerfigur festzulegen. Wenn Sie mit Schach nicht vertraut sind, bewegt sich der Springer in einem L-Muster – zwei Felder in eine Richtung und dann ein Feld im rechten Winkel dazu (oder umgekehrt).
| diK/x | djK/y | Direction
--+-------+-------+----------------
0 | -2 | -1 | 2 west, 1 north
1 | -2 | 1 | 2 west, 1 south
2 | -1 | 2 | 1 west, 2 south
3 | 1 | 2 | 1 east, 2 south
4 | 2 | 1 | 2 east, 1 south
5 | 2 | -1 | 2 east, 1 north
6 | 1 | -2 | 1 east, 2 north
7 | -1 | -2 | 1 west, 2 north
Ein kleines Code-Snippet, um die Anzahl der möglichen Bewegungen in alle Richtungen zu überprüfen, die die definierten Arrays verwenden.
int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int movesPossible[8];
int move = 0;
int posx, posy; // position of the figure we are checking
for (int d=0; d<8; d++) {
for (move = 1; board.getElt(posx+di[d]*move, posy+dj[d]*move)==EMPTY; move++) ;
movesPossible[d] = move-1;
}
14216500cookie-checkWelche Bedeutung hat die Initialisierung von Richtungs-Arrays unten mit gegebenen Werten bei der Entwicklung eines Schachprogramms?yes
benutze ich oft
d={0,1,0,-1,0}
dafür: Artikelpaare fürd[i], d[i+1]
Gib mir vier Himmelsrichtungen.– Sergej Kalinitschenko
3. Mai 2013 um 0:50 Uhr
Das ist eine überraschend gute Frage. … Lässt sich am Titel etwas machen?
– Luser Drog
3. Mai 2013 um 0:55 Uhr
Sie haben also nicht daran gedacht zu erwähnen, dass dieser Code von einer Schach-Engine stammt? Daran hast du auch nicht gedacht sehen selbst, wie diese Werte verwendet wurden?
– Trojaner
3. Mai 2013 um 6:17 Uhr
„Viele der großen Programmierer haben diese vier Zeilen […]” – Ich bin hier pingelig, aber wenn sie großartige Programmierer wären, würde ihr Code Sie nicht dazu bringen, sich zu fragen: “Was ist das für ein Konstrukt?!”
– utnapistim
3. Mai 2013 um 11:02 Uhr
@utnapistim Wenn Sie den größten Teil des Codes schreiben, haben Sie Recht, aber hier verfehlen Sie den Punkt. Dieser Fall ist eine legitime Ausnahme von dieser Regel. Wenn Sie Code für einen Wettbewerb und unter Zeitdruck schreiben, ist Quick-and-Dirty fast immer besser als Clean-and-Wartbar. In diesem Fall jetzt für Sie lesbar Ja wirklich ist alles was zählt. Ein großartiger Programmierer schreibt sehr gut ein nicht wartbares, unlesbares Durcheinander in diesem Zusammenhangauch wenn der Großteil ihres regulären Codes gut lesbar und wartbar ist.
– Ben Lee
7. Mai 2013 um 21:12 Uhr