Bingo sketch

algemene C code
Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Bingo sketch

Berichtdoor Pexy » 17 Okt 2019, 11:14

Hallo beste forumleden.

Ik heb een letter bingo sketch gevonden die random letters genereert (https://forum.arduino.cc/index.php?topic=557022.0).
Nu wil ik deze sketch graag aangepast hebben naar een 75 nummer bingo.
Graag vraag ik om jullie hulp.

Hieronder de letter bingo sketch:
cpp code
const byte generate_Button = 2;
const byte reset_Button = 3; // not required anymore but i left it in for you
char bingoArray[26];
byte arrayCount;
byte failCount;

void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
Serial.println(F("Bingo generator started\n"));
// make the pushbutton's pin an input:
pinMode(generate_Button, INPUT_PULLUP);
pinMode(reset_Button, INPUT_PULLUP);
randomSeed(analogRead(0));
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin: ADD DEBOUNCE !!!!!!!!!!!!!!!!!
if (digitalRead(reset_Button) == LOW) {
resetBingo();
delay(500);
}
if (digitalRead(generate_Button) == LOW) {
generate();
delay(500);
}
}

void generate() {
bool confirmed = true;
byte randomValue;
if (arrayCount < 26) {
if (failCount < 20) {
randomValue = random(65, 91);
}
else if (failCount <= 45) {
randomValue = char(failCount + 45);
//Serial.print(F("\nBackup value = "));
//Serial.println(char(randomValue));
}
for (byte i = 0; i < sizeof(bingoArray); i++) {
if (char(randomValue) != bingoArray[i] && confirmed) {
confirmed = true;
}
else if (confirmed) {
//Serial.print(F("\nSkipped repeat letter "));
//Serial.print(char(randomValue));
//Serial.print(F("\n fail Count: "));
//Serial.println(failCount);
failCount++;
confirmed = false;
}
}
if (confirmed) {
bingoArray[arrayCount] = char(randomValue);
Serial.print(F("\nThe letter generated is: "));
Serial.print(char(randomValue));
//Serial.print(F("\nArray position: "));
//Serial.print(arrayCount);
arrayCount++;
failCount = 0;
}
else {
generate();
}
}
else {
resetBingo();
}
}

void resetBingo() {
bool firstRun = true;
Serial.println(F("\n\nBingo array in full: "));
for (byte i = 0; i < sizeof(bingoArray); i++) {
if (bingoArray[i] != 0) {
if (!firstRun) {
Serial.print(F(", "));
}
Serial.print(bingoArray[i]);
bingoArray[i] = 0;
firstRun = false;
}
}
arrayCount = 0;
Serial.println("\nReset");
}

Advertisement

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Bingo sketch

Berichtdoor zuid » 17 Okt 2019, 16:58

Heb je zelf al enig idee hoe het nu werkt?
Zo niet probeer dan eerst eens overal waar nu //Serial.print staat de // weg te halen.
Op die manier zie je in ieder geval wat er zoal is bedacht door de maker.
Helpen is leuk maar ik verwacht wel dat je aangeeft WAAR je vastloopt.

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Bingo sketch

Berichtdoor Pexy » 17 Okt 2019, 20:26

Ik heb al wel een idee hoe het werkt, alleen snap ik een aantal zaken niet.
Zoals wat doet de failCount?

