• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kostki do gry w Eurobiznes / Monopoly

VPS Starter Arubacloud
0 głosów
288 wizyt
pytanie zadane 16 kwietnia 2020 w C i C++ przez elgato Nowicjusz (120 p.)

Na początku witam wszystkich ! Jestem początkujący i wymyśliłem sobie w Arduino zrobienie w celach edukacyjnych kostki do gry w Eurobiznes.Składnia kodu jest z mojej strony oczywiście do poprawy ale tak bardzo wszedłem w problem że się nie potrafię na razie skupic nad składnią i poprawnością. Program działa lecz męczy mnie jeden problem.

Zasada działania mojego programu:

Naciskam przycisk i losuję dwie kostki ( kostka 1 i kostka 2)

Jeśli wylosuje tak zwanego dubla czyli dwie te same kostki to powinienem dostać informację że jest Dubel i program ma poczekać aż znów nacisnę przycisk by przejść do drugiego losowania. W tym momencie mam problem. Udało się zrobić tak że naciskam przycisk mam losowanie z pierwszego warunku czyli kostka 1 i kostka2 jak dochodzę do drugiego warunku to dostaje informację przytrzymuję ja w DELAY i program przechodzi do ostatniego warunku czyli losowania kostka 3 i kostka4. Niby ok ale nie mogę rozgryźć jak skonstruować warunek by on poczekał znów na wciśnięcie przycisku by mógł wykonać losowanie kostką 3 i 4 wyświetlić wynik no i wrócić do początku? Oczywiście nie liczę na gotowca bo nie o to chodzi, prosiłbym o jakieś wskazówki którą droga mam podążać , przeczytałem już milion internetów ale nie wpadłem na to jakie rozwiązanie wykorzystac.

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

void setup() {
  
  lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  pinMode(8, INPUT_PULLUP); //Przycisk na pinie 8
  Serial.begin(9600);         // 
  randomSeed(analogRead(0));  // generowanie liczb psuedolosowych
  lcd.print("Kostka do gry");
  lcd.setCursor(0, 1);
  lcd.print("nacisnij i losuj");
             }

void loop() {


byte suma=0;
byte suma2=0;
byte suma3=0;
byte kostka1=random(1, 7);            //Oddzielne losowanie dla każdej kostki
byte kostka2=random(1, 7);
byte kostka3=random(1, 7);
byte kostka4=random(1, 7);
int sensorVal = digitalRead(8);           // przypisanie zmiennej dla przycisku
byte x=0;
byte y=0;
byte z=0;
if ((sensorVal == LOW) && (x == 0)) {
         
     lcd.clear();
     Serial.print(kostka1);                       // Wyswietlamy winik pierwszej kostki 
     lcd.print("Rzut: ");
     lcd.print(kostka1);
     lcd.print( " i ");
     Serial.print(" i ");
     Serial.print(kostka2);                       // Wyswietlamy wyinik drugiej kostki
     lcd.print(kostka2);
     lcd.print(" = ");
     lcd.print(kostka2+kostka1);                  // suma kostki 1 i 2
     lcd.setCursor(0, 1);
     lcd.print("Nastepny rzut...");
     Serial.println(kostka1+kostka2);             // Wyświetlamy sumę dwóch kostek
     suma=kostka1+kostka2;                        // przypisujemy do zmiennej SUMA sumę kostek z pierwszego rzutu
     delay(600);
     x=1;
     
  } 
         
             if (sensorVal == LOW && kostka1==kostka2 && y == 0) 
              {                   // jeśli kostki 1 i 2 mają te same liczby wypełniamy poniższy warunek
               
               Serial.println("DUBEL ! Rzucasz ponownie"); //pokazujemy info o potrzebnym drugim rzucie
               lcd.clear();
               lcd.setCursor(0, 0);
               lcd.print(" DUBEL ");
               lcd.setCursor(0, 1);
               lcd.print("Rzucasz ponownie");
               lcd.setCursor(0, 0);
               lcd.setCursor(0, 1);
               y=1;
               delay(1500);
                                 if (sensorVal == LOW && kostka1==kostka2)
                              {
                                 lcd.clear();
                                 Serial.print("rzut po dublu");
                                 Serial.print(kostka3);                       // Wyswietlamy winik pierwszej kostki 
                                 lcd.print("Rzut1: ");
                                 lcd.print(kostka1);
                                 lcd.print( "i");
                                 Serial.print("i");
                                 Serial.print(kostka2);                       // Wyswietlamy wyinik drugiej kostki
                                 lcd.print(kostka2);
                                 lcd.print("=");
                                 lcd.print(kostka2+kostka1);
                                 Serial.print(" i ");
                                 Serial.print(kostka4);                       // Wyswietlamy wyinik drugiej kostki
                                 lcd.setCursor(0, 1);
                                 lcd.print("Rzut2: ");
                                 lcd.print(kostka3);
                                 lcd.print("i");
                                 lcd.print(kostka4);
                                 Serial.print(" suma kostki drugiej = ");
                                 lcd.print("=");
                                 lcd.print(kostka3+kostka4);
                                 lcd.print("=");
                                 lcd.print(kostka1+kostka2+kostka3+kostka4);
                                 Serial.println(kostka3+kostka4);             // Wyświetlamy sumę dwóch kostek
                                 suma2=kostka3+kostka4;                        // przypisujemy do zmiennej SUMA sumę kostek z pierwszego rzutu
                                 delay(600);
     }}
 }

          
                    
                               




 

 

