Spelletje Tic-tac-toe, hulp nodig

Arduino specifieke Software
Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor hans50-dec » 14 Jan 2017, 15:35

@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

Advertisement

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

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor Koepel » 14 Jan 2017, 17:00

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 ?

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

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor Koepel » 14 Jan 2017, 18:15

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.

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);
}

Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor hans50-dec » 14 Jan 2017, 18:27

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.

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

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor Koepel » 14 Jan 2017, 19:17

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.

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.

Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor hans50-dec » 26 Jan 2017, 01:24

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.

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

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

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor Koepel » 26 Jan 2017, 03:47

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.

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

Re: Spelletje Tic-tac-toe, hulp nodig

Berichtdoor shooter » 26 Jan 2017, 13:45

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.
paul deelen
shooter@home.nl

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten