• 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

0 głosów
394 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,630 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ź 315 wizyt
0 głosów
1 odpowiedź 2,406 wizyt
pytanie zadane 25 grudnia 2016 w Mikrokontrolery przez szerwi Użytkownik (620 p.)
0 głosów
2 odpowiedzi 239 wizyt

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...