Rutas
/
Crystal
Crystal
/
Ejercicios
/
Partida de ajedrez
Partida de ajedrez

Partida de ajedrez

Ejercicio de aprendizaje

Introducción

Los rangos representan un intervalo entre dos valores. Los tipos más comunes que admiten rangos son Int, Char y String. Se pueden usar para muchas cosas, como crear rápidamente una colección, cortar strings, comprobar si un valor está dentro de un rango e iterar. Se crean con el operador de rango .. o ... (inclusivo y exclusivo, respectivamente).

1..5  # A range containing 1, 2, 3, 4, 5
1...5 # A range containing 1, 2, 3, 4

La razón de tener dos operadores de rango es poder crear rangos que incluyan o excluyan el valor final, lo que puede ser útil cuando, por ejemplo, se trabaja con índices basados en cero.

Los rangos también se pueden crear usando el inicializador Range.

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

Cuando creas un rango en Crystal usando los operadores de rango .. o ..., y quieres llamar a un método sobre el rango, necesitas encerrar el rango entre paréntesis. Esto se debe a que, de lo contrario, el método se llamaría sobre el segundo argumento del operador de rango.

(1..5).size # => 5
1..5.size # => Error: undefined method 'size' for Int32

Obtener substrings

Cuando quieras cortar un string, puedes usar el operador de rango para obtener un substring. Es decir, creando un rango con los índices de inicio y fin del substring.

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

También puedes usar índices negativos para obtener el substring desde el final del string.

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

Métodos de los rangos

Los rangos sí que tienen un conjunto de métodos que se pueden usar para trabajar con ellos. Por ejemplo, estos métodos se pueden usar para obtener la suma de todos los valores del rango o comprobar si el rango incluye un valor.

Método Descripción Ejemplo
sum Devuelve la suma de todos los valores del rango (1..5).sum # => 15
size Devuelve el tamaño del rango (1..5).size # => 5
includes? Devuelve true si el rango incluye el valor dado; en caso contrario, false (1..5).includes?(3) # => true

Rangos sin fin y sin principio

Un rango puede ser sin fin y sin principio. El rango sin fin o sin principio tiene su valor de inicio o de fin como nil, pero nil se puede omitir al definir el rango.

Usar rangos sin principio y sin fin es útil cuando quieres, por ejemplo, cortar un string desde el principio o hasta el final.

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

Si no se usa sobre una colección, el rango sin fin puede provocar una secuencia sin fin, si no se usa con cuidado.

Rangos de caracteres

Los caracteres se pueden usar en rangos y permiten obtener un intervalo de caracteres entre dos caracteres. Por ejemplo, esto puede resultar útil cuando quieres obtener el alfabeto.

'a'..'z' # A range containing ['a', 'b', 'c', ..., 'z']

Rangos de strings

Los strings también se pueden usar en rangos, lo que permite obtener un intervalo de strings entre dos strings. Pero su comportamiento es ligeramente distinto al de Char cuando se usan varios caracteres en un rango de strings. Su comportamiento puede volverse confuso al hacer rangos de strings más complejos, así que ten cuidado.

("aa".."az") # A range containing ["aa", "ab", "ac", ..., "az"]

Instrucciones

Como aficionado al ajedrez, quieres escribir tu propia versión del juego. Sí, puede que ya haya un montón de implementaciones de ajedrez disponibles en internet, pero la tuya será única.

Empiezas implementando un sistema de movimiento básico para las piezas.

La partida de ajedrez se jugará en un tablero de ocho casillas de ancho y ocho casillas de largo. Las casillas se identifican con una letra y un número.

1. Define el rango de filas y columnas

El juego tendrá que almacenar las filas del tablero. Las filas son las hileras del tablero y están numeradas del 1 al 8.

El juego también tendrá que almacenar las columnas del tablero. Las columnas son las hileras verticales del tablero y se identifican con las letras de la A a la H.

Define las constantes Chess::RANKS y Chess::FILES, que almacenan el rango de filas y el de columnas, respectivamente.

Chess::RANKS
# => 1..8

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

2. Comprueba si la casilla es válida

El juego tendrá que comprobar si una casilla es válida. Una casilla es válida si su fila y su columna están dentro de los rangos de filas y columnas.

Define el método Chess.valid_square?, que recibe los argumentos rank, que contiene un int de la fila, y file, que contiene un char de la columna. El método debe devolver true si la fila y la columna están dentro del rango de filas y columnas, y devolver false en caso contrario.

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

3. Obtén el apodo del jugador

El juego tendrá que obtener el apodo del jugador. El apodo son los dos primeros caracteres del nombre del jugador y los dos últimos caracteres de su apellido. El apodo debe ir en mayúsculas.

Define el método Chess.nickname, que recibe los argumentos first_name, que contiene un string con el nombre del jugador, y last_name, que contiene un string con el apellido del jugador. El método debe devolver el apodo del jugador como un string en mayúsculas.

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

4. Crea el mensaje del movimiento

El juego tendrá que crear un mensaje para un movimiento que indique qué jugador se movió a qué casilla. El mensaje debe usar el apodo del jugador y la casilla a la que se movió. El juego también debe determinar si el movimiento es válido comprobando si la columna y la fila de la casilla están dentro de los rangos de columnas y filas.

Si el movimiento es válido, el mensaje debe ser: "{nickname} moved to {square}" Si el movimiento no es válido, el mensaje debe ser: "{nickname} attempted to move to {square}, but that is not a valid square"

Define el método Chess.move_message, que recibe los argumentos first_name, que contiene un string con el nombre del jugador, last_name, que contiene un string con el apellido del jugador, y square, que contiene un string con la casilla a la que se movió el jugador. El método debe devolver el mensaje del movimiento como un string.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Crystal Exercism

¿Listo para empezar Partida de ajedrez?

Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.