Γράψε έναν προσομοιωτή ρομπότ.
Οι εγκαταστάσεις δοκιμών ενός εργοστασίου ρομπότ χρειάζονται ένα πρόγραμμα για να επαληθεύουν τις κινήσεις των ρομπότ.
Τα ρομπότ έχουν τρεις δυνατές κινήσεις:
Τα ρομπότ τοποθετούνται σε ένα υποθετικό άπειρο πλέγμα, κοιτώντας προς μια συγκεκριμένη κατεύθυνση (βόρεια, ανατολικά, νότια ή δυτικά) και βρίσκονται σε ένα σύνολο συντεταγμένων {x,y}, π.χ. {3,8}, με τις συντεταγμένες να αυξάνονται προς τα βόρεια και τα ανατολικά.
Στη συνέχεια το ρομπότ λαμβάνει έναν αριθμό εντολών, και τότε οι εγκαταστάσεις δοκιμών επαληθεύουν τη νέα θέση του ρομπότ και προς τα πού δείχνει.
Τα tests χωρίζονται σε 3 βήματα.
Τρέξε όλα τα tests με go test ή τρέξε συγκεκριμένα tests με την επιλογή -tags.
Παραδείγματα:
go test # run all tests
go test -tags step1 # run just step 1 tests.
go test -tags 'step1 step2' # run step1 and step2 tests
Σου δίνεται το αρχείο πηγαίου κώδικα defs.go, το οποίο ορίζει έναν αριθμό από πράγματα που χρειάζεται το πρόγραμμα ελέγχου. Είναι οργανωμένο σε τρία τμήματα, ένα για κάθε βήμα.
Για να ολοκληρώσεις το βήμα 1, θα ορίσεις τα Right, Left, Advance, N, S, E, W και Dir. Ολοκλήρωσε το βήμα 1 πριν προχωρήσεις στο βήμα 2.
Στο βήμα 1 υλοποίησες κινήσεις ρομπότ, αλλά δεν είναι και πολύ προσομοίωση. Για παράδειγμα, πού βρίσκεται "το ρομπότ" στον πηγαίο κώδικα; Πού είναι "το πλέγμα"; Πού είναι οι υπολογισμοί που μετατρέπουν τις ενέργειες του ρομπότ σε θέσεις στο πλέγμα, στο ρομπότ ή στο πλέγμα; Ο φυσικός κόσμος είναι διαφορετικός.
Το βήμα 2 εισάγει ένα "δωμάτιο". Φαίνεται μικρή προσθήκη, αλλά θα κάνουμε μεγάλες αλλαγές για να ξεκαθαρίσουμε τους ρόλους του "δωματίου", του "ρομπότ" και του "προγράμματος ελέγχου" και να αρχίσουμε να ξεκαθαρίζουμε τη φυσική της προσομοίωσης. Θα ορίσεις τα Room και Robot ως συναρτήσεις τις οποίες το πρόγραμμα ελέγχου "φέρνει στη ζωή" εκκινώντας τις ως goroutines. Η πληροφορία κινείται ανάμεσα στο πρόγραμμα ελέγχου, το ρομπότ και το δωμάτιο μέσω των channels της Go.
Σκέψου το Room σαν μια "μηχανή φυσικής", κάτι που μοντελοποιεί και προσομοιώνει ένα φυσικό δωμάτιο με τοίχους και ένα ρομπότ. Θα πρέπει με κάποιον τρόπο να μοντελοποιεί τον χώρο συντεταγμένων του δωματίου, τη θέση του ρομπότ και των τοίχων, και να εξασφαλίζει, για παράδειγμα, ότι το ρομπότ δεν περνάει μέσα από τοίχους. Θέλουμε το Robot να είναι ένας πράκτορας που εκτελεί ενέργειες, αλλά θέλουμε το Room να διατηρεί μια συνεπή αλήθεια.
Το πρόγραμμα ελέγχου δημιουργεί τα channels και ξεκινά και το Room και το Robot. Στη συνέχεια, το πρόγραμμα ελέγχου στέλνει εντολές στο Robot. Όταν τελειώσει με την αποστολή εντολών, κλείνει το channel εντολών. Το Robot πρέπει να δέχεται εντολές και να ενημερώνει το Room για τις ενέργειες που επιχειρεί. Όταν αντιληφθεί ότι το channel εντολών κλείνει, πρέπει να τερματίσει τον εαυτό του. Το δωμάτιο πρέπει να ερμηνεύει τις φυσικές συνέπειες των ενεργειών του ρομπότ. Όταν αντιληφθεί ότι το ρομπότ τερματίζεται, στέλνει μια τελική αναφορά πίσω στο πρόγραμμα ελέγχου, που δηλώνει την τελική θέση και κατεύθυνση του ρομπότ.
Το βήμα 3 έχει τρεις μεγάλες αλλαγές:
Για την τελική αναφορά θέσης που στέλνεται από το Room3, μπορείς να επιστρέψεις το ίδιο slice που έλαβες από το channel των ρομπότ, απλώς με ενημερωμένες θέσεις και κατευθύνσεις. Πρέπει να στέλνονται μηνύματα στο channel καταγραφής για:
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες165 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.