Kurzusok
/
Ruby
Ruby
/
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 leggyakoribb típusok, amelyek támogatják a tartományokat, az Integer és a String. Sok mindenre használhatók: gyorsan létrehozhatsz velük egy gyűjteményt, feldarabolhatsz stringeket, ellenőrizheted, hogy egy érték benne van-e egy tartományban, vagy iterálhatsz. A .. vagy a ... tartományoperátorral hozhatók létre (előbbi a záróértéket is beleérti, utóbbi nem).

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]

Azért van két tartományoperátor, hogy olyan tartományokat is létrehozhass, amelyek tartalmazzák a záróértéket, vagy épp nem. Ez hasznos lehet például a nullától indexelt tömbökkel való munka során.

Tartományokat a Range konstruktorral, a new metódussal is létrehozhatsz.

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

Amikor Rubyban a .. vagy ... operátorral hozol létre egy tartományt, és metódust szeretnél hívni rajta, zárójelbe kell tenned a tartományt. Ennek az az oka, hogy különben a metódus a tartományoperátor második argumentumán hívódik meg.

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

Részstringek kinyerése

Ha egy stringből részstringet szeretnél kivágni, a tartományoperátorral is megkaphatod. Ehhez a részstring kezdő- és végindexével hozol létre egy tartományt.

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

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

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

Tartományok metódusai

A tartományoknak van egy sor metódusuk, amelyekkel dolgozhatsz velük. Ezekkel például kiszámíthatod a tartomány összes értékének összegét, vagy ellenőrizheted, hogy a tartomány tartalmaz-e egy értéket.

Metódus Leírás Példa
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
include? true-t ad vissza, ha a tartomány tartalmazza a megadott értéket, egyébként false-t (1..5).include?(3) # => true

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

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

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 feldarabolni.

"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, ezért óvatosan bánj vele.

String-tartományok

A stringek tartományokban is használhatók, így két string közötti stringek intervallumát kaphatod meg. Bizonyos stringekkel a viselkedése kissé váratlan lehet, ezért óvatosan használd.

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

Utasítások

Sakkrajongóként szeretnéd megírni a játék saját változatát. Persze, lehet, hogy már rengeteg sakkimplementáció elérhető az interneten, de a tiéd egyedi lesz!

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

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

1. Határozd meg a sorok és oszlopok tartományát

A játéknak tárolnia kell a tábla sorait. A sorok a tábla vízszintes sorai, é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 oszlopai, amelyeket A-tól H-ig terjedő betűk azonosítanak.

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

Chess::RANKS
# => 1..8

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

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

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 oszlopok tartományán belül van.

Definiáld a Chess.valid_square? metódust, amelynek rank argumentuma a sor számát tartalmazó egész szám, file argumentuma pedig az oszlop betűjét tartalmazó karakter. 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ő 2 karakteréből és a vezetéknevének utolsó 2 karakteréből áll. A becenevet csupa nagybetűvel kell írni.

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

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

4. Készíts üzenetet egy lépéshez

A játéknak létre kell hoznia egy üzenetet egy lépéshez, amely megmondja, melyik játékos melyik mezőre lépett. Az üzenet a játékos becenevét és a mezőt használja, amelyre lépett. A játéknak azt is meg kell határoznia, hogy érvényes-e a lépés, 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, amelynek first_name argumentuma a játékos keresztnevét tartalmazó string, last_name argumentuma a vezetéknevét tartalmazó string, square argumentuma pedig annak a mezőnek a stringje, amelyre a játékos lépett. A metódus adja vissza a lépés üzenetét 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
Ruby Exercism

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

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