Spelletje Tic-tac-toe, hulp nodig
18 berichten
• Pagina 2 van 2 • 1, 2
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: Spelletje Tic-tac-toe, hulp nodig
@Koepel,
Geweldig dank je wel. Ik heb ook weer wat bijgeleerd over de seriele monitor, je bent tenslotte nooit te oud om wat te leren nietwaar? Ik ga nu kijken hoe ik jouw sketch kan implementeren met de hardware. Goed weekend, koud bij jullie lees ik op internet. Sterkte. Dat mis je nou hier wel eens.
Groet, Hans
Geweldig dank je wel. Ik heb ook weer wat bijgeleerd over de seriele monitor, je bent tenslotte nooit te oud om wat te leren nietwaar? Ik ga nu kijken hoe ik jouw sketch kan implementeren met de hardware. Goed weekend, koud bij jullie lees ik op internet. Sterkte. Dat mis je nou hier wel eens.
Groet, Hans
Advertisement
Re: Spelletje Tic-tac-toe, hulp nodig
Wanneer je mijn sketch wilt gaan gebruiken, begin dan met een functie die een cijfer terug geeft van de tegel die zojuist is ingedrukt (dus met State Change Detection). Het is zelfs mogelijk om beide (de tegels en de seriële monitor) tegelijkertijd te gebruiken. Dat kan handig zijn om te testen.
Dus alleen een functie die de knoppen leest. Niet meteen de shift registers er bij. Dan zet ik mijn gefronste wenkbrauwen op en dan kijk ik eens naar die functie
Wanneer je daar een kleine test-sketch omheen bouwt, dan kun dat misschien al testen met de tegels of anders met losse draadjes en een breadboard. Pak hij de tweede als er al één is ingedrukt ?
Dus alleen een functie die de knoppen leest. Niet meteen de shift registers er bij. Dan zet ik mijn gefronste wenkbrauwen op en dan kijk ik eens naar die functie
Wanneer je daar een kleine test-sketch omheen bouwt, dan kun dat misschien al testen met de tegels of anders met losse draadjes en een breadboard. Pak hij de tweede als er al één is ingedrukt ?
Re: Spelletje Tic-tac-toe, hulp nodig
Om de tegels te laten knipperen als iemand heeft gewonnen is het nodig om te weten welke tegels dat zijn.
Daarvoor heb ik alle combinaties die kunnen winnen in een tabel gezet. De functie die kijkt of iemand heeft gewonnen geeft de index terug in die tabel. Vervolgens is in die tabel op te zoeken welke tegels het zijn.
Dit is een test-sketch om mijn idee te testen.
Voor de test zet vaste waarden in de 'tile' array, en die wijzig ik steeds om verschillende mogelijkheden te proberen.
Daarvoor heb ik alle combinaties die kunnen winnen in een tabel gezet. De functie die kijkt of iemand heeft gewonnen geeft de index terug in die tabel. Vervolgens is in die tabel op te zoeken welke tegels het zijn.
Dit is een test-sketch om mijn idee te testen.
Voor de test zet vaste waarden in de 'tile' array, en die wijzig ik steeds om verschillende mogelijkheden te proberen.
- Code: Alles selecteren
#define NUM_TILES 9
// For testing: fill the tiles with a fixed pattern.
char tile[NUM_TILES] =
{
'X', '.', 'O', // 0 1 2
'X', 'O', 'O', // 3 4 5
'O', '.', '.', // 6 7 8
};
// The combinations that generate a "win".
const int winTable[8][3] = {
{ 0, 1, 2 }, // top row
{ 3, 4, 5 }, // middle row
{ 6, 7, 8 }, // bottom row
{ 0, 3, 6 }, // left column
{ 1, 4, 7 }, // middle column
{ 2, 5, 8 }, // right column
{ 0, 4, 8 }, // diagonal top-left to bottom-right
{ 2, 4, 6 }, // diagonal bottom-left to top-right
};
void setup()
{
Serial.begin( 9600);
int index;
if( CheckWinTable( index))
{
Serial.print( "win combination index = ");
Serial.print( index);
Serial.print( ", blink tiles: ");
Serial.print( winTable[index][0]);
Serial.print( ", ");
Serial.print( winTable[index][1]);
Serial.print( ", ");
Serial.print( winTable[index][2]);
Serial.println();
}
else
{
Serial.println( "no win");
}
}
void loop()
{
}
boolean CheckWinTable(int& winIndex)
{
boolean win = false; // default no win combination found
// Test for 'X' and 'O'.
for( int i=0; i<2 && win == false; i++)
{
char c;
if( i == 0)
c = 'X';
else
c = 'O';
// Test the three tiles for this combination.
for( int tableIndex=0; tableIndex<8 && win == false; tableIndex++)
{
if( tile[winTable[tableIndex][0]] == c &&
tile[winTable[tableIndex][1]] == c &&
tile[winTable[tableIndex][2]] == c)
{
win = true;
winIndex = tableIndex;
}
}
}
return( win);
}
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: Spelletje Tic-tac-toe, hulp nodig
Die shifter library werkt wel, hier de link https://github.com/catchdave/arduino-gb/tree/master/libraries/Shifter
http://bildr.org/2011/08/74hc595-breakout-arduino/
Het is inderdaad de bedoeling dat, wanneer een tegel is ingedrukt, dus wanneer er iemand op staat, de leds blijven branden.
Ik zit alleen nog met het feit dat ik het volgende moet uitvogelen.
In jouw sketch is het zo dat er alleen wordt gekeken naar even en oneven nummers. Wanneer mogelijk wil ik dat uitbreiden zodat wanneer de eerste speler (team 1) op het bord staat er gekeken wordt naar:
- of de tegel een even- of oneven nummer heeft
- dat daarmee de kleur van de LEDs wordt bepaalt (rood of groen) voor het team
( de groene LEDS zijn verbonden met pinnen 1-9 van de relaiskaarten en de rode met de pinnen 10-18)
- en dat die kleur gedurende het spel wordt aangehouden voor dat team.
Dus bv speler 1 (team 1) staat op tegel 2, krijgt groen toegewezen, speler 2 (team 2) gaat op 3 staan en krijgt rood toegewezen, speler 3 (team 1) gaat op 5 staan (groen),
speler 4 (team 2) rood, enzovoort.
Behoorlijk gecompliceerd dus maar wel erg leuk voor kinderen.
http://bildr.org/2011/08/74hc595-breakout-arduino/
Het is inderdaad de bedoeling dat, wanneer een tegel is ingedrukt, dus wanneer er iemand op staat, de leds blijven branden.
Ik zit alleen nog met het feit dat ik het volgende moet uitvogelen.
In jouw sketch is het zo dat er alleen wordt gekeken naar even en oneven nummers. Wanneer mogelijk wil ik dat uitbreiden zodat wanneer de eerste speler (team 1) op het bord staat er gekeken wordt naar:
- of de tegel een even- of oneven nummer heeft
- dat daarmee de kleur van de LEDs wordt bepaalt (rood of groen) voor het team
( de groene LEDS zijn verbonden met pinnen 1-9 van de relaiskaarten en de rode met de pinnen 10-18)
- en dat die kleur gedurende het spel wordt aangehouden voor dat team.
Dus bv speler 1 (team 1) staat op tegel 2, krijgt groen toegewezen, speler 2 (team 2) gaat op 3 staan en krijgt rood toegewezen, speler 3 (team 1) gaat op 5 staan (groen),
speler 4 (team 2) rood, enzovoort.
Behoorlijk gecompliceerd dus maar wel erg leuk voor kinderen.
Re: Spelletje Tic-tac-toe, hulp nodig
Een 'X' of een 'O', of 'team rood' of 'team groen', dat is allemaal hetzelfde. Mijn sketch was bedoeld zodat het gemakkelijk te zien is op de seriële monitor.
Bij mijn sketch krijgt de allereerste een 'X' toegewezen, en vervolgens de andere natuurlijk een 'O'.
Wanneer de eerste is gezet, dan kan het niet anders dan om-en-om gaan, dus de %2 is sowieso nodig.
Er is een variabele nodig, die onthoudt welk team als eerste begon.
En dan het zetten van een 'X' or 'O' hangt af van de 'first'.
Dat kan door de 'first' op te vatten als een offset en bij het aantal op te tellen.
Wanneer een 'X' begon, dan blijft alles hetzelfde.
Wanneer een 'O' begon, dan draait even en oneven om.
Wil je alleen kijken naar het moment dat iemand op een tegel stapt ? Of wil tijdens het spel steeds in de gaten houden waar iedereen staat ? dan is het nodig om mijn voorbeeld sketch te wijzigen.
Bij mijn sketch krijgt de allereerste een 'X' toegewezen, en vervolgens de andere natuurlijk een 'O'.
Wanneer de eerste is gezet, dan kan het niet anders dan om-en-om gaan, dus de %2 is sowieso nodig.
Er is een variabele nodig, die onthoudt welk team als eerste begon.
- Code: Alles selecteren
if( countActivatedTiles == 0)
{
// integer 'first' remembers if the 'X' or 'O' started.
// It is 0 for 'X' and 1 for 'O'.
// The 'X' or 'O' depends on the tile itself. The upper-left tile (tile 0) has 'X'.
// The variable 'first' will be used as an offset.
first = button % 2;
}
En dan het zetten van een 'X' or 'O' hangt af van de 'first'.
Dat kan door de 'first' op te vatten als een offset en bij het aantal op te tellen.
Wanneer een 'X' begon, dan blijft alles hetzelfde.
Wanneer een 'O' begon, dan draait even en oneven om.
- Code: Alles selecteren
if( (countActivatedTiles + first) % 2 == 0) // test for even numbers
Wil je alleen kijken naar het moment dat iemand op een tegel stapt ? Of wil tijdens het spel steeds in de gaten houden waar iedereen staat ? dan is het nodig om mijn voorbeeld sketch te wijzigen.
- hans50-dec
- Berichten: 12
- Geregistreerd: 15 Dec 2016, 19:45
Re: Spelletje Tic-tac-toe, hulp nodig
Beste mensen,
Dank voor jullie hulp, inmiddels ben ik wel wat verder maar zit toch nog met een vraag.
Waar zet ik in de onderstaande code de routine die, voordat het spel begint, de LEDs doet flitsen?
Ik heb verschillende mogelijkheden geprobeerd maar telkens verstoort dat het programma.
Graag jullie visie hierop.
Voor de duidelijkheid hieronder ook nog de flits routine:
En sinds vandaag heb ik ook weer internet zonder uitval. Blijkbaar is alles mogelijk
Dank alvast,Hans Schuurmans
Dank voor jullie hulp, inmiddels ben ik wel wat verder maar zit toch nog met een vraag.
Waar zet ik in de onderstaande code de routine die, voordat het spel begint, de LEDs doet flitsen?
Ik heb verschillende mogelijkheden geprobeerd maar telkens verstoort dat het programma.
Graag jullie visie hierop.
- Code: Alles selecteren
#include <Arduino.h>
#include <Shifter.h>
const unsigned long debounceTime = 20; // milliseconds
// where switches are connected
const int numSw = 9; // number of switches
const byte swPin [numSw] = { 2, 5, 6, 7, 8, 9, 10, 11, 12 };
const int pinGr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
const int pinRd[] = {9, 10, 11, 12, 13, 14, 15, 16, 17};
int winner = 0;
int swState [numSw]; // current state of the switch
int lastSwState [numSw]; // previous state of the switch
int countActivatedTiles;
int T1 = 0; // team 1
int T2 = 0; // team 2
// have we changed state in any switch?
bool stateChange = false;
bool tilePressed = false;
// when last changed state
unsigned long lastPressedTime [numSw];
unsigned long now = millis ();
int nrTegel = 0; // nummer tegel
// for shifter
#define SER_Pin A3 //SER_IN data
#define RCLK_Pin A5 //L_CLOCK latch
#define SRCLK_Pin A2 //CLOCK
#define NUM_REGISTERS 3 //how many registers are in the chain
long randNumber;
//initaize shifter using the Shifter library
Shifter shifter(SER_Pin, RCLK_Pin, SRCLK_Pin, NUM_REGISTERS);
void check_winner()
{
// winning combinations
Serial.println("check winner");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
for (nrTegel = 0; nrTegel < numSw; nrTegel++)
{
pinMode (swPin [nrTegel], INPUT_PULLUP);
swState [nrTegel] = HIGH; // not pressed
lastPressedTime [nrTegel] = 0;
}
shifter.clear(); //set all pins on the shift register chain to LOW
}
void loop()
{
// put your main code here, to run repeatedly:
// read the switch input pins:
// compare the switchState to its previous state
for (nrTegel = 0; nrTegel < numSw; nrTegel++)
{
byte currentState = digitalRead (swPin [nrTegel]);
if ((currentState != swState [nrTegel]) &&
(now - lastPressedTime [nrTegel] >= debounceTime))
{
swState [nrTegel] = currentState;
lastPressedTime [nrTegel] = now;
stateChange = true; // a switch has changed state
} // end of changed state
} // end of for, each switch
// compare the switchState to its previous state
for (nrTegel = 0; nrTegel < numSw; nrTegel++)
{
if (swState[nrTegel] != lastSwState[nrTegel])
{
// if the state has changed, increment the counter
if (swState[nrTegel] == HIGH)
{
// if the current state is HIGH then the button was not pressed
Serial.print("Switch ");
Serial.print (nrTegel + 1);
Serial.println (" is off (1)");
}
if ( swState[nrTegel] == LOW) // something received ?
{
tilePressed = true;
shifter.clear(); //set all pins on the shift register chain to LOW
if ( (countActivatedTiles) % 2 == 0) // test for even numbers
{
// It is an even number
T1 = 1; // team 1 aan de beurt
Serial.println ("Team 1 aan de beurt");
Serial.print("Tegel = ");
Serial.println (nrTegel + 1);
shifter.setPin(pinGr[nrTegel], LOW); //set pin in the chain LOW (= relay ON)
shifter.write(); //send changes to the chain and display them
check_winner();
}
else
{
// It is an odd number
T2 = 1; // team 2 aan de beurt
Serial.println ("Team 2 aan de beurt");
Serial.print("Tegel = ");
Serial.println (nrTegel + 1);
shifter.setPin(pinRd[nrTegel], LOW); //set pin in the chain LOW (= relay ON)
shifter.write(); //send changes to the chain and display them
check_winner();
}
countActivatedTiles++;
}
}
// save the current state as the last state,
//for next time through the loop
lastSwState[nrTegel] = swState[nrTegel];
} // end of for
// Delay a little bit to avoid bouncing
delay(50);
} // end loop
Voor de duidelijkheid hieronder ook nog de flits routine:
- Code: Alles selecteren
void flits() // routine voor het snel in- en uitschakelen van de diverse leds
{
randNumber = random(1, 18);
shifter.setPin(randNumber, LOW); //set pin i in the chain LOW (= relay ON)
shifter.write(); //send changes to the chain and display them
delay(300);
shifter.setPin(randNumber, HIGH); //set pin i in the chain HIGH (= relay OFF)
shifter.write(); //send changes to the chain and display them
} // end of flits
En sinds vandaag heb ik ook weer internet zonder uitval. Blijkbaar is alles mogelijk
Dank alvast,Hans Schuurmans
Re: Spelletje Tic-tac-toe, hulp nodig
Er zitten teveel dingen in die niet correct zijn. Ik zou dan je sketch uitbreiden en om de fouten heen moeten programmeren zodat ik de fouten laat zitten terwijl de uitbreiding van je sketch wel correct zou moeten werken. Sorry, dat kan ik niet. Ik ben bang dat dan alle atomen in willekeurige richting gaan bewegen omdat de wetten van het universum niet meer gelden.
Re: Spelletje Tic-tac-toe, hulp nodig
ik zou dat als eerste aanroep in de loop doen (zolang er niets ingedrukt is dan flits) en dat ingedrukt moet je dus doen met een forloop alle switches opvragen. doe dat dus ook in een functie,
Zorg dat elk stuk code op een pagina past, dat is overzichtelijk.
Zorg dat elk stuk code op een pagina past, dat is overzichtelijk.
paul deelen
shooter@home.nl
shooter@home.nl
18 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten