1.4 Kurs „Arduino Łopatologicznie”Generowanie liczb i Projekt podsumowujący 3 lekcje – „Gra w zgadywanie”

Dzisiaj nadszedł czas aby zebrać wszystko czego nauczyliśmy się na poprzednich lekcjach i napisać „grę w zgadywanie”. Ważne żeby pamiętać, że nie ma jednej jedynej poprawnej metody na rozwiązanie dzisiejszego zadania. Ile osób tyle może być pomysłów na napisanie kodu, ważne aby osiągnąć zamierzony cel. Oczywiście ktoś może się nie zgodzić i powiedzieć, że kod musi być wydajny, zajmować jak najmniej miejsca itp. itd… Oczywiście jest to ważne jeśli ktoś programuje komercyjnie, dla amatora i na potrzeby tego kursu nie będziemy się tym martwić bo pewnie nikt z was na początku przygody nie wykorzysta zasobów swojego Arduino do granic możliwości tym samym nie będzie potrzeby optymalizacji tego ile pamięci zajmuje nasz program.

Liczby pseudolosowe.

Aby wykonanie dzisiejszego projektu było możliwe musimy nauczyć się generować liczby losowe. W kolejnych akapitach zaprezentuję funkcję random(); pozwala ona na wygenerowanie „losowej liczby”, można również przekazać do niej warunki z jakiego przedziału ma to być liczba. Jej postać może wyglądać następująco:

  • random(max) – jako max wpisujemy liczbę, która stanowi górną granicę przedziału z jakiego losujemy.
  • random(min , max) – min i max to zmienne ograniczające zakres z jakiego będzie losowana nasza liczba.

W dokumentacji funkcji napisane jest, że zwraca wartości do max -1, w praktyce oznacza to dla nas tyle, że jeśli chcemy losować z zakresu od 1 do 100 to powinniśmy wpisać: random(1 , 101 );

W ramach ćwiczeń wypiszmy w Serial Monitorze 3 losowo wygenerowane liczby z przedziału od 1 do 500.

void setup() {
Serial.begin(9600);

}

void loop() {

//niżej przypisujemy losową liczbę do zmiennej
int losowa1 = random( 1 , 501);  
int losowa2 = random( 1 , 501);
int losowa3 = random( 1 , 501);
// wypisujemy zmienne z przypisanymi liczbami
//.print wypisuje i nie przenosi do nowej linii tak jak .println
Serial.print(losowa1);
Serial.print("  ");
Serial.print(losowa2);
Serial.print("  ");
Serial.print(losowa3);
Serial.println("");
delay(50000);

}

Teraz, wciśnij przycisk reset na swoim Arduino i obserwuj jakie liczby się wyświetlają po każdym ponownym resecie mikrokontrolera, u mnie wygląda to następująco:

screen z serial monitora

Jak widać za każdym razem Arduino losuje ten sam zestaw liczb. Teraz już wiesz czemu w tytule akapitu napisane zostało liczby pseudolosowe. Za wypisaniem losowej liczby stoi często skomplikowane lecz konkretne równanie – w tym przypadku bierze ono pod uwagę chyba datę kompilacji naszego szkicu po to, żeby wygenerować dla nas zestaw liczb. Aby zmienić losowany zestaw należało by wprowadzić nowe „ziarenko losowości” do naszego generatora. Po angielsku nazywa się to random seed i jest określeniem na zmienną wprowadzoną w celu zmiany wyniku wyliczania pseudolosowej liczby. Aby nasze ziarenko było zmienne trzeba wymyślić sposób skąd brać inną liczbę przy każdym losowaniu. Jako ciekawostkę napiszę, że aby wygenerować prawdziwie losowe liczby bierze się pod uwagę zjawiska fizyczne mało zbadane, takie gdzie nie jesteśmy jeszcze w stanie przewidzieć ich kolejnych wartości takie jak np. pomiar promieniowania kosmicznego, szumu otoczenia, rozpad radioaktywny. My nie będziemy sięgać po pomiary promieniowania otoczenia. Skorzystamy za to z niestabilnego napięcia jakie znajduje się na nie podłączonych wyjściach naszego Arduino.

Aby odczytać wartość napięcia na jednym z portów naszego mikrokontrolera wykorzystamy funkcję analogRead();

Funkcja ta pozwala odczytać wartość napięcia podawaną na wybrany pin analogowy. Dla praktyki możemy wypisać sobie wartości odczytane z pinu A0.

void setup() {
Serial.begin(9600);
}
void loop() {
//przypisujemy wartość odczytu pinu A0 do zmiennej odczyt
int odczyt = analogRead(A0);

//wypisujemy zmienną odczyt
Serial.println(odczyt);

delay(500) ;

}

Jak sami zauważyliście wartości się zmieniają – i właśnie one będą naszym idealnym i wystarczającym do projektu randomSeed();

To teraz aktualizujemy kod generujący 3 losowe liczby o funkcję randomSeed(), będzie to wyglądało tak:

void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
}

void loop() {

//niżej przypisujemy losową liczbę do zmiennej
int losowa1 = random( 1 , 501);  
int losowa2 = random( 1 , 501);
int losowa3 = random( 1 , 501);
// wypisujemy zmienne z przypisanymi liczbami
//.print wypisuje i nie przenosi do nowej linii tak jak .println
Serial.print(losowa1);
Serial.print("  ");
Serial.print(losowa2);
Serial.print("  ");
Serial.print(losowa3);
Serial.println("");
delay(50000);

}

Kod funkcji randomSeed(); umieszczamy w sekcji setup aby wygenerować nowe ziarenko raz przy uruchomieniu mikrokontrolera. Ta mała porcja wiedzy na temat generowania liczb zbliżyła nas do zadania podsumowującego wszystkie lekcje.

Gra w zgadywanie liczb – Projekt 1

Przyszedł czas na wykorzystanie zgromadzonej wiedzy i napisanie gry, w której gracz będzie zgadywał losową liczbę podając wartości w Serial Monitorze.

Gra ma mieć następujące funkcje:

  1. Generowaną losową liczbę z zakresu od 1 do 200 przypisaną do zmiennej  int losowa po włączeniu Arduino.
  2. Wyświetlamy przywitanie dla gracza i prosimy aby wpisał liczbę z zakresu od 1 do 200.
  3. Gracz po wpisaniu liczby otrzymuje komunikat, że podana liczba jest zbyt niska jeśli jeśli podał za małą, lub komunikat że podana liczba jest za wysoka jeśli wpisał za wysoką w porównaniu do tego jaka została przypisana do zmiennej  losowa.
  4. Jeśli gracz odgadnie liczbę wyświetlamy komunikat, z gratulacjami.
  5. Sprawdzamy czy wpisywane liczba nie jest poza zakresem 1 – 200 oraz czy nie jest ujemna i wyświetlamy komunikat z ostrzeżeniem.
  6. Zadanie dodatkowe 1: zliczamy ilość prób odgadnięcia liczby i na koniec z gratulacjami wyświetlamy komunikat: ” Gratulacje! udało Ci się odgadnąć za X razem” w miejsce X ma się pojawić ilość prób.
  7. Zadanie dodatkowe 2: gracz podaje samodzielnie zakres liczb w jakim chce zgadywać.

Przykładowe rozwiązanie zadania znajdziecie na facebooku w przyszły piątek, powodzenia!

//rozwiązanie zadania domowego Lekcja 3 do pobrania TUTAJ

<—- Lekcja 3 Lekcja 5 —->

1 Comments

Zostaw komentarz

  1. KRZYSIEK
    Odpowiedz

    void setup() {
    Serial.begin(9600);//komunikacja
    randomSeed(analogRead(A0));//zmienna losowa

    }

    void loop() {
    int zmienna = random(1,201);

    Serial.println(„WITAJ”);
    Serial.println(„Wpisz liczbe od 1 do 200”);
    delay(3000);
    int liczba = Serial.parseInt();
    if(liczba> zmienna){
    Serial.println(„podana liczba jest za wyskoka”);
    Serial.println(„prawidlowa liczba to”);
    Serial.println(zmienna);
    Serial.println(„sprobuj jeszcze raz”);
    delay(500);
    }
    if(liczba 200){
    Serial.println(„PODANA LICZBA NIE MIESCI SIE W ZAKRESIE”);
    Serial.println(„PRAWIDLOWY ZAKRES TO OD 1 DO 200”);
    Serial.println(„SPROBUJ PONOWNIE”);
    }
    delay(2000);
    }

Odpowiedz

Twój adres e-mail nie zostanie opublikowany