Matrix-Operationen

Status
Nicht offen für weitere Antworten.

Proggy

Bekanntes Mitglied
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

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

Code:
int stein[][] = new int[7][7]

Dann kann ein Stein von Position (i,j) auf folgende Positionen geschoben werden:
Code:
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

Bekanntes Mitglied
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

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

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

Marco13

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben