# Matrix-Operationen



## Proggy (20. Feb 2007)

Hallo,

weiß nicht, ob ihr mir helfen wollt oder könnt. Habe mir da ein Projekt überlegt, bin auch schon am Programmieren. Was mir im Magen liegt, ist folgendes:
Es soll ein Brettspiel werden mit 7 Reihen. Jede Reihe besteht aus verschiedenfarbigen Steinen. Der Ausgagszustand ist folgender:                                                                                            
rot        rot        rot        leer        rot        rot        rot                  
grün     grün      grün     leer        grün      grün     grün                
gelb     gelb       gelb      leer       gelb      gelb      gelb                 
blau     blau       blau      leer       blau      blau      blau          
braun   braun    braun    leer       braun    braun    braun               
orange orange  orange   leer      orange   orange   orange            
lila       lila        lila         leer      lila         lila         lila                  

Und jetzt das Ganze mit den Feldindizes. Die Steine werden in einem Array gespeichert. stein[23] kennzeichnet den dritten Stein der zweiten Reihe. stein [45] den fünften Stein der vierten Reihe.

 11     12     13     14     15     16     17
21     22     23     24     25     26     27
31     32     33     34     35     36     37
41     42     43     44     45     46     47
51     52     53     54     55     56     57
 61      62     63    64     65     66      67 
71      72     73    74     75     76      77

so, das ist der Ausgangszustand. Der Spieler bekommt jetzt eine zufällige Musterkombi angezeigt, die er durch Verschieben der Steine entweder waagerecht, senkrecht oder diagonal bilden soll. Dabei darf er in alle Richtungen ziehen und er darf auch einen Stein pro Zug überspringen. Nach jedem Zug muß natürlich überprüft werden, ob er die vorgelegte Kombi schon gebildet hat. Die Steine speichere ich in einem Array wie oben dargestellt, so kennzeichnet der Index stein[23] bspw. den dritten Stein in der zweiten Reihe. Ist dort ein Stein, so entspricht der Inhalt des Feldelementes der Steinfarbe. stein[23]=5 bedeutet eine grüne Farbe dieses Steines usw. stein[45]=0 bedeutet, daß dort kein Stein liegt.

Eine Kombi, die zu bilden ist, könnte z.B. sein:  rot      blau      orange      blau      gelb       lila        gelb

Hat er diese gebildet, erscheint die nächste Farbkombi.  Die getätigten Züge werden gezählt und später in eine Highscore-Tabelle eingetragen.... werd die wenigsten Züge machen musste usw...
 später evtl. noch mit Computer als Gegenspieler, aber zunächst mal als Alleinspieler-Variante gedacht.

So, nun hab ich zur Zeit noch ein Problem damit: Wie ermittle ich, ob ein Stein von Position 11 bspw. nach Position 33 geschoben werden kann. Das geht ja nur, wenn Position 22 besetzt und Position 33 leer ist. Denn 
- es darf nur auf einen unmittelbaren Nachbarn geschoben werden oder
- ein Stein übersprungen werden pro Zug

Das Ganze gibt doch sehr viele if-Abfragen. Natürlich kann ich das so realisieren, aber gings auch einfacher???

Wie gesagt, sehr aufwändig. Für Hilfen bin ich Euch sehr dankbar, ansonsten muss ich halt Alleine durch.
Ja, und die Verschärfung wäre dann irgendwann, daß man den Computer als Gegenspieler nimmt und wer zuerst alle Kombis gelegt hat, ist der Sieger.


----------



## Lim_Dul (20. Feb 2007)

Nimm doch ein zwei-dimensionales Array stein[][], dass jeweils von 0-6 geht, also:


```
int stein[][] = new int[7][7]
```

Dann kann ein Stein von Position (i,j) auf folgende Positionen geschoben werden:

```
if (i<7 && stein[i+1][j]==0) {
  // (i+1, j) ist gültig, nach rechts schieben geht also
} else if (i<6 && stein[i+1][j]!=0 && stein[i+2][j]==0) {
  // (i+2,j) ist gültig, nach rechts springen geht also

// Noch 3x analog für links i-1, i-2 jeweils testen, unten j+1, j+2 testen und oben j-1,j-2 testen
```


----------



## Proggy (20. Feb 2007)

Danke,

das hört sich gut an. Was meinst Du mit testen? Ich soll das testen? Ok, das werd ich dann tun. Hast Du eigentlich auch die diagonale Variante berücksichtigt?


----------



## Lim_Dul (20. Feb 2007)

Mit testen, halt das was die if / else if Abfrage macht. 

Die diagonale hab ich vergessen, ergibt 4 weitere solcher Blöcke


----------



## Marco13 (21. Feb 2007)

Wenn es irgendwann mal NURNOCH um Effizienz geht (z.B. für einen Computergegner): Du könntest auch eine 11x11-Materix nehmen, und die Randfelder mit "-1" initialisieren - dann sparst du dir die i<7, i<6, i>0, i>1 -Abfragen. Aber das ist für den Einspielermodus erstmal nicht sooo wichtig.


----------



## Proggy (21. Feb 2007)

Hallo,


das mit dem Computer als Gegner ist hochinteressant. Habe allerdings keinen Schimmer, wie ich an sowas drangehen soll, vom Algorithmus her gesehen. Ich weiss, was Klassen sind, kann Objekte bilden, Schleifenprogrammierung, Grafikausgabe etc. Aber wie bringe ich dem Rechner Denken bei, wie packe ich sowas an??? Wollte auch das Ganze mal als Online-Game realisieren, aber dann reicht doch meine Seite bei HostEurope alleine nicht. 

Habe auch schon was probiert: http://www.ramschmarkt.de/clickme/anmeldungcq.php

dort als andreas mit kennwort asdfg1 anmelden

Für Rückmeldungen und Fehlermeldungen bin ich dankbar.


----------



## Marco13 (21. Feb 2007)

Tja, darüber könnte man ganze Bücher schreiben - und das wurde auch schon getan :wink:
Die State-Of-The-Art-Referenz ist dabei http://aima.cs.berkeley.edu/
Auf dieser Seite gibt es auch Java-Code dazu. Aber für dieses kleine, sehr spezielle Problem reicht aus diesem Buch ein einziges Kapitel, nämlich das 5. 
Viele Suchergebnisse, die man mit Stichworten wie
Min Max Alpha Beta Pruning
erhält, sind dreist aus diesem Buch rauskopiert :wink:


----------

