Kurzusok
/
Go
Go
/
Feladatok
/
Jedlik játékai
Jedlik játékai

Jedlik játékai

Tanulófeladat

Bevezetés

A metódus egy olyan függvény, amelynek van egy speciális receiver argumentuma. A receiver a saját argumentumlistájában, a func kulcsszó és a metódus neve között jelenik meg.

func (receiver type) MethodName(parameters) (returnTypes) {
}

Csak olyan receiverrel definiálhatsz metódust, amelynek típusa ugyanabban a csomagban van definiálva, mint maga a metódus.

package person 

type Person struct {
	Name string
}

func (p Person) Greetings() string {
	return fmt.Sprintf("Welcome %s!", p.Name)
}

A struktúrához tartozó metódust pontszintaxissal hívhatod meg.

p := Person{Name: "Bronson"}
fmt.Println(p.Greetings())
// Output: Welcome Bronson!

Figyeld meg, ahogy a Greetings() metódust meghívtuk a p nevű Person példányon. Pontosan úgy, ahogy egy objektumorientált programozási nyelvben hívod meg a metódusokat.

Ne feledd: a metódus nem más, mint egy függvény receiver argumentummal. A metódusok segítenek elkerülni a névütközéseket: mivel egy metódus egy adott receiver típushoz kötődik, ugyanazt a metódusnevet használhatod különböző típusokon.

import "math"

type rect struct {
	width, height int
}
func (r rect) area() int {
	return r.width * r.height
}

type circle struct {
	radius int
}
func (c circle) area() float64 {
	return math.Pow(float64(c.radius), 2) * math.Pi
}

Kétféle receiver létezik: érték szerinti és mutató szerinti.

Az eddig látott metódusok mind érték szerinti receivert használnak, ami azt jelenti, hogy a metódusnak átadott érték egy másolatát kapják meg, így a metóduson belül a receiveren végzett módosítások nem láthatók a hívó számára.

Mutató szerinti receiverrel is deklarálhatsz metódusokat, hogy módosítani tudd azt az értéket, amelyre a receiver mutat. Ezt úgy éred el, hogy a típusnév elé egy *-ot teszel. Például a rect típusnál egy mutató szerinti receiver így nézne ki: *rect. Az ilyen módosítások a metódus hívója számára is láthatók.

type rect struct {
	width, height int
}
func (r *rect) squareIt() {
	r.height = r.width
}

r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20

r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10

Utasítások

Megjegyzés: Ez a feladat a need-for-speed feladat folytatása.

Ebben a feladatban különféle távirányítós autók közötti versenyeket fogsz szervezni. Minden autónak saját sebesség- és akkumulátorfogyasztási jellemzői vannak.

Az autók teljesen feltöltött (100%-os) akkumulátorral indulnak. Valahányszor elvezeted az autót a távirányítóval, az megteszi az autó sebességének megfelelő távolságot méterben, és az akkumulátor töltöttségét az akkumulátorfogyasztás mértékével csökkenti.

Ha az autó akkumulátorának töltöttsége az akkumulátorfogyasztás százalékos értéke alá esik, nem tudod tovább vezetni az autót.

A távirányítós autón van egy mutatós LED-kijelző, amely két információt jelenít meg:

  • A teljes megtett távolság, amely így jelenik meg: "Driven <METERS> meters".
  • A hátralévő akkumulátortöltés, amely így jelenik meg: "Battery at <PERCENTAGE>%".

Minden versenypályának saját hossza van. Az autókat úgy vizsgálják, hogy képesek-e befejezni a pályát anélkül, hogy kimerülne az akkumulátoruk.

1. Vezesd az autót

Valósítsd meg a Car típus Drive metódusát, amely az autó sebessége alapján frissíti a megtett méterek számát, és az akkumulátorfogyasztásnak megfelelően csökkenti az akkumulátor töltöttségét:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car.Drive()
// car is now Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}

Megjegyzés: Ne próbáld vezetni az autót, ha ettől az akkumulátor töltöttsége 0 alá csökkenne.

2. Jelenítsd meg a megtett távolságot

Valósítsd meg a Car DisplayDistance metódusát, amely string-ként visszaadja a távolságot úgy, ahogy a LED-kijelzőn megjelenik:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayDistance())
// Output: "Driven 0 meters"

3. Jelenítsd meg az akkumulátor töltöttségét

Valósítsd meg a Car DisplayBattery metódusát, amely string-ként visszaadja az akkumulátor töltöttségét úgy, ahogy a LED-kijelzőn megjelenik:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayBattery())
// Output: "Battery at 100%"

4. Ellenőrizd, hogy egy távirányítós autó be tud-e fejezni egy versenyt

Ahhoz, hogy egy autó befejezzen egy versenyt, képesnek kell lennie megtenni a verseny távját. Ez azt jelenti, hogy nem merülhet ki az akkumulátora, mielőtt átlépi a célvonalat. Valósítsd meg a CanFinish metódust, amely egy trackDistance int paramétert vár, és true-t ad vissza, ha az autó be tudja fejezni a versenyt; egyébként false-t:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

trackDistance := 100

car.CanFinish(trackDistance)
// => true
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

Készen állsz elkezdeni a(z) Jedlik játékai feladatot?

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