Er staat if (failCount < 20) en
else if (failCount <= 45) {
randomValue = char(failCount + 45);
Dat stuk begrijp ik echt niet.

En waarom randomValue = random(65, 91); en niet randomValue = random(1, 27); ?
Verder snap ik dat de bingoArray[26]; dan bingoArray[74]; moet zijn.
En dat de char moet verdwijnen aangezien dat met letters te maken heeft.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Bingo sketch

Berichtdoor shooter » 17 Okt 2019, 21:21

65 is de A
en 90 is de Z
dat heeft te maken met de ascii tabel.
die failcount heeft te maken met dubbele letters.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Bingo sketch

Berichtdoor Koepel » 17 Okt 2019, 21:31

Op Wikipedia staat een korte beschrijving: https://nl.wikipedia.org/wiki/Bingo_(spel).
Dat is nog best ingewikkeld om in een sketch te verwerken.

Het probleem is dat een getal maar één keer voor mag komen.
Heb je nagedacht welke oplossingen daar voor zijn ?

Ik dacht dat dit een standaard wiskundig probleem is, maar ik kan niet op de naam komen, dus ik weet ook de standaard oplossing niet :roll:

In de sketch wordt een willekeurig getal gekozen, en de getallen worden onthouden.
Bij een nieuw willekeurig getal wordt gekeken of die er al bij zit. Zo ja, dan wordt 'failcount' opgehoogd en roept 'generate()' zichzelf weer aan :!:
Als dat teveel gebeurt, dan loopt de stack vol.
Het stukje dat jij niet begrijpt is een nogal gebrekkige manier om te voorkomen dat de stack vol raakt, en dan wordt een noodgreep toegepast voor een willekeurig getal met "randomValue = char(failCount + 45)", maar eerlijk gezegd begrijp ik die regel ook niet :o Het lijkt bedoeld om aan zomaar een getal te komen voor het geval de random() vast loopt. Maar de random() functie zit goed in elkaar en levert altijd allerlei verschillende getallen.

De standaard wiskundige manier ken ik niet, maar er is een andere oplossing. Bijvoorbeeld een array vullen met getallen van 1 tot 75, en dan steeds twee getallen op een willekeurige positie met elkaar verwisselen. Na een paar honderd keer verwisselen is het resultaat misschien voldoende willekeurig.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Bingo sketch

Berichtdoor zuid » 18 Okt 2019, 09:35

Zoals Koepel schrijft wordt zodra de tabel (bijna) vol is en er 20 keer geen nieuwe letter gevonden is, de instructie char(failCount + 45) gebruikt.
Dit is geen random letter maar bij de 20ste fout de letter A vervolgens bij 21 de letter B enz..
Er wordt hiermee na 19 random pogingen de eerste letter gezocht die nog vrij is.

Als je nog opzoek bent naar een oplossing voor de 75 nummer bingo zijn hiervoor op internet ook nog voorbeelden te vinden door te zoeken naar Arduino bingo.
m.v.g. Nico

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Bingo sketch

Berichtdoor Pexy » 18 Okt 2019, 11:37

Oke jammer dan laat ik deze sketch voor wat het is, dacht dat het redelijk simpel zou zijn om het om te bouwen naar 75 getallen ipv 26 letters.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Bingo sketch

Berichtdoor zuid » 18 Okt 2019, 12:54

Opgeven? Elk programma dat door een ander geschreven is zal altijd enige moeite kosten om te begrijpen.
Ik zou in dit geval bijvoorbeeld het ombouwen in drie stappen doen.
1. In plaats van letters uitvier A t/m Z de getallen 65 t/m 91.
2. De reeks getallen wijzigen in 1 t/m 26
3. Vervolgens de reeks vergroten naar 1 t/m 75.
Vragen bij problemen kan altijd.

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Bingo sketch

Berichtdoor Pexy » 18 Okt 2019, 13:54

Oke ik heb een poging gedaan en het lijkt er bijna op, maar volgens mijn gevoel doe ik het toch erg fout ivm ik wel 75 regels uitkomsten krijg alleen zie ik dan ook het getal 76 en 77 voorkomen in de uitkomsten?

cpp code
const byte generate_Button = 2;
const byte reset_Button = 3; // not required anymore but i left it in for you
byte bingoArray[75];
byte arrayCount;
byte failCount;

void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
Serial.println(F("Bingo generator started\n"));
// make the pushbutton's pin an input:
pinMode(generate_Button, INPUT_PULLUP);
pinMode(reset_Button, INPUT_PULLUP);
randomSeed(analogRead(0));
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin: ADD DEBOUNCE !!!!!!!!!!!!!!!!!
if (digitalRead(reset_Button) == LOW) {
resetBingo();
delay(500);
}
if (digitalRead(generate_Button) == LOW) {
generate();
delay(500);
}
}

void generate() {
bool confirmed = true;
byte randomValue;
if (arrayCount < 75) {
if (failCount < 20) {
randomValue = random(1, 76);
}
else if (failCount <= 45) {
randomValue = char(failCount + 45);
//Serial.print(F("\nBackup value = "));
//Serial.println(char(randomValue));
}
for (byte i = 0; i < sizeof(bingoArray); i++) {
if (char(randomValue) != bingoArray[i] && confirmed) {
confirmed = true;
}
else if (confirmed) {
//Serial.print(F("\nSkipped repeat letter "));
//Serial.print(char(randomValue));
//Serial.print(F("\n fail Count: "));
//Serial.println(failCount);
failCount++;
confirmed = false;
}
}
if (confirmed) {
bingoArray[arrayCount] = char(randomValue);
Serial.print(F("\nThe letter generated is: "));
Serial.print(randomValue);
//Serial.print(F("\nArray position: "));
//Serial.print(arrayCount);
arrayCount++;
failCount = 0;
}
else {
generate();
}
}
else {
resetBingo();
}
}

void resetBingo() {
bool firstRun = true;
Serial.println(F("\n\nBingo array in full: "));
for (byte i = 0; i < sizeof(bingoArray); i++) {
if (bingoArray[i] != 0) {
if (!firstRun) {
Serial.print(F(", "));
}
Serial.print(bingoArray[i]);
bingoArray[i] = 0;
firstRun = false;
}
}
arrayCount = 0;
Serial.println("\nReset");
}

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Bingo sketch

Berichtdoor zuid » 18 Okt 2019, 15:16

Het stukje code waar we al eerder over hadden vergt ook nog wat aanpassing.
Code: Alles selecteren
 if (failCount < 20) {
      randomValue = random(1, 76);
    }
    else if (failCount <= 45) {
      randomValue = char(failCount + 45);
      //Serial.print(F("\nBackup value =  "));
      //Serial.println(char(randomValue));
    }

Na 20x random proberen moet de noodprocedure weer gaan werken.
In de letter variant A tm Z (ASCII waarde 65 t/m 91) de letter ASCII waarde werd gevonden door failCount te verhogen met 45 (20+45 , 21+45 , 22+45 enz.)
Gestopt werd bij een failCount <= 45 (dus na 26 doorlopen van 20 t/m 45)
De getal variant zal er dus anders uit moeten zien.
Bij failCount 20 hoort nu getal 1, dus failCount -19.
Code: Alles selecteren
 if (failCount < 20) {
      randomValue = random(1, 76);
    }
    else if (failCount <= 94) {
      randomValue = char(failCount - 19);
      //Serial.print(F("\nBackup value =  "));
      //Serial.println(char(randomValue));
    }

Stoppen na 75 doorlopen bij failCount <= 94.
(even snel opgeschreven misschien hier of daar een getal één hoger of lager :) )
m.v.g. Nico

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten