Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 2 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.14
Prihlásený: 31.03.24
Príspevky: 450
Témy: 198
Bydlisko: Poprad-okolie
Príspevok NapísalOffline : 22.08.2019 13:42

Ahoj, rád by som dnes predstavil svoju implementáciu pre hru Mastermind, ktorá je aj známa ako Logik. V tejto implementácii hráč neháda farby a ich poradie ako je to v originálnej - stolnej verzii, ktorú hrajú dvaja hráči, ale háda čísla a ich poradie. Je nutné zdôrazniť, že čísla sa nemôžu opakovať. V úlohe určenia čísel a ich poradia je Arduino, ktoré ich vygeneruje.

Arduino slúži ďalej ako počítadlo pokusov a prijíma logické vstupy prostredníctvom 5 tlačidiel, ktoré sa spínajú proti zemi (INPUT_PULLUP). Tlačidlami sa zadáva používateľský vstup v podobe čísel na pozície. Posledným tlačidlom sa vstup potvrdí a odošle do Arduina. Na LCD displeji je okrem aktuálneho používateľského vstupu aj vyobrazenie výsledku.
Mastermind - Logik cez Arduino a LCD
Ak používateľ neuhádne číslo a ani pozíciu, na displeji sa na príslušnej pozícii zobrazí -, ak uhádne číslo s pozíciou, zobrazí sa =, ak uhádne číslo, ale nie pozíciu, zobrazí sa C. Pre vývojárske účely je možné použiť DEBUG makro, ktoré je nutné odkomentovať. V princípe len zobrazí na displej hľadané číslo, ak chce vývojár odtestovať funkčnosť jednotlivých prvkov a overiť, či hra skončí po prekročení pokusov, alebo uhádnutí hľadaného čísla.
Mastermind - Logik cez Arduino a LCD
Hra je limitovaná na 10 pokusov hráča. V prípade prekročenia počtu pokusov sa hra ukončí s hláškou o prehre hráča. V prípade, že hráč uhádne cieľové číslo, hra sa končí s výpisom hlášky o výhre hráča. Hra nie je časovo obmedzená. Pri hre sa odporúča využiť aj ceruzku a papier na písanie si vstupov, čo môže viesť k štatistickej výhode pri hľadaní cieľového čísla.
Mastermind - Logik cez Arduino a LCD
Schéma zapojenia pre Mastermind:
Mastermind - Logik cez Arduino a LCD
Knižnica pre LCD displej: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Program pre Mastermind:
Kód:
/*|----------------------------------------------------------------------------------------------------|*/
/*|SKETCH PRE MASTERMIND IMPLEMENTACIU                                                            |*/
/*|VYHOTOVIL: MARTIN CHLEBOVEC                                                                          |*/
/*|WEB: https://arduino.php5.sk/mastermind-arduino.php                                       |*/
/*|Doska: Arduino Uno / AtMega328P                                                                        |*/
/*|MAXIMALNY POCET POKUSOV: 10                                                                           |*/
/*|POCET VSTUPOV: 5X PUSHBUTTON - SPINACIE TLACIDLA                                         |*/
/*|VYGENEROVANE 4-CISLIE: KAZDE CISLO JE ROZNE V ROZSAHU 0-9 BEZ OPAKOVANIA!|*/
/*|PRE ZOBRAZENIE VYGENEROVANEHO CISLA POUZITE DEBUG (ODKOMENTOVAT)         |*/
/*|------------------------------------------------------------------------------------------------------|*/
/*|VYSVETLIVKY PRE ZNAČKY NA DISPLEJI:                                                                  |*/
/*| C --> uhadnute cislo na inej pozicii                                                                        |*/
/*| = --> uhadnute cislo aj s poziciou (SPRAVNE CISLO!)                                                |*/
/*| - --> neuhadnute cislo, ani pozicia                                                                          |*/
/*|-------------------------------------------------------------------------------------------------------|*/

//#define DEBUG //odkomentuj pre DEBUG INFO (ZOBRAZENIE HLADANEHO CISLA)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); //skúsiť aj adresu 0x27

const int buttonPin1 = 6;
const int buttonPin2 = 5;
const int buttonPin3 = 4;
const int buttonPin4 = 3;
const int buttonPin5 = 2;

int cislo1 = 0;
int cislo2 = 0;
int cislo3 = 0;
int cislo4 = 0;

int cielovecislo1 = 0;
int cielovecislo2 = 0;
int cielovecislo3 = 0;
int cielovecislo4 = 0;

int buttonState1 = HIGH;
int buttonState2 = HIGH;
int buttonState3 = HIGH;
int buttonState4 = HIGH;
int buttonState5 = HIGH;

int lastButtonState1 = HIGH;
int lastButtonState2 = HIGH;
int lastButtonState3 = HIGH;
int lastButtonState4 = HIGH;
int lastButtonState5 = HIGH;

unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 0;
unsigned long lastDebounceTime4 = 0;
unsigned long lastDebounceTime5 = 0;
unsigned long debounceInterval = 50;
int pokus = 0;

void setup() {
  lcd.begin(); //incializacia displeja na I2C zbernici
  lcd.backlight(); //zapnutie podsvietenia
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  pinMode(buttonPin5, INPUT_PULLUP);
  randomSeed(analogRead(0));
  lcd.setCursor(0, 0); //nastav kurzor pre zapis na 1. riadok, 1. stlpec
  lcd.print("ZADANE CISLO: 0000");
  generuj_cisla();
#ifdef DEBUG
  lcd.setCursor(0, 2);
  lcd.print("DEBUG ON:");
  lcd.setCursor(0, 3);
  lcd.print("HLADANE CISLO: ");
  lcd.print(cielovecislo1);
  lcd.print(cielovecislo2);
  lcd.print(cielovecislo3);
  lcd.print(cielovecislo4);
#endif
}

void loop() {
  if (pokus >= 10) {
    lcd.setCursor(0, 2);
    lcd.print("PREHRALI STE!");
    lcd.setCursor(0, 3);
    lcd.print("KONIEC HRY          ");
    while (1);
  } else {
    int reading1 = digitalRead(buttonPin1);
    int reading2 = digitalRead(buttonPin2);
    int reading3 = digitalRead(buttonPin3);
    int reading4 = digitalRead(buttonPin4);
    int reading5 = digitalRead(buttonPin5);

    if (reading1 != lastButtonState1) {
      lastDebounceTime1 = millis();
    }

    if (reading2 != lastButtonState2) {
      lastDebounceTime2 = millis();
    }

    if (reading3 != lastButtonState3) {
      lastDebounceTime3 = millis();
    }

    if (reading4 != lastButtonState4) {
      lastDebounceTime4 = millis();
    }

    if (reading5 != lastButtonState5) {
      lastDebounceTime5 = millis();
    }

    if ((millis() - lastDebounceTime1) > debounceInterval) {
      if (reading1 != buttonState1) {
        buttonState1 = reading1;
        if (buttonState1 == HIGH) {
          cislo1++;
          if (cislo1 > 9) {
            cislo1 = 0;
          }
        }
      }
      updateLCD();
    }

    if ((millis() - lastDebounceTime2) > debounceInterval) {
      if (reading2 != buttonState2) {
        buttonState2 = reading2;
        if (buttonState2 == HIGH) {
          cislo2++;
          if (cislo2 > 9) {
            cislo2 = 0;
          }
        }
      }
      updateLCD();
    }

    if ((millis() - lastDebounceTime3) > debounceInterval) {
      if (reading3 != buttonState3) {
        buttonState3 = reading3;
        if (buttonState3 == HIGH) {
          cislo3++;
          if (cislo3 > 9) {
            cislo3 = 0;
          }
        }
      }
      updateLCD();
    }

    if ((millis() - lastDebounceTime4) > debounceInterval) {
      if (reading4 != buttonState4) {
        buttonState4 = reading4;
        if (buttonState4 == HIGH) {
          cislo4++;
          if (cislo4 > 9) {
            cislo4 = 0;
          }
        }
      }
      updateLCD();
    }

    if ((millis() - lastDebounceTime5) > debounceInterval) {
      if (reading5 != buttonState5) {
        buttonState5 = reading5;
        if (buttonState5 == HIGH) {
          pokus++;
          updateLCD();
          over_cisla();
          cislo1 = 0;
          cislo2 = 0;
          cislo3 = 0;
          cislo4 = 0;
        }
      }
    }
    lastButtonState1 = reading1;
    lastButtonState2 = reading2;
    lastButtonState3 = reading3;
    lastButtonState4 = reading4;
    lastButtonState5 = reading5;
  }
}

void updateLCD() {
  lcd.setCursor(14, 0);
  lcd.print(cislo1);
  lcd.print(cislo2);
  lcd.print(cislo3);
  lcd.print(cislo4);
  lcd.setCursor(0, 1);
  lcd.print("POKUS: ");
  lcd.print(pokus);
}

void generuj_cisla() {
  cielovecislo1 = random(0, 9);
  cielovecislo2 = random(0, 9);
  while (cielovecislo2 == cielovecislo1) {
    cielovecislo2 = random(0, 9);
  }
  cielovecislo3 = random(0, 9);
  while ((cielovecislo3 == cielovecislo1) || (cielovecislo3 == cielovecislo2)) {
    cielovecislo3 = random(0, 9);
  }
  cielovecislo4 = random(0, 9);
  while ((cielovecislo4 == cielovecislo1) || (cielovecislo4 == cielovecislo2) || (cielovecislo4 == cielovecislo3)) {
    cielovecislo4 = random(0, 9);
  }
}

void over_cisla() {
  if (cislo1 == cielovecislo1) {
    lcd.setCursor(10, 1);
    lcd.print("="); //UHADNUTE CISLO VRATANE POZICIE
  } else if ((cislo1 == cielovecislo2) || (cislo1 == cielovecislo3) || (cislo1 == cielovecislo4)) {
    lcd.setCursor(10, 1);
    lcd.print("C"); //UHADNUTE CISLO BEZ POZICIE
  } else {
    lcd.setCursor(10, 1);
    lcd.print("-"); //NEUHADNUTE CISLO, ANI POZICIA
  }

  if (cislo2 == cielovecislo2) {
    lcd.setCursor(11, 1);
    lcd.print("="); //UHADNUTE CISLO VRATANE POZICIE
  } else if ((cislo2 == cielovecislo1) || (cislo2 == cielovecislo3) || (cislo2 == cielovecislo4)) {
    lcd.setCursor(11, 1);
    lcd.print("C"); //UHADNUTE CISLO BEZ POZICIE
  } else {
    lcd.setCursor(11, 1);
    lcd.print("-"); //NEUHADNUTE CISLO, ANI POZICIA
  }

  if (cislo3 == cielovecislo3) {
    lcd.setCursor(12, 1);
    lcd.print("="); //UHADNUTE CISLO VRATANE POZICIE
  } else if ((cislo3 == cielovecislo1) || (cislo3 == cielovecislo2) || (cislo3 == cielovecislo4)) {
    lcd.setCursor(12, 1);
    lcd.print("C"); //UHADNUTE CISLO BEZ POZICIE
  } else {
    lcd.setCursor(12, 1);
    lcd.print("-"); //NEUHADNUTE CISLO, ANI POZICIA
  }

  if (cislo4 == cielovecislo4) {
    lcd.setCursor(13, 1);
    lcd.print("="); //UHADNUTE CISLO VRATANE POZICIE
  } else if ((cislo4 == cielovecislo1) || (cislo4 == cielovecislo2) || (cislo4 == cielovecislo3)) {
    lcd.setCursor(13, 1);
    lcd.print("C"); //UHADNUTE CISLO BEZ POZICIE
  } else {
    lcd.setCursor(13, 1);
    lcd.print("-"); //NEUHADNUTE CISLO, ANI POZICIA
  }

  if ((cislo1 == cielovecislo1) && (cislo2 == cielovecislo2) && (cislo3 == cielovecislo3) && (cislo4 == cielovecislo4)) {
    lcd.setCursor(0, 2);
    lcd.print("VYHRALI STE!");
    lcd.setCursor(0, 3);
    lcd.print("KONIEC HRY          ");
    while (1);
  }
}


