Entwickler-Ecke
Sonstiges (Delphi) - Memory problem
mimi - Di 17.06.03 17:40
Titel: Memory problem
Hallo,
wie kann ich am besten eine funktion schreiben, die folgens macht:
ich habe 3 verschieden karten + ein dekblatt.
Nun will ich meine 2d arry füllen, und zwar alle 3 verschiedne kartentypen müssen drin vorkommen aber dürfen maximal nur 2 mal drinen vorkommen, so wie es halt in memoy üblich ist.
wie geht das ?
jemmad eine idee ?
PheliX - Di 17.06.03 18:12
Hmm... Ich bin ein ziemlicher NewBe und hab deine Frage vielleicht nit richtig verstanden aber wenn ich sie richtig verstanden hab dann hab ich ne Idee :idea: :
SAg dem Programm doch einfach, dass es sich merken soll, welche Bilder er schon benutzt hat und streich das Bild von deiner Liste, wenn es zweimla benutzt wurde... nur mal so ne idee...
warscheinlich kannst du damit nichts anfangen, aber ich habs versucht :D
mimi - Di 17.06.03 19:51
doch du hast die frage richtig verstaden
so wollte ich es auch machen.
das problem ist folgendes:
1. ich brauche eine liste mit zahlen an unterschiedlichen positionen im 2d array aber jede zahl muss 2 mal vorkommen.
mein array sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| type map = record tex,tex2,typ:Integer; end;
var map = array of array of TMap; |
und nun kommt es auf tex2 an.
da sollen die werte drinen stehen, weil tex ist das deblatt.
könnte mir da jemmand weiter helfen ?
ich will es mit random machen, aber ich weiß nicht wie das geht :(
FriFra - Do 19.06.03 18:02
:mahn: Aber denk dran, dass der Begriff
Memory eine eingetragene Marke der Ravensburger AG ist. Die haben in der letzten Zeit schon einige Leute abgemahnt, weil die Ihr Spiel Memory genannt haben...
Aktuelles Urteil:
Zitat: |
21.05.2003 "Memory" LG-München Az.: 33 O 3824/03
.
Die Antragstellerin, eine bekannte Herstellerin von Spielen, ist Inhaberin der deutschen Wortmarke "Memory".
Die Antragsgegnerin, die Herausgeberin eines bekannten internationalen Frauenmagazins, bot im Februar 2003 im Internet unter der Bezeichnung "Fashion Memory" bzw. "Memory" ein virtuelles Legekartengewinnspiel an, bei dem virtuelle Karten mit paarweise vorhandenen Darstellungen von Modeartikeln verdeckt aufliegen und durch Aufklicken zweier Karten die zusammengehörigen Motive gefunden werden sollten. Als Gewinn wurde Designerschmuck im Wert von 230,-- Euro verlost.
Über den Antrag, der Antragsgegnerin die Verwendung der Bezeichnung "Memory" im Weg der einstweiligen Verfügung zu untersagen, hat die für den gewerblichen Rechtsschutz zuständige 33. Zivilkammer nach Durchführung einer mündlichen Verhandlung durch Urteil entschieden.
Das Gericht kam zu dem Schluss, dass entgegen der Ansicht der Antragsgegnerin das Wort "Memory" sich nicht zu einer beschreibenden Gattungsbezeichnung , wie z.B. "Puzzle", entwickelt hat.
Die Bezeichnung "Memory" weise eine gewisse Originalität auf; durch intensive und jahrelange Benutzung sei die Kennzeichnungskraft des seit 1959 vertriebenen Legekartenspiels gestärkt worden. Legespiele anderer Hersteller werden mit anderen Bezeichnungen wie z.B. "Memo-Spiel" gehandelt. Da die Antragstellerin auch belegen konnte, dass sie den Markt beobachtet und Kennzeichenverletzungen regelmäßig rügt, wurde ihrem Antrag stattgegeben. |
(Quelle:
http://www.justiz.bayern.de )
Moderiert von
Tino: Quote-Tags hinzugefügt.
mimi - Do 19.06.03 18:08
dann ändere ich den namen einfach und fertig schreiben ihn z.b. mit i oder so:
der name ist mir ersteinmal egal, das problem geht davon auch nicht weg :( :(
Simon Joker - Fr 20.06.03 10:07
Hi Mimi
ich mach das jetzt mal freifliegend:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| type map = record tex,tex2,typ:Integer; end; TMapArray = array of array of TMap;
var map : TMapArray;
function TForm1.FillArray(var MA:TMapArray):integer; var IntArr:array of integer; i,M,Ind,J:integer; begin SetLength(IntArr,Length(Ma)*Length(MA[1])); for i:=0 to High(IntArr) do begin IntArr[i]:=i div 2; end; Randomize; for i:=0 to High(IntArr) do begin Ind:=Random(Length(IntArr)); M:=IntArr[i]; IntArr[i]:=IntArr[Ind]; IntArr[Ind]:=M; end; ind:=0; for i:=0 to High(Ma) do for j:=0 to High(MA[1]) do begin MA[i,j].tex2:=IntArr[Ind]; inc(ind); end; end; |
Ich habe jetzt keinerlei prüfung auf Fehler rein gemacht. Kannst du aber noch tun und den Rückgabewert dafür verwenden.
mimi - Fr 20.06.03 11:22
Danke werde ich in ca. 3-4 stunden testen:)
mimi - Fr 20.06.03 14:23
fehler im procedure kopf.
da ist nur ein 1d array aber es muss ein 2D array sein.
mimi - Fr 20.06.03 14:29
es funktioniert nicht :(
das steht im array drin
edit:
werde jetzt ein 1D array verwenden. und fertig, dann kann ich auch deine funktion verwenden:)
Simon Joker - Fr 20.06.03 14:41
Hi Mimi
keine Ahnung was da nicht passt, denn bei mir funktioniert es.
@Array im Funktions-Kopf
Der TypTMapArray ist zweidimmensional!!
Mein kommpletter Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| type Tmap = record tex,tex2,typ:Integer; end; TMapArray = array of array of TMap;
....
var Form1: TForm1; map : TMapArray;
procedure TForm1.FormCreate(Sender: TObject); var i,j:integer; begin SetLength(map,4); for i:=0 to 3 do SetLength(map[i],5); FillArray(map); for i:=0 to 3 do for j:=0 to 4 do StringGrid1.Cells[i,j]:=IntToStr(map[i,j].tex2); end;
function TForm1.FillArray(var MA:TMapArray):integer; var IntArr:array of integer; i,M,Ind,J:integer; begin SetLength(IntArr,Length(Ma)*Length(MA[1])); for i:=0 to High(IntArr) do begin IntArr[i]:=i div 2; end; Randomize; for i:=0 to High(IntArr) do begin Ind:=Random(Length(IntArr)); M:=IntArr[i]; IntArr[i]:=IntArr[Ind]; IntArr[Ind]:=M; end; ind:=0; for i:=0 to High(Ma) do for j:=0 to High(MA[1]) do begin MA[i,j].tex2:=IntArr[Ind]; inc(ind); end; end; |
Das StringGrig dieht der Anzeige
EDIT: Kannst hier saugen:
http://www.simonjoker.de/Trans/DemoForMimi.rar
mimi - Fr 20.06.03 15:35
teste ich gleich nocheinmal aus. glaube aber nicht das ich es so hinbekommen.
ich denke für ein memory spiel sollte ein 1D array reichen oder ?
Tweafis - Fr 20.06.03 18:34
mimi hat folgendes geschrieben: |
ich denke für ein memory spiel sollte ein 1D array reichen oder ? |
Wenn du die Karten in einer Teihe anordnen willst, dann schon ;)
[
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯][
¯]
Aber eigentlich gehört es ja so:
[
¯][
¯][
¯][
¯][
¯][
¯]
[
¯][
¯][
¯][
¯][
¯][
¯]
[
¯][
¯][
¯][
¯][
¯][
¯]
[
¯][
¯][
¯][
¯][
¯][
¯]
[
¯][
¯][
¯][
¯][
¯][
¯]
[
¯][
¯][
¯][
¯][
¯][
¯]
mimi - Fr 20.06.03 19:39
schon, aber die karten sind 150 mal 150 pixel breit und der 2D array ist genauso breit, fält dir ne besserelösung ein ?
Tweafis - Fr 20.06.03 19:41
Hmm ich dachte eigentlich das du ein Array[x,y] meinst, d.h. zur bestimmung der Karten. Hab ich wohl falsch verstanden
mimi - Fr 20.06.03 19:53
Delphi-Quelltext
1:
| Hmm ich dachte eigentlich das du ein Array[x,y] meinst, d.h. zur bestimmung der Karten. Hab ich wohl falsch verstanden |
nein du hast es schon richtig verstanden:)
nur ich verwende z.z. ein 2D array von der größe: 150 mal 150 Pixel, und das ist wohl etwas zu groß da muss ich wohl ein 1D array nehmen, oder ?
Tweafis - Fr 20.06.03 20:11
150 x 150 Stück???
ich meine z.B. für das brauchst du 5 x 5 2D Array:
[¯][¯][¯][¯][¯]
[¯][¯][¯][¯][¯]
[¯][¯][¯][¯][¯]
[¯][¯][¯][¯][¯]
[¯][¯][¯][¯][¯]
und das jeweils ein record mit den Infos über die Karte
Und da du von Pixels sprichst, meine ich du sprichst über das Bitmap der Memory-Karte?
mimi - Fr 20.06.03 20:52
nein so groß ist eine grafik ich habe nur 4 stück unten und oben
Terra23 - Mi 25.06.03 14:50
@Mimi: Wenn du magst, kann ich dir mal den Quellcode zu meinem Memory schicken. Ist entwickelt mit meinem I-Lehrer und funktioniert. Schickst mir einfach eine PN..
mimi - Mi 02.07.03 14:17
habe den fehler gefunden:)
deine procendure funktionierte einbandfrei....
danke für deine hilfe.....
Terra23 - Mi 02.07.03 17:27
Wessen Prozedur? Hast du den Quellcode eigentlich bekommen, sprich, wurde die Mail korrekt verschickt?
mimi - Mi 02.07.03 20:52
ich meinte die von "Simon Joker" :)
dein qullcode haeb ich bekommen. hast du meine mail nicht bekommen ? das wundert mich aber...
Terra23 - Do 03.07.03 14:16
@Mimi: Mal schauen. Doch, da sind zwei Mail. Mein Problem ist nämlich folgendes: Normalerweise nehme ich Outlook zum Aufrufen der Mails. Nun habe ich meinenWebspace bei Arcor und die geben dir ja dazu eine Mail-Addy, die wie der Webspace heißt (sprich:
terra23@arcor.de). Nun habe ich ja die Möglichkeit, mehrere Mail-Addys dazu zu bekommen und eben diese neue Mail-Addy ruft mein Outlook nicht auf, obwohl im Arcor diese Addy als Standard definiert ist. Verstehst du? :lol: Nun ja. Zum Memory muß ich sagen, daß ich damals kaum Ahnung von Delphi hatte (einige sagen sicher, die hätte ich heute auch noch nicht.. :rofl:) und einen großen Teil des Codes mein Lehrer geschrieben hat. Wie gesagt, ich habe so die Feinheiten gemacht, Abfragen, Musik, Design etc. Hoffe, dein Memo gelingt dir. :-)
mimi - Do 03.07.03 15:02
sieht ganz so aus:) wollen wir es gemeinsam entwickeln ?
ich machse es mit glxTreem.... könntes ja die grafik und so machen.
hast du denn meine mail jetzt bekommen ?
mimi - Sa 02.08.03 13:54
so habe ein neues problem:
ich habe eine images liste 1..15 verschiende karten zur auswahl, davon sollen nur 8 karten angezeigt werden (0 ist das deckblatt) und nun möchte ich gerne das diese 8 karten immer per zufall aus diesen 15 karten genommen wird.
ich habe die procedure so umgeänderd:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure FillArray; var IntArr:array of integer; x,i,M,Ind,y:integer; begin SetLength( IntArr,(MapX+1)*(MapY+1)); for i:=0 to High(IntArr)+1 do begin IntArr[i]:=i div 2; end;
Randomize; for i:=0 to High(IntArr) do begin Ind:=Random( (MapX+1)*(MapY+1)); M:=IntArr[i]; IntArr[i]:=IntArr[Ind]; IntArr[Ind]:=M; end;
ind:=0; for x:=0 to MapX do begin for y:=0 to MapY do begin Map[x,y].Typ2:=IntArr[Ind]+1; inc(ind); end; end; end; |
kann mir da wer helfen ?
Danke...
Simon Joker - Mo 04.08.03 09:18
Hi Mimi
ich weis jetzt nicht wie genau du meine Procedur verändert hast, ABER mit
Delphi-Quelltext
1: 2: 3:
| for i:=0 to High(IntArr)+1 do begin IntArr[i]:=i div 2; end; |
greift du auf Speicher zu, der dir nicht gehört! Zugriffsverletzung ist unausweichlich.
Zu den 8 aus 15, ein schneller Einfall:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var IndList:TStringlist; ... IndList:=TStringlist.Create; for i:=1 to 15 do IndList.Add(IntToStr(i)); for i:=1 to 15-8 do IndList.Delete(Random(IndList.Count)); SetLength( IntArr,16); for i:=0 to 7 do begin IntArr[i*2]:=StrToInt(IndList.Strings[i]); IntArr[i*2+1]:=StrToInt(IndList.Strings[i]); end; |
mimi - Mo 04.08.03 14:18
muss ich mal testen, den code habe ich auf jedenfall nicht viel verändern:)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!