Track
/
Ruby
Ruby
/
Esercizi
/
Partita a scacchi
Partita a scacchi

Partita a scacchi

Esercizio di apprendimento

Introduzione

Gli intervalli rappresentano un intervallo tra due valori. I tipi più comuni che supportano gli intervalli sono Integer e String. Si possono usare per molte cose: creare rapidamente una collezione, estrarre sottostringhe, verificare se un valore è in un intervallo e iterare. Si creano usando l'operatore di intervallo .. o ... (rispettivamente inclusivo ed esclusivo).

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]

Il motivo per cui esistono due operatori di intervallo è permettere di creare intervalli inclusivi o esclusivi del valore finale, cosa che può essere utile, per esempio, quando si lavora con indici che partono da zero.

Gli intervalli si possono anche creare usando il costruttore di Range, new.

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

Quando in Ruby crei un intervallo con gli operatori .. o ... e vuoi chiamare un metodo sull'intervallo, devi racchiudere l'intervallo tra parentesi. Altrimenti, il metodo verrebbe chiamato sul secondo argomento dell'operatore di intervallo.

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

Estrarre sottostringhe

Quando vuoi estrarre una sottostringa da una stringa, puoi usare l'operatore di intervallo per ottenerla. Cioè creando un intervallo con l'indice iniziale e finale della sottostringa.

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

Puoi anche usare indici negativi per ottenere la sottostringa dalla fine della stringa.

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

Metodi degli intervalli

Gli intervalli hanno una serie di metodi che si possono usare per lavorarci. Per esempio, questi metodi permettono di ottenere la somma di tutti i valori dell'intervallo o di verificare se l'intervallo include un valore.

Metodo Descrizione Esempio
sum Restituisce la somma di tutti i valori dell'intervallo (1..5).sum # => 15
size Restituisce la dimensione dell'intervallo (1..5).size # => 5
include? Restituisce true se l'intervallo include il valore dato, altrimenti false (1..5).include?(3) # => true

Intervalli senza fine e senza inizio

Un intervallo può essere senza fine e senza inizio. In un intervallo senza fine o senza inizio il valore iniziale o finale è nil, ma quando si definisce l'intervallo il nil si può omettere.

Usare intervalli senza inizio e senza fine è utile quando vuoi, per esempio, estrarre una sottostringa dall'inizio o fino alla fine di una stringa.

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

Se non viene usato su una collezione, l'intervallo senza fine può causare una sequenza infinita, se non si presta attenzione.

Intervalli di stringhe

Anche le stringhe si possono usare negli intervalli e permettono di ottenere un intervallo di stringhe tra due stringhe. Il suo comportamento può essere un po' imprevedibile con certe stringhe, quindi usalo con cautela.

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

Istruzioni

Da appassionato di scacchi, vorresti scrivere la tua versione del gioco. Certo, online ci sono probabilmente già molte implementazioni di scacchi, ma la tua sarà unica!

Inizierai implementando un sistema di movimento di base per i pezzi.

La partita di scacchi si giocherà su una scacchiera di 8 caselle per lato. Le caselle sono identificate da una lettera e un numero.

1. Definisci l'intervallo delle traverse e delle colonne

Il gioco dovrà memorizzare le traverse della scacchiera. Le traverse sono le righe della scacchiera e sono numerate da 1 a 8.

Il gioco dovrà anche memorizzare le colonne della scacchiera. Le colonne sono le linee verticali della scacchiera, identificate dalle lettere dalla A alla H.

Definisci le costanti Chess::RANKS e Chess::FILES, che memorizzano rispettivamente l'intervallo delle traverse e delle colonne.

Chess::RANKS
# => 1..8

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

2. Verifica se una casella è valida

Il gioco dovrà verificare se una casella è valida. Una casella è valida se la traversa e la colonna rientrano negli intervalli delle traverse e delle colonne.

Definisci il metodo Chess.valid_square?, che accetta gli argomenti rank, un intero che indica la traversa, e file, un carattere che indica la colonna. Il metodo deve restituire true se la traversa e la colonna rientrano negli intervalli delle traverse e delle colonne, e false in caso contrario.

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

3. Ottieni il soprannome del giocatore

Il gioco dovrà ottenere il soprannome del giocatore. Il soprannome è formato dai primi 2 caratteri del nome del giocatore e dagli ultimi 2 caratteri del suo cognome. Il soprannome deve essere scritto in maiuscolo.

Definisci il metodo Chess.nickname, che accetta gli argomenti first_name, una stringa con il nome del giocatore, e last_name, una stringa con il cognome del giocatore. Il metodo deve restituire il soprannome del giocatore come stringa in maiuscolo.

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

4. Crea il messaggio di una mossa

Il gioco dovrà creare un messaggio per una mossa, che dica quale giocatore si è spostato su quale casella. Il messaggio deve usare il soprannome del giocatore e la casella di destinazione. Il gioco deve anche determinare se la mossa è valida, controllando se la colonna e la traversa della casella rientrano negli intervalli delle colonne e delle traverse.

Se la mossa è valida, il messaggio deve essere: "{nickname} moved to {square}" Se la mossa non è valida, il messaggio deve essere: "{nickname} attempted to move to {square}, but that is not a valid square"

Definisci il metodo Chess.move_message, che accetta gli argomenti first_name, una stringa con il nome del giocatore, last_name, una stringa con il cognome del giocatore, e square, una stringa con la casella su cui il giocatore si è spostato. Il metodo deve restituire il messaggio della mossa come stringa.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Ruby Exercism

Vuoi iniziare Partita a scacchi?

Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.