Διαδρομές
/
Rust
Rust
/
Ασκήσεις
/
Ενσωματωμένο παιχνίδι χαμηλής κατανάλωσης
Ενσωματωμένο παιχνίδι χαμηλής κατανάλωσης

Ενσωματωμένο παιχνίδι χαμηλής κατανάλωσης

Άσκηση εκμάθησης

Εισαγωγή

Οι πλειάδες είναι ένας ελαφρύς τρόπος να ομαδοποιείς ένα σταθερό σύνολο δεδομένων αυθαίρετων τύπων. Μια πλειάδα δεν έχει κάποιο συγκεκριμένο όνομα. Όταν δίνεις όνομα σε μια δομή δεδομένων, αυτή γίνεται struct. Τα πεδία μιας πλειάδας δεν έχουν ονόματα. Η πρόσβαση σε αυτά γίνεται με αποδόμηση ή με βάση τη θέση τους.

Σύνταξη

Δημιουργία

Οι πλειάδες δημιουργούνται πάντα με μια έκφραση πλειάδας:

// pointless but legal
let unit = ();
// single element
let single_element = ("note the comma",);
// two element
let two_element = (123, "elements can be of differing types");

Οι πλειάδες μπορούν να έχουν οποιονδήποτε αριθμό στοιχείων.

Πρόσβαση με αποδόμηση

Μπορείς να έχεις πρόσβαση στα στοιχεία μιας πλειάδας με αποδόμηση. Αυτό σημαίνει απλώς ότι αναθέτεις ονόματα μεταβλητών στα επιμέρους στοιχεία της πλειάδας, καταναλώνοντάς την.

let (elem1, _elem2) = two_element;
assert_eq!(elem1, 123);

Πρόσβαση με βάση τη θέση

Μπορείς επίσης να έχεις πρόσβαση στα στοιχεία μιας πλειάδας με βάση την αριθμητική θέση τους. Η αρίθμηση των θέσεων, όπως πάντα, ξεκινά από το 0.

let notation = single_element.0;
assert_eq!(notation, "note the comma");

Δομές πλειάδων

Θα σου ζητηθεί επίσης να δουλέψεις με δομές πλειάδων. Όπως οι κανονικές δομές, είναι τύποι με όνομα. Σε αντίθεση με τις κανονικές δομές, όμως, έχουν ανώνυμα πεδία. Η σύνταξή τους μοιάζει πολύ με τη σύνταξη των κανονικών πλειάδων. Είναι νόμιμο να χρησιμοποιήσεις και αποδόμηση και πρόσβαση με βάση τη θέση.

struct TupleStruct(u8, i32);
let my_tuple_struct = TupleStruct(123, -321);
let neg = my_tuple_struct.1;
let TupleStruct(byte, _) = my_tuple_struct;
assert_eq!(neg, -321);
assert_eq!(byte, 123);

Ορατότητα πεδίων

Όλα τα πεδία των ανώνυμων πλειάδων είναι πάντα δημόσια. Ωστόσο, τα πεδία των δομών πλειάδων έχουν ξεχωριστή ορατότητα, η οποία από προεπιλογή είναι ιδιωτική, ακριβώς όπως τα πεδία των κανονικών δομών. Μπορείς να κάνεις τα πεδία δημόσια με τον τροποποιητή pub, όπως ακριβώς σε μια κανονική δομή.

// fails due to private fields
mod tuple { pub struct TupleStruct(u8, i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
// succeeds: fields are public
mod tuple { pub struct TupleStruct(pub u8, pub i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }

Οδηγίες

Δουλεύεις πάνω σε ένα παιχνίδι που προορίζεται για ένα ενσωματωμένο σύστημα χαμηλής κατανάλωσης και πρέπει να γράψεις μερικές βοηθητικές συναρτήσεις που θα χρησιμοποιηθούν από άλλα μέρη του παιχνιδιού.

1. Υπολόγισε το πηλίκο και το υπόλοιπο μιας διαίρεσης

Το πηλίκο είναι το αποτέλεσμα μιας διαίρεσης.

fn divmod(dividend: i16, divisor: i16) -> (i16, i16)

Παράδειγμα:

assert_eq!(divmod(10, 3), (3, 1));

2. Διάλεξε τα στοιχεία σε άρτιες θέσεις από έναν iterator

Αυτό θα βοηθήσει να ενεργοποιήσεις μια βελτιστοποίηση του buffer οθόνης, όπως υπόσχεται το αφεντικό σου.

Οι iterator είναι στοιχεία που εκθέτουν τις μεθόδους που ορίζει το Iterator trait. Αυτή η τεκμηρίωση είναι αρκετά εκτενής, γιατί προσφέρουν πολλές μεθόδους. Ακολουθούν τα πιο σχετικά χαρακτηριστικά:

  • Ένας iterator είναι μια ροή στοιχείων αυθαίρετου μήκους
  • Έχουν μια μέθοδο enumerate που επιστρέφει μια πλειάδα (i, val) για κάθε τιμή
  • Έχουν μια μέθοδο filter που χρησιμοποιεί ένα closure για να καθορίσει αν θα αποδώσει ένα στοιχείο του iterator
  • Έχουν μια μέθοδο map που χρησιμοποιεί ένα closure για να τροποποιήσει τα στοιχεία του iterator

Επειδή η συνάρτησή σου μπορεί να τρέξει σε οποιοδήποτε είδος iterator, χρησιμοποιεί το impl για να δηλώσει ότι πρόκειται για ένα στιγμιότυπο ενός trait και όχι για ένα απλό στοιχείο. Παρομοίως, η σύνταξη <Item=T> σημαίνει απλώς ότι δεν έχει σημασία τι είδους στοιχείο παράγει ο iterator. Η συνάρτησή σου μπορεί να παράγει τα άρτια στοιχεία οποιουδήποτε iterator.

fn evens<T>(iter: impl Iterator<Item=T>) -> impl Iterator<Item=T>

Παραδείγματα:

let mut even_ints = evens(0_u8..);
assert_eq!(even_ints.next(), Some(0));
assert_eq!(even_ints.next(), Some(2));
assert_eq!(even_ints.next(), Some(4));
assert_eq!(even_ints.next(), Some(6));
let mut evens_from_odds = evens(1_i16..);
assert_eq!(evens_from_odds.next(), Some(1));
assert_eq!(evens_from_odds.next(), Some(3));
assert_eq!(evens_from_odds.next(), Some(5));
assert_eq!(evens_from_odds.next(), Some(7));

3. Υπολόγισε την απόσταση manhattan μιας θέσης από την αρχή των αξόνων

Για ευκολία στην αντιστοίχιση, έχεις ένα tuple struct Position:

struct Position(i16, i16);

Πρέπει να υλοποιήσεις μια μέθοδο manhattan στο Position που επιστρέφει την απόσταση manhattan αυτής της θέσης από την αρχή των αξόνων (Position(0, 0)).

impl Position {
    fn manhattan(&self) -> i16
}

Παράδειγμα:

assert_eq!(Position(3, 4).manhattan(), 7);
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Rust Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ενσωματωμένο παιχνίδι χαμηλής κατανάλωσης;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Rust με 99 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.