Tracks
/
Ruby
Ruby
/
Übungen
/
Schachspiel
Schachspiel

Schachspiel

Lernübung

Einführung

Bereiche repräsentieren ein Intervall zwischen zwei Werten. Die häufigsten Typen, die Bereiche unterstützen, sind Integer und String. Du kannst sie für vieles verwenden, zum Beispiel um schnell eine Sammlung zu erstellen, Strings zu zerlegen, zu prüfen, ob ein Wert in einem Bereich liegt, oder zum Iterieren. Sie werden mit dem Range-Operator .. oder ... erstellt (inklusiv bzw. exklusiv).

1..5  # => 1..5
1...5 # => 1...5

(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]

Der Grund für zwei Range-Operatoren ist, dass du Bereiche erstellen kannst, die den Endwert einschließen oder ausschließen. Das ist zum Beispiel nützlich, wenn du mit nullbasierten Indizes arbeitest.

Bereiche können auch mit dem Range-Konstruktor new erstellt werden.

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

Wenn du in Ruby einen Bereich mit den Range-Operatoren .. oder ... erstellst und eine Methode für den Bereich aufrufen möchtest, musst du den Bereich in runde Klammern setzen. Sonst wird die Methode nämlich für das zweite Argument des Range-Operators aufgerufen.

(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)

Teilstrings extrahieren

Wenn du einen Teilstring aus einem String extrahieren möchtest, kannst du den Range-Operator verwenden. Dazu erstellst du einen Bereich mit dem Start- und Endindex des Teilstrings.

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

Du kannst auch negative Indizes verwenden, um den Teilstring vom Ende des Strings zu erhalten.

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

Methoden für Bereiche

Bereiche haben eine Reihe von Methoden, mit denen du arbeiten kannst. Zum Beispiel kannst du mit diesen Methoden die Summe aller Werte im Bereich berechnen oder prüfen, ob der Bereich einen Wert enthält.

Methode Beschreibung Beispiel
sum Gibt die Summe aller Werte im Bereich zurück (1..5).sum # => 15
size Gibt die Größe des Bereichs zurück (1..5).size # => 5
include? Gibt true zurück, wenn der Bereich den angegebenen Wert enthält, sonst false (1..5).include?(3) # => true

Endlose und anfangslose Bereiche

Ein Bereich kann endlos und anfangslos sein. Bei einem endlosen oder anfangslosen Bereich ist der Start- oder Endwert nil, aber beim Definieren des Bereichs kannst du das nil weglassen.

Anfangslose und endlose Bereiche sind nützlich, wenn du zum Beispiel einen String vom Anfang oder bis zum Ende extrahieren möchtest.

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Caution

Wenn du einen endlosen Bereich nicht auf eine Sammlung anwendest, kann er eine endlose Sequenz erzeugen. Verwende ihn also mit Vorsicht.

String-Bereiche

Strings können auch in Bereichen verwendet werden und ermöglichen ein Intervall von Strings zwischen zwei Strings. Das Verhalten kann bei bestimmten Strings etwas unerwartet sein, also sei vorsichtig.

("aa".."az").to_a # => ["aa", "ab", "ac", ..., "az"]

Anleitung

Als Schachfan möchtest du deine eigene Version des Spiels schreiben. Ja, es gibt online vielleicht schon jede Menge Schach-Implementierungen, aber deine wird einzigartig sein!

Du beginnst damit, ein einfaches Bewegungssystem für die Figuren zu implementieren.

Das Schachspiel wird auf einem Brett gespielt, das 8 Felder breit und 8 Felder lang ist. Die Felder werden durch einen Buchstaben und eine Zahl bezeichnet.

1. Definiere den Bereich für Reihen und Linien

Das Spiel muss die Reihen des Bretts speichern. Die Reihen sind die Zeilen des Bretts und sind von 1 bis 8 nummeriert.

Das Spiel muss außerdem die Linien des Bretts speichern. Die Linien sind die Spalten des Bretts und werden durch die Buchstaben A bis H bezeichnet.

Definiere die Konstanten Chess::RANKS und Chess::FILES, die den Bereich der Reihen bzw. der Linien speichern.

Chess::RANKS
# => 1..8

Chess::FILES
# => 'A'..'H'

2. Prüfe, ob ein Feld gültig ist

Das Spiel muss prüfen, ob ein Feld gültig ist. Ein Feld ist gültig, wenn die Reihe und die Linie innerhalb der Bereiche der Reihen und Linien liegen.

Definiere die Methode Chess.valid_square?, die die Argumente rank, das eine Ganzzahl für die Reihe enthält, und file, das ein Zeichen für die Linie enthält, entgegennimmt. Die Methode soll true zurückgeben, wenn Reihe und Linie innerhalb der Bereiche der Reihen und Linien liegen, und andernfalls false.

Chess.valid_square?(1, 'A')
# => true

3. Ermittle den Spitznamen des Spielers

Das Spiel muss den Spitznamen des Spielers ermitteln. Der Spitzname besteht aus den ersten 2 Zeichen des Vornamens und den letzten 2 Zeichen des Nachnamens des Spielers. Der Spitzname soll großgeschrieben werden.

Definiere die Methode Chess.nickname, die die Argumente first_name, das einen String mit dem Vornamen des Spielers enthält, und last_name, das einen String mit dem Nachnamen des Spielers enthält, entgegennimmt. Die Methode soll den Spitznamen des Spielers als großgeschriebenen String zurückgeben.

Chess.nickname("John", "Doe")
# => "JOOE"

4. Erstelle eine Zugnachricht

Das Spiel muss eine Nachricht für einen Zug erstellen, die angibt, welcher Spieler auf welches Feld gezogen ist. Die Nachricht soll den Spitznamen des Spielers und das Feld, auf das er gezogen ist, verwenden. Außerdem muss das Spiel feststellen, ob der Zug gültig ist, indem es prüft, ob Linie und Reihe des Feldes innerhalb der Bereiche der Linien und Reihen liegen.

Wenn der Zug gültig ist, soll die Nachricht lauten: "{nickname} moved to {square}". Wenn der Zug ungültig ist, soll die Nachricht lauten: "{nickname} attempted to move to {square}, but that is not a valid square".

Definiere die Methode Chess.move_message, die die Argumente first_name, das einen String mit dem Vornamen des Spielers enthält, last_name, das einen String mit dem Nachnamen des Spielers enthält, und square, das einen String mit dem Feld enthält, auf das der Spieler gezogen ist, entgegennimmt. Die Methode soll die Nachricht für den Zug als String zurückgeben.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Ruby Exercism

Bereit, mit Schachspiel zu starten?

Melde dich bei Exercism an, um Ruby mit 21 Konzepte121 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.