8 Spieler in 4 Teams per Zufall zuweisen / NeoPixel

Hallo Leute,
ich benötige eine Lösung für folgendes Projekt:

Es gibt ein Spiel mit 8 Spielern, es sollen immer jeweils 2 Teamspieler im Zufallsprinzip ausgewählt werden. Demnach hat jeder Spieler 4 LED's in unterschiedlichen Farben (Grün, Blau, Rot, Geld) vor sich. Wird nun ein Taster gedrückt werden vor jedem Spieler eine andere (oder eben noch einmal die selbe) Farbe aktiviert. Sprich es dürfen immer nur 2 Farben im Spiel leuchten damit immer Zweierteams entstehen. Drückt man den Taster erneut werden zwei weitere Spieler definiert.

Ich denke mit 4 Schiebereglern sollte das möglich sein oder? Bin noch etwas neu in der Arduinowelt, kenne mich jedoch grundlegend mit einigen Sprachen aus.

Ich danke euch im Voraus für eure Hilfe :slight_smile:

Zettel und Stift raus, ist der erste Schrift.

Liste alle Möglichkeiten auf, die schreibst du dann in Zweidimensionales Array.

hi,

oder jeder spieler hat nur eine RGB-LED.
oder jeder spieler hat vier RGB-LEDS.

vorteil: in beiden fällen kannst Du WS2812er-LEDs nehmen, die alle zusammen über einen einzigen arduino-ausgang gesteuert werden und Du ersparst Dir jegliche schaltung.

gruß stefan

Gedacht war das jeder Spieler jeweils 4 LED's in 4 verschiedenen Farben hat. Die Idee mit den WS2812 gefällt mir jedoch auch sehr gut, auch wenn ich es noch nicht gemacht habe. Habe mir jetzt 20 von diesen
bestellt. Nun muss ich nur noch den Quellcode hinbekommen. Jemand eine Idee?

Ja du findest alles dazu auf der Seite: >Klick<
Wenn du dich durch die Beispiele arbeitest wirst du schon alles zusammenbekommen.
Ich habe in genau mit diesen LEDs die Wordclock aufgebaut. Sie sind einfach Handzuhaben
Diese LEDs bekommmst du bei Aliexpress für 17€/100Stck incl Versand.
Gruß
DerDani

hi,

wie dani sagt, mit der fastLED-library hast Du keine probleme. für so einfache dinge, wie du sie brauchst, entfällt auch jedes einlesen. einfach library installieren, ein beispiel öffnen, den richtigen LED-typ auswählen und die anzahl der LEDs.
im beispiel siehst Du dann, wie's geht.

bevor Du drüber stolperst (tun viele): um zufallszahlen zu bekommen, mußt Du zuerst mit randomSeed initialisieren, sonst kommt immer das gleiche.

long randNumber;

void setup(){
  Serial.begin(9600);
  randomSeed(analogRead(0));
}

void loop(){
  randNumber = random(300);
  Serial.println(randNumber);

  delay(50);
}

gruß stefan

Allerdings streut analogRead() nicht wirklich viel. Bessere Zufallswerte bekommt man wenn man den Zeitpunkt des ersten Tastendrucks als Seed verwendet (per millis()). Das bietet sich gerade hier an.

Danke für eure Vorschläge bis hierhin. Ich habe nun die NeoPixel verbaut, bisher zwar nur 4 um zu testen aber die funktionieren wie sie sollen.

Allerdings bekomme ich das mit dem Sketch nicht wirklich hin. Könnt ihr mir Anregungen geben wie ich es hinbekomme das ich bei 8 Spielern immer wenn ein Button gedrückt wird 4 Team generiert bekomme und jeweils 4 Farben auf 8 Spieler verteilt werden also sprich immer eine Farbe pro Team (2)? Stehe leider etwas auf dem Schlauch, ist mein erstes richtiges Arduino Projekt. Das mit RandomSeed ect. ist mir soweit einleuchtend.

Dann zeig deinen Sketch

ph3nomic:
Allerdings bekomme ich das mit dem Sketch nicht wirklich hin. Könnt ihr mir Anregungen geben wie ich es hinbekomme das ich bei 8 Spielern immer wenn ein Button gedrückt wird 4 Team generiert bekomme und jeweils 4 Farben auf 8 Spieler verteilt werden also sprich immer eine Farbe pro Team (2)? Stehe leider etwas auf dem Schlauch, ist mein erstes richtiges Arduino Projekt. Das mit RandomSeed ect. ist mir soweit einleuchtend.

Hier ein Beispielcode:

#define BUTTONPIN 7
#define NUMPLAYERS 8
byte players[NUMPLAYERS];

void mixPlayers()
{
  randomSeed(micros());    // Startwert für Zufallsgenerator initialisieren
  for (int i=0;i<2000;i++) // 2000 mal durchmischen nach Zufall
  {
    byte v1=random(NUMPLAYERS); // Erster zu vertauschender Spieler
    byte v2=random(NUMPLAYERS); // Zweiter zu vertauschender Spieler
    byte tmp= players[v1];      // temporär merken
    players[v1]=players[v2];    // vertauschen
    players[v2]=tmp;
  }
}

void showPlayers()
{
  Serial.println("Teamzusammenstellung:");
  Serial.print("Team ROT:\t");
  Serial.print(players[0]);
  Serial.print("\t");
  Serial.println(players[1]);
  Serial.print("Team GELB:\t");
  Serial.print(players[2]);
  Serial.print("\t");
  Serial.println(players[3]);
  Serial.print("Team GRUEN:\t");
  Serial.print(players[4]);
  Serial.print("\t");
  Serial.println(players[5]);
  Serial.print("Team BLAU:\t");
  Serial.print(players[6]);
  Serial.print("\t");
  Serial.println(players[7]);
}


void setup(){
  Serial.begin(9600);
  Serial.println("Good night and good luck!");
  for (int i=0;i<NUMPLAYERS;i++) players[i]=i;
  pinMode(BUTTONPIN,INPUT_PULLUP);
}

boolean lastButtonState;
void loop(){
  boolean buttonState=!digitalRead(BUTTONPIN);
  if (buttonState != lastButtonState)
  {
    if (buttonState)
    {
      mixPlayers();
      showPlayers();
    }
    lastButtonState=buttonState;
    delay(10);    
  }  
}

Die Teamzusammenstellung erfolgt dabei nach folgendem Algorithmus:

  1. Es wird ein Byte-Array mit den Spielernummern angelegt {0,1,2,3,4,5,6,7}
  2. Wenn der Taster gedrückt wird, werden im Array 2000 mal zwei zufällige Spieler vertauscht
  3. Nach dem Mischen sind Array-Index 0/1 das Team ROT, 2/3 Team GELB, 4/5 Team GRUEN, 6/7 Team BLAU

So ungefähr?

Wahnsinn! Ich danke dir vielmals!

Jetzt muss ich bloß noch die NeoPixel mit den ausgegebenen Zufallswerten in verschiedene Farben zum leuchten bringen.

Vielen Dank nochmal für deine Mühe

ph3nomic:
Wahnsinn! Ich danke dir vielmals!

Ich habe die Mix-Funktion nochmal nachgebessert, damit sie nicht so chaotisch und langsam mixt, sondern viel schneller ist (und dabei wohl auch noch "besser gemischte" Spielpaarungen liefert):

void mixPlayers()
{
  randomSeed(micros());    // Startwert für Zufallsgenerator initialisieren
  for(int i=0; i < NUMPLAYERS; i++) // entsprechend der Anzahl der Spieler
  {
    byte r = random(NUMPLAYERS-i);  // einen Spieler zufällig wählen
    byte temp=players[NUMPLAYERS-i-1]; // den Spieler am Ende der Auswahl merken
    players[NUMPLAYERS-i-1]= players[r]; // am Ende der Auswahl den zufällig gewählten Spieler einfügen
    players[r]=temp; // und den gemerkten Spieler an die Stelle des ausgewählten Spielers setzen
  }
}

Dieser neue Algorithmus arbeitet so, dass er so oft einen Spieler zufällig auswählt wie es Spieler gibt. In einer Schleife wird dabei abnehmend 1aus8, 1aus7, 1aus6 etc. ausgewählt und dabei jeweils der ausgewählte Spieler an die Positionen letzter, vorletzter, vorvorletzter etc. gesetzt, während der bisher dort befindliche Spieler an Stelle des ausgewählten wechselt und weiterhin zur Auswahl steht. Ist vielleicht interessant, wenn es auf die Ausführungsgeschwindigkeit der Funktion ankommt.

ph3nomic:
Jetzt muss ich bloß noch die NeoPixel mit den ausgegebenen Zufallswerten in verschiedene Farben zum leuchten bringen.

Was hast Du an Hardware verdrahtet?
8 Neopixels für 8 Spieler?
Und nun soll vor jedem Spieler der Neopixel in seiner Teamfarbe aufleuchten?

Und dann soll irgendwas gespielt werden?
In dem Fall wäre es ggf. interessant zu wissen, was und wie gespielt werden soll.

Danke nochmal für deine Bemühungen und dein Enthusiasmus an meinem Projekt.
Es handelt sich dabei um ein Trinkspiel bei dem immer zwei Leute in einem Team zusammen spielen sollen.
Hier ein Bild vom Spiel, wobei ich die vier Arme durch 4 weitere ergänzt habe, sodass 8 Spieler Platz finden.

Die NeoPixel habe ich quasi unter die Abschussrampen montiert, ein Taster zum wechseln der Spieler kommt in die Mitte des Spiels. In meiner Version ist das ganze auf einer MDF Platte befestigt.
Es wird sporadisch, im Abstand von einigen Minuten hin und wieder die Teams gewechselt.

ph3nomic:
Die NeoPixel habe ich quasi unter die Abschussrampen montiert, ein Taster zum wechseln der Spieler kommt in die Mitte des Spiels. In meiner Version ist das ganze auf einer MDF Platte befestigt.
Es wird sporadisch, im Abstand von einigen Minuten hin und wieder die Teams gewechselt.

Also nur ein Neopixel pro Spieler und auch keine weiteren Bedienelemente.
Dann hast Du damit sicher keine weiteren Probleme, die Pixel paarweise in Teamfarbe aufleuchten zu lassen?

Oder doch noch?

Ich danke dir, mit deiner Anpassung geht es jetzt nochmal viel schneller.
Habe den Code folgendermaßen angepasst:

#include "FastLED.h"

#define NUM_LEDS 8 							// Anzahl LEDS
#define DATA_PIN 9 							// NeoPixel Pin
CRGB leds[NUM_LEDS]; 						// Array leds erstellen

#define BUTTONPIN 7 						// Button Pin
#define NUMPLAYERS 8 						// Anzahl Spieler
byte players[NUMPLAYERS]; 					// Array player erstellen

void mixPlayers() 							// Methode zum Mischen
{
  randomSeed(micros());    					// Startwert für Zufallsgenerator initialisieren
  for(int i=0; i < NUMPLAYERS; i++) 		// entsprechend der Anzahl der Spieler
  {
    byte r = random(NUMPLAYERS-i);  		// einen Spieler zufällig wählen
    byte temp=players[NUMPLAYERS-i-1]; 		// den Spieler am Ende der Auswahl merken
    players[NUMPLAYERS-i-1]= players[r]; 	// am Ende der Auswahl den zufällig gewählten Spieler einfügen
    players[r]=temp;						// und den gemerkten Spieler an die Stelle des ausgewählten Spielers setzen
  }
}

void showColors()
{
	leds[players[0]] = CRGB::Red;
	leds[players[1]] = CRGB::Red;
	leds[players[2]] = CRGB::Yellow;
	leds[players[3]] = CRGB::Yellow;
	leds[players[4]] = CRGB::Green;
	leds[players[5]] = CRGB::Green;
	leds[players[6]] = CRGB::Blue;
	leds[players[7]] = CRGB::Blue;
	FastLED.show();
}


void setup(){
	FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);

	for (int i=0;i<NUMPLAYERS;i++) players[i]=i;
	pinMode(BUTTONPIN,INPUT_PULLUP);
}

boolean lastButtonState;

void loop(){
  boolean buttonState=!digitalRead(BUTTONPIN);
  if (buttonState != lastButtonState)
  {
    if (buttonState)
    {
      mixPlayers();
      showColors();
    }
    lastButtonState=buttonState;
    delay(10);    
  }  
}

Jetzt muss ich das ganze nur noch auf vom Arduino auf einen eigenen Atmel packen, was ist von solch einer Lösung zu halten? http://moderndevice.com/product/rbbb-kit/

ph3nomic:
Jetzt muss ich das ganze nur noch auf vom Arduino auf einen eigenen Atmel packen, was ist von solch einer Lösung zu halten? http://moderndevice.com/product/rbbb-kit/

Was willst Du damit erreichen?

Geht es Dir um die Baugröße, die gegenüber einem UNO-Board reduziert werden soll?
Oder um irgendwas anderes?

Dieser Farbwechselgenerator soll später unter dem Spielbrett verbaut und mit 9V betrieben werden. Da ich aber kein ganzen Arduino dafür opfern möchte, muss eine andere Lösung her. Für spätere Projekte möchte ich allerdings lernen wie man am besten einen ATMega oÄ. ohne den Arduino zum laufen bekommt. Die Frage ist daher, wie es zu realisieren ist, das ganze ohne Arduino laufen zu lassen.

9V Blöcke sind gerade für LEDs und Motoren sehr schlecht. Die haben eine geringe Kapazität und sind schnell leer

ph3nomic:
Dieser Farbwechselgenerator soll später unter dem Spielbrett verbaut und mit 9V betrieben werden.

Ein 9V Block für Batteriebetrieb = Spielspass mit 8 LEDs für 60 Minuten bis zum nächsten Batteriewechsel.
Sowas in der Art?

Ich würde bei Batteriebetrieb eher zu 3*AA Batterien mit einem Step-Up Wandler auf 5V tendieren.

Und als Mini-Board vielleicht ein Board im "Pro Mini" Design verwenden.

Angebote über eBay von Chinaversendern (Achtung: Lieferzeit bis 40 Tage) beispielsweise:
Pro Mini Board eBay Nr. 171824176389
Step-Up-Wandler eBay Nr. 251562671234

Und wenn Du häufiger spielst, könntest Du ohne Änderung der Hardware anstelle 3xAA Alkaline Batterien genauso gut 3xAA NiMH aufladbare Akkus verwenden.