Schach

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Grundidee

Die grundlegende Idee hinter dem Projekt "Schach" war, das bekannte Brettspiel interaktiv zu spielen.

Das heißt, dass die Figuren und das Spielfeld nur virtuell mit einem Beamer auf einen Tisch projiziert werden und die Figuren mit einer Handbewegung verschoben werden können. Diese Handbewegung soll so aussehen wie im klassischen Spiel, indem man die Figuren mit einem Griff des Zeigefingers und des Daumen packt, zur gewünschten Position bewegt und wieder loslässt.

Umsetzung

Finger und Gesten erkennen

Gesten Greifen und Loslassen
Marker zur einfacheren Erkennung der Finger

Wie wird‘s gemacht:

  1. HSV Farbton der Marker vorab bestimmen
  2. RGB - Bild zu HSV - Bild konvertieren
  3. Marker an den Fingern erkennen -> Konturen finden
  4. Gesten der Finger detektieren über den Abstand (Entfernung der Konturenmittelpunkte voneinander)
  5. Kleiner Abstand = zugreifen/ gegriffen halten
  6. Großer Abstand = loslassen/ offen





Schachspiel in Software abbilden

Softwarealorithmus

Nebenstehender Algorithmus wurde in Software abgebildet, um Gesten und die Bewegung der Hand zu erkennen.

Der Abstand der beiden Finger wird dauerhaft berechnet. Unterschreitet dieser einen Schwellwert bedeutet dies, dass die Finger eine greifende Bewegung ausüben.

Ist dies der Fall wird die Figur gesucht, die sich in einem bestimmten Radius um den Mittelpunkt der beiden Finger befindet. Wird keine gefunden startet der Algorithmus wieder von vorne und mann muss erneut greifen. Befindet sich eine Figur in der Nähe wird diese ausgewählt und man kann beginnen diese zu verschieben. Die x- und y- Koordinaten werden dabei dauerhaft aktualisiert, sodass der Spieler das verschieben der Figur auch sehen kann.

Danach wird wieder über den Abstand der Finger überprüft ob diese geöffnet werden. Ist die der Fall wird das Schachbrettfeld aus dem Array Schachbrett mithilfe der x- und y- Koordinaten der Figur gesucht und die Koordinaten der Figur mit denen des Schachbrettfeldes überschrieben, sodass sich die Figur nach loslassen zentral im Feld befindet.

Klassendiagramm






Da ein Schachspiel 64 Spielfelder und 32 Figuren hat, wurde jeweils eine Klasse (siehe Klassendiagramm) als Muster mit den jeweiligen Eigenschaften implementiert.

Im Array Schachbrett werden zu Beginn des Programms alle Schachbrettfelder mit den jeweiligen Koordinaten und Nummer initialisiert.

Dasselbe geschieht mit dem Array Figuren in welchem sich alle Figuren befinden. Den Figuren wird zusätzlich noch das dazugehörige Bild (Dame, König. Turm, ...) zugewiesen.



Probleme und Lösungen

Problem Lösung
Detektieren der Finger mithilfe der Marker (Markerfarbe zu transparent) Kräftigere Farben für Marker verwenden
Programmfehler/ -absturz z.B.: Finger werden aus dem Bild bewegt Vor Berechnungen (Mittelpunkt der beiden Finger; Abstand der Finger) prüfen, ob Finger im Bild detektiert werden.
Bilder für Figuren einbinden Bilder in Richtigem Ordnerverzeichnis ablegen (...\bin\data\)
Figur und Feld konnten nicht bestimmt werden Falsche Pointerebene
Felder wurden falschen Koordinatenwerten bzw. überhaupt nicht initialisiert Startwert der Schleife und Objekt - Berechnungsformel war falsch


Ergebnis

Fertiges Spiel

Im nebenstehenden Bild ist das fertige Spiel aus Sicht des Nutzers zu sehen. Die grüne geöffnete Hand kann nun mit den mit Markern gekennzeichneten Fingern bewegt werden.

Schließt man die Finger wird aus der grünen geöffneten Hand eine rote geschlossene. Dies zeigt an, dass die Figur ausgewählt wurde und nun verschoben werden kann.

Hat man die Figur auf die gewünschte Position versetzt und öffnet die Finger wird aus der roten geschlossenen Hand wieder eine grüne geöffnete, wie in der Abbildung zu sehen ist.

Die Figur wird anschließend zentral im abgelegten Feld ausgerichtet.



Programmcode