komentarz 16 kwietnia 2020 przez Michał Gibas Pasjonat (19,610 p.)
Zrób tablice na wartości kostek, stwórz pętle do wypisywania i losowania wartości, opakuj to w jakieś funkcje (jeśli masz problemy z pętlami i innymi elementami języka, to najpierw przed robieniem takich projektów naucz się porządnie tego języka i nie wskakuj od razu na takie głębiny), zmień nazwy zmiennych na angielskie, bo te kostka1, kostka2, zagnieżdżone if'y i to wszystko boli w oczy, pomijając już to że kodu w ogóle nie da się czytać... Najpierw przepisz porządnie ten kod, trochę się zastanów nad nim (żeby było mało, ładnie, zgrabnie i żeby działało) i wtedy dopiero proś o pomoc, bo nikt nie będzie tracił czasu na przeglądanie takiego nieczytelnego kodu... A i jeszcze taka mała rada: uważam (i to nie tylko moja opinia), że maksymalna "głębokość" scopa (czy ile masz np. zagnieżdżonych if'ów czy pętli itp.) - pomijając scope funkcji - nie powinna być nigdy większa niż 2. U ciebie są aż 3 zagnieżdżone if'y. No i formatowanie przydałoby się poprawić bo te nierówne wcięcia też trochę straszą. Mam nadzieję, że nie zniechęciłem, bo nie taki był mój cel, ale trzeba wskazywać błędy i je poprawiać, tylko w ten sposób można nauczyć się programowania.

Pozdrawiam!
komentarz 16 kwietnia 2020 przez elgato Nowicjusz (120 p.)
Dziękuję za odpowiedź. Nie czuję się zniechęcony wręcz przeciwnie, czuję się bardziej zmotywowany i dziękuję za wytykanie błędów bo to ważna rzecz a niestety nie ma kto na początku wytykać błędów. Więc wracam do pracy i kiedyś w tym wątku się odezwę.

1 odpowiedź

0 głosów
odpowiedź 16 kwietnia 2020 przez DawidK Nałogowiec (37,910 p.)

Może Ci pomoże, robione na shieldzie wiec jest lekka różnica w odczytywaniu z przycisków, i skasowałem wszystkie elementy do wyświetlania komunikatów na serial monitorze, ale generalnie można to rozwiązać np tak:

- tworzysz zmienną określającą czy padł dubel (na początku jako fałsz)

- nasłuchujesz przycisku

- jeżeli został wciśniety to przestajesz go nasłuchiwać, losujesz kostki (1 i 2) i wyświetlasz komunikaty

- następnie jeżeli padł dubel zmieniasz wartość dubel na true, wyświetlasz komunikaty i zaczynasz nasłuchiwać przycisku dopóki użytkownik nie wyrzuci drugiego rzutu po dublu - wtedy wyświetlasz komunikaty i przypisujesz dubel jako false.

Generalnie większość miałeś zrobione - przypuszczam, że kontrolowanie dubli chciałeś zrobić zmiennymi x,y,z

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup(){
   lcd.begin(16, 2);
   lcd.setCursor(0,0);
   lcd.print("Kostka do gry");
   lcd.setCursor(0, 1);
   lcd.print("nacisnij i losuj");
   randomSeed(analogRead(0));
}

int sygnal_przycisk = 0;
bool dubel = false;

byte kostka1;
byte kostka2;
byte kostka3;
byte kostka4;

void loop(){
   dubel = false;
   sygnal_przycisk = analogRead(0); 
   if (sygnal_przycisk < 850 && sygnal_przycisk >650) {
      sygnal_przycisk = 0;
      kostka1=random(1,7);
      kostka2=random(1,7);
      lcd.clear();
      lcd.print("Rzut: ");
      lcd.print(kostka1);
      lcd.print( " i ");
      lcd.print(kostka2);
      lcd.print(" = ");
      lcd.print(kostka2+kostka1);
      lcd.setCursor(0, 1);
      lcd.print("Nastepny rzut...");
      delay(600);
      if (kostka1 == kostka2){
          dubel = true;
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(" DUBEL ");
          lcd.setCursor(0, 1);
          lcd.print("Rzucasz ponownie");
          delay(600);
          do {
              sygnal_przycisk = analogRead(0);
              if (sygnal_przycisk < 850 && sygnal_przycisk >650) {
                  kostka3=random(1,7);
                  kostka4=random(1,7);
                  lcd.clear();
                  lcd.print("Rzut1: ");
                  lcd.print(kostka1);
                  lcd.print( "i");
                  lcd.print(kostka2);
                  lcd.print("=");
                  lcd.print(kostka2+kostka1);
                  lcd.setCursor(0, 1);
                  lcd.print("Rzut2: ");
                  lcd.print(kostka3);
                  lcd.print("i");
                  lcd.print(kostka4);
                  lcd.print("=");
                  lcd.print(kostka3+kostka4);
                  lcd.print("=");
                  lcd.print(kostka1+kostka2+kostka3+kostka4);
                  delay(600);
                  dubel = false;
              }
          } while (dubel == true);
      }
   }
}

Fragmenty

(sygnal_przycisk < 850 && sygnal_przycisk >650)

wynikają z korzystania z shielda u Ciebie to sensorVal

komentarz 16 kwietnia 2020 przez elgato Nowicjusz (120 p.)
Dokładnie próbowałem je w ten sposób kontrolować za pomocą xyz i przepraszam że nie usunąłem tego z kodu. Kurcze, bardzo dziękuję za wszystkie podpowiedzi bo teraz wiem w którą stronę iść. DawidK dziękuję za konstruktywne podejście i przeanalizowanie tego "kodu". Oczywiście następne będą czytelniejsze.

Podobne pytania

+1 głos
1 odpowiedź 164 wizyt
0 głosów
1 odpowiedź 2,062 wizyt
pytanie zadane 25 grudnia 2016 w Mikrokontrolery przez szerwi Użytkownik (620 p.)
0 głosów
2 odpowiedzi 87 wizyt

92,452 zapytań

141,262 odpowiedzi

319,078 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...