Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Sakkjátszma
Sakkjátszma

Sakkjátszma

Tanulófeladat

Bevezetés

A tartományok két érték közötti intervallumot jelölnek. A leggyakrabban használt, tartományokat támogató típusok az Int, a Char és a String. Sok mindenre használhatók, például gyűjtemények gyors létrehozására, stringek szeletelésére, annak ellenőrzésére, hogy egy érték benne van-e egy tartományban, és iterációra. A .. vagy a ... tartományoperátorral hozhatók létre (előbbi zárt, utóbbi nyílt).

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

Azért van két tartományoperátor, hogy olyan tartományokat hozhass létre, amelyek tartalmazzák vagy nem tartalmazzák a végértéket. Ez hasznos lehet például akkor, ha nullától kezdődő indexekkel dolgozol.

A tartományokat a Range kezdőértékével is létrehozhatod.

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

Amikor Crystalkan a .. vagy a ... tartományoperátorral hozol létre egy tartományt, és metódust szeretnél meghívni rajta, zárójelbe kell tenned a tartományt. Ellenkező esetben ugyanis a metódus a tartományoperátor második argumentumán hívódna meg.

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

Részstringek kinyerése

Ha egy stringet szeretnél szeletelni, a tartományoperátorral részstringet kaphatsz. Ehhez olyan tartományt hozz létre, amely a részstring kezdő- és záróindexét adja meg.

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

Negatív indexekkel a string végétől is kinyerheted a részstringet.

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

A tartományok metódusai

A tartományoknak van egy sor metódusa, amelyekkel dolgozhatsz rajtuk. Ezekkel például megkaphatod a tartomány összes értékének összegét, vagy ellenőrizheted, hogy a tartomány tartalmaz-e egy értéket.

Method Description Example
sum A tartomány összes értékének összegét adja vissza (1..5).sum # => 15
size A tartomány méretét adja vissza (1..5).size # => 5
includes? true-t ad vissza, ha a tartomány tartalmazza a megadott értéket, egyébként false-t (1..5).includes?(3) # => true

Végtelen és kezdet nélküli tartományok

Egy tartomány lehet végtelen és kezdet nélküli. A végtelen vagy kezdet nélküli tartománynál a kezdő- vagy a végérték nil, de a nil el is hagyható a tartomány megadásakor.

A kezdet nélküli és végtelen tartományok akkor hasznosak, ha például egy stringet az elejétől vagy a végéig szeretnél szeletelni.

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

Ha nem gyűjteményen használod, a végtelen tartomány végtelen sorozatot eredményezhet, ha nem bánsz vele óvatosan.

Char típusú tartományok

A Char értékek is használhatók tartományokban, így két karakter közötti karakterintervallumot kapsz. Ez például akkor hasznos, ha az ábécét szeretnéd megkapni.

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

Stringtartományok

A stringek is használhatók tartományokban, így két string közötti stringintervallumot kaphatsz. A viselkedésük azonban némileg eltér a Char-tól, ha több karaktert használsz egy stringtartományban. Bonyolultabb stringtartományoknál a viselkedés zavaróvá válhat, ezért légy óvatos.

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

Utasítások

Sakkrajongóként a játék saját változatát szeretnéd megírni. Igaz, máris rengeteg sakkmegvalósítás elérhető online, de a tiéd egyedi lesz!

A bábuk alapvető mozgatási rendszerének megvalósításával kezded.

A sakkjátszma egy nyolc mező széles és nyolc mező hosszú táblán zajlik majd. A mezőket egy betű és egy szám azonosítja.

1. A sorok és oszlopok tartományának definiálása

A játéknak tárolnia kell a tábla sorait. A sorok a tábla vízszintes vonalai, és 1-től 8-ig vannak számozva.

A játéknak a tábla oszlopait is tárolnia kell. Az oszlopok a tábla függőleges vonalai, és az A-tól H-ig terjedő betűk jelölik őket.

Definiáld a Chess::RANKS és Chess::FILES konstansokat, amelyek rendre a sorok és az oszlopok tartományát tárolják.

Chess::RANKS
# => 1..8

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

2. Ellenőrizd, hogy egy mező érvényes-e

A játéknak ellenőriznie kell, hogy egy mező érvényes-e. Egy mező akkor érvényes, ha a sora és az oszlopa a sorok és az oszlopok tartományán belül van.

Definiáld a Chess.valid_square? metódust, amely két argumentumot kap: rank a mező sorát tárolja egész számként, file pedig az oszlopát karakterként. A metódus adjon vissza true-t, ha a sor és az oszlop a sorok és oszlopok tartományán belül van, egyébként pedig false-t.

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

3. Kérd le a játékos becenevét

A játéknak le kell kérnie a játékos becenevét. A becenév a játékos keresztnevének első két karaktere és a vezetéknevének utolsó két karaktere. A becenevet nagybetűvel kell írni.

Definiáld a Chess.nickname metódust, amely a first_name és a last_name argumentumot kapja: first_name a játékos keresztnevét, last_name pedig a vezetéknevét tartalmazó string. A metódus a játékos becenevét nagybetűs stringként adja vissza.

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

4. Hozd létre a lépés üzenetét

A játéknak üzenetet kell létrehoznia egy lépéshez, hogy megmondja, melyik játékos melyik mezőre lépett. Az üzenetben a játékos beceneve és a mező szerepel, amelyre lépett. A játéknak azt is meg kell határoznia, hogy a lépés érvényes-e, mégpedig úgy, hogy ellenőrzi, a mező oszlopa és sora a sorok és oszlopok tartományán belül van-e.

Ha a lépés érvényes, az üzenet ez legyen: "{nickname} moved to {square}" Ha a lépés érvénytelen, az üzenet ez legyen: "{nickname} attempted to move to {square}, but that is not a valid square"

Definiáld a Chess.move_message metódust, amely a first_name, a last_name és a square argumentumot kapja: first_name a játékos keresztnevét, last_name a vezetéknevét, square pedig a mezőt tartalmazó string, amelyre a játékos lépett. A metódus a lépés üzenetét adja vissza stringként.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Sakkjátszma feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.