Offline

Užívateľ
Užívateľ
Mastermind - Logik cez Arduino a LCD

Registrovaný: 28.12.14
Prihlásený: 08.02.23
Príspevky: 690
Témy: 9
Bydlisko: Detva
Príspevok NapísalOffline : 23.08.2019 15:37

Keby si to spravil pred 3 mesiacmi tak by si mi veľmi pomohol so zadaním. v podstate je to jednoduchy program ale keď si na programovanie drevo :D IT mi dalo jednu vec a tou je to že ja a programovanie sa radi nemáme tak som radšej zmenil odbor a zatiaľ som spokojný







_________________
|CPU: I5-6600K 4.4GHz|MB: Asus Z170 PRO GAMING|RAM: Kingston 16GB DDR4 2400MHz HyperX Fury|GPU: GAINWARD GTX 1070 Phoenix GS|
SSD: Samsung 850 EVO 250GB|HDD: WD Blue 1TB|PSU: EVGA SuperNOVA 550 G2|CASE: NZXT H440|COOLER: SCYTHE Ninja 4|
AUDIO: DAC/AMP: Aune X1s| Headphones: Philips SHP 9500s| AMP: Onkyo A-9010| Speakers: Wharfedale Daimond 220|
MOBILE: Sony Xperia Z2, OnePlus 5T
LAPTOP: Asus UX430UN - i5 8250u| 8GB DDR3LP| 256GB SSD| MX150 2GB
Odpovedať na tému [ Príspevkov: 2 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Hasičské stopky cez Arduino s displejom

v Články

0

1869

22.12.2018 22:52

martinius96 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ovládanie relé cez Arduino s webaplikáciou

v Články

0

1416

10.02.2019 0:23

martinius96 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Airsoft DOMINATOR - Tlačidlový - Arduino + I2C LCD

v Články

0

694

21.02.2020 23:03

martinius96 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Kaskáda posuvných registrov 74HC595 ovládaná cez Arduino

v Články

0

727

23.04.2020 1:06

martinius96 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. DOMINATOR cez Arduino pre Airsoft / Paintball / Nerf Wars

v Články

2

2415

30.11.2018 21:41

eon5 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Arduino a TFT LCD 3.5'' ILI9488 displej MCUFRIEND

v Mikropočítače

3

944

26.11.2020 22:26

zemepan Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako napojit digisatelit cez SCART na CRT alebo LCD cez VGA

v Monitory, televízory a projektory

0

1290

07.03.2007 6:28

baxisnv Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. widescreen LCD cez D-SUB

v Monitory, televízory a projektory

7

818

04.07.2007 21:17

black.colour Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pripojenie LCD cez HDMI/DVI redukciu

v ATI/AMD grafické karty

4

1076

17.08.2010 13:01

M0f0 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Prepojenie HD5750 a LCD TV cez HDMI

v ATI/AMD grafické karty

8

1156

03.02.2011 21:44

Vseved Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jvc tv lcd cez dvi ako na to?

v TV

2

764

15.12.2008 6:59

tommy9467 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Neukazuje mi hodnoty z MB na LCD cez LPT

v Modifikácie, návody a projekty

19

1977

11.10.2007 11:35

ricci Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. 19" LCD sa pripája k PC cez USB

v Novinky

1

451

22.02.2007 15:04

maross Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Blikanie LCD TV pri prepojení s PC cez VGA

v Monitory, televízory a projektory

0

546

22.12.2011 20:17

lomjan Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Kvalita obrazu pri prehravani cez usb port na Lcd tv

v TV

2

887

30.01.2011 20:08

cape Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. PC pripojeny cez HDMI na LCD TV PHILIPS 37PFL5604H/12

v Monitory, televízory a projektory

18

1966

30.12.2009 21:52

paulix Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra