Entwickler-Ecke

Sonstiges (Delphi) - Karten Memory-artig hinlegen


ffgorcky - Sa 21.03.09 23:13
Titel: Karten Memory-artig hinlegen
Hallo liebe - immer wieder hilfreiche - Entwicklergemeinde!
Ich möchte gerne einfach nur ein paar Panels so wie Karten im Memory - aber erst mal nur 2 nebeneinander und sonst untereinander - platzieren.
Bisher habe ich das so da stehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=0 to Length(KartenArray)-1 do
        begin
        KartenArray[i].Top:=118*(i div 2);
        KartenArray[i].Left:=8+((i div 2)-1)
        end;

Das Kartenarray ist also ein Array von Panels mit den entsprechenden aufzudeckenden Images oder Labels drauf.

Dadurch bekomme ich aber nur die Karten untereinander angeordnet - also liegen die eigentlichen Spalten übereinander...
Aber die Reihen sehen doch vernünftig aus...

Wo ist denn da jetzt der Fehler?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Sa 21.03.09 23:37

Dir fehlt ein Faktor.

Delphi-Quelltext
1:
KartenArray[i].Left:=8+((i div 2)-1);                    
Ich vereinfache mal etwas:

Quelltext
1:
2:
3:
8+((i div 2)-1)
= 8 + (i div 2) - 1
= 7 + (i div 2)
i wird immer eins größer. Du versetzt die Karten also jeweils einen halben Pixel weiter nach rechts. ;-)

Im Grunde musst du es nur machen wie bei Top, nur mit der 8 ggf. als Offset dazu.


ffgorcky - So 22.03.09 18:05

Hallo Jaenike,

Ja, ich sehe jetzt auch, dass ich aus meinen Überlegungen raus das ganze etwas zu kompliziert(/zu verschachtelt) gemacht habe...
Aber ich sehe jetzt leider doch noch nicht so ganz, wieso ich dadurch nur das zweite, das fünfte und das sechste Panel (von bisher insgesamt nur sechs Panels) sehen kann.
Die anderen liegen demnach unter denen...
...was sie ja nach einer Laufzeit-Überprüfung auch wirklich tun - also liegen immer zwei übereinander!

Ich möchte sie doch einfach nur mit einem Absand von 8 Pixeln zum Rand und zueinander (horizintal und vertikal) ansiedeln.
Aber das möchte ich gerne während der Laufzeit machen, da ich sie ja sonst nicht vorher mischen kann! (- Was ich mir ja in Thema "Delphi-Library.de » Algorithmen, Optimierung und Assembler » (perfektes) Mischen nach Fisher-Yates (perfect shuffle)" abgeguckt habe.)

Meine Panels sind von der Größe her: 100 mal 100


jaenicke - So 22.03.09 18:56

Naja, aber wofür brauchst du da das div 2? Der Wert von i div 2 ändert sich doch natürlich wie gesagt nur alle 2 Schleifendurchläufe...

Delphi-Quelltext
1:
KartenArray[i].Left := 8 + (i * (KartenArray[i].Width + 8));                    


ffgorcky - Di 24.03.09 13:42

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Naja, aber wofür brauchst du da das div 2?


Weil ich doch erst mal nur zwei Panels nebeneinander setzen möchte und alle anderen untereinander...
...weil ich im Moment nur 6 Memory-Karten habe.

Später soll das natürlich gerne immer möglichst quadratisch (also gleich viele Karten in Tiefe und Breite) sein - also muss ich dann von der Wurzel den nächstkleineren, ganz-zahligen Wert als Teiler nehmen.
(- Oder?)


jaenicke - Di 24.03.09 21:34

Welche Werte nimmt denn i an?

Quelltext
1:
2:
3:
4:
5:
6:
7:
0 div 2 = 0
1 div 2 = 0
2 div 2 = 1
3 div 2 = 1
4 div 2 = 2
5 div 2 = 2
...
Damit ergeben sich bei 118*(i div 2) für Top folgende Positionen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
118 * (0 div 2) = 0
118 * (1 div 2) = 0
118 * (2 div 2) = 118
118 * (3 div 2) = 118
118 * (4 div 2) = 236
118 * (5 div 2) = 236
...
Meinst du vielleicht stattdessen die Breite oder Höhe geteilt durch die Anzahl der Karten? Das ist doch aber nicht i.


der organist - Mi 25.03.09 10:39

ich glaube das ist richtig, aber nur bei der Höhe, denn so erreicht er, dass für zwei aufeinanderfolgen Karten des Arrays den selben Faktor haben, denn Karte (1 und 2), dann (3 und 4) usw, sollen den selben Höhenfaktor haben, da sie nebeneinander liegen sollen (und somit die gleiche Top-Position haben).

aber beim den Left-positionen, das ist nicht nur etwas chaotisch, da ist dein Fehler (soweit ich sehe). Auch da soltlest du einen Faktor einbauen (bzw, an dieser STelle st div falsch). 100x100 Panels, mit nem Abstand von 18 pixeln? Dann würde ich sagen:


Delphi-Quelltext
1:
2:
Top:=118*(i div 2);
Left:=118*(i mod 2);


das Modulo (mod) errechnet den Rest bei der Division:


Delphi-Quelltext
1:
2:
3:
4:
5:
0 mod 2 = 0
1 mod 2 = 1
2 mod 2 = 0
3 mod 2 = 1
...


ich glaube, das brauchst du ;)