Írj egy robotszimulátort.
Egy robotgyár tesztlétesítményének egy programra van szüksége, amely ellenőrzi a robotok mozgását.
A robotok háromféleképpen mozoghatnak:
A robotokat egy képzeletbeli, végtelen rácsra helyezik, adott irányba (észak, kelet, dél vagy nyugat) nézve, egy {x,y} koordinátapáron, például {3,8}; a koordináták észak és kelet felé nőnek.
A robot ezután egy sor utasítást kap, ekkor a tesztlétesítmény ellenőrzi a robot új pozícióját, és azt, hogy milyen irányba néz.
A tesztek 3 lépésre vannak osztva.
Futtasd az összes tesztet a go test paranccsal, vagy futtass meghatározott teszteket a -tags kapcsolóval.
Példák:
go test # run all tests
go test -tags step1 # run just step 1 tests.
go test -tags 'step1 step2' # run step1 and step2 tests
Kapsz egy defs.go forrásfájlt, amely számos olyan dolgot definiál, amire a tesztprogramnak szüksége van. Három szakaszra van tagolva, lépésenként.
Az 1. lépés teljesítéséhez definiálnod kell a Right, Left, Advance, N, S, E, W és Dir értékeket. Az 1. lépést fejezd be, mielőtt továbblépnél a 2. lépésre.
Az 1. lépésben implementáltad a robot mozgását, de ez még nem igazi szimuláció. Hol van például a forráskódban „a robot”? Hol van „a rács”? Hol vannak azok a számítások, amelyek a robot műveleteit rácspozíciókká alakítják: a robotban vagy a rácsban? A fizikai világ más.
A 2. lépés bevezet egy „szobát”. Kicsi kiegészítésnek tűnik, de nagy változtatásokat hajtunk végre, hogy tisztázzuk a „szoba”, a „robot” és a „tesztprogram” szerepét, és elkezdjük tisztázni a szimuláció fizikáját. A Room és a Robot függvényeket fogod definiálni, amelyeket a tesztprogram goroutine-ként való elindításával „kelt életre”. Az információ a tesztprogram, a robot és a szoba között Go-csatornákon keresztül mozog.
Gondolj a Roomra úgy, mint egy „fizikai motorra”, amely modellezi és szimulál egy falakkal és egy robottal rendelkező fizikai szobát. Valahogy modelleznie kell a szoba koordinátaterét, a robot és a falak helyét, és biztosítania kell például azt, hogy a robot ne sétáljon át a falakon. Azt szeretnénk, hogy a Robot műveleteket végrehajtó ügynök legyen, de azt is, hogy a Room fenntartsa a koherens igazságot.
A tesztprogram létrehozza a csatornákat, és elindítja a Roomot és a Robotot is. A tesztprogram ezután parancsokat küld a Robotnak. Amikor végzett a parancsok küldésével, lezárja a parancscsatornát. A Robotnak fogadnia kell a parancsokat, és tájékoztatnia kell a Roomot az általa megkísérelt műveletekről. Amikor érzékeli, hogy a parancscsatorna zárul, le kell állítania magát. A szobának értelmeznie kell a robot műveleteinek fizikai következményeit. Amikor érzékeli, hogy a robot leáll, egy záró jelentést küld vissza a tesztprogramnak, amely megadja a robot végső pozícióját és irányát.
A 3. lépés három jelentős változást hoz:
A Room3 által küldött végső pozíciójelentéshez visszaadhatod ugyanazt a szeletet, amelyet a robots csatornától kaptál, csak a frissített pozíciókkal és irányokkal. A naplócsatornán üzenetet kell küldeni a következő esetekben:
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom165 feladat segítségével, valódi emberi mentorálással, mindez ingyen.