Entwickler-Ecke
Multimedia / Grafik - KI = Memory
mimi - Mo 28.07.03 18:52
Titel: KI = Memory
Hallo,
ich will für mein memory spiel eine ki bauen und habe jetzt auch schon etwas code, aber es funktioniert leider nicht so wie ich es haben will seit gestern versuche ich es hinzubekekommen, der 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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126:
| function isDa(Typ:Integer):integer; var i:Integer; begin result:=-1; for i:=0 to High(KI.karten1) do begin if KI.Karten1[i].typ = Typ then begin result:=i; Exit; end; end; end;
function isDa1(Typ:Integer):Integer; var i:Integer; begin result:=-1; for i:=0 to High(KI.karten) do begin if KI.Karten[i].typ = Typ then begin result:=i; Exit; end; end; end;
function is_Karte(x,y:Integer):Boolean; var i,index:Integer; begin if KI.zugIndex+1 <= HIGH(KI.Karten) then inc(KI.zugIndex); if KI.zugIndex <= HIGH(KI.Karten) then begin index:=(MapX+1)*(MapY+1)-GetTex2(0); if (Index = 1) and (ki.Karten[KI.zugIndex].typ = -1) then begin ki.Karten[KI.zugIndex].typ:=Map[x,y].Tex2; ki.Karten[KI.zugIndex].x:=x; ki.Karten[KI.zugIndex].y:=y; result:=True; Exit;
end; if (Index = 2) and (ki.Karten1[KI.zugIndex].typ = -1) then begin ki.Karten1[KI.zugIndex].typ:=Map[x,y].Tex2; ki.Karten1[KI.zugIndex].x:=x; ki.Karten1[KI.zugIndex].y:=y; result:=True; Exit;
end; end else KI.zugIndex:=0;
result:=False; end;
procedure KI_Ebaled(Enabled:Boolean); begin ki.enabled:=Enabled; end;
procedure CreateKI; var i:Integer; begin KI.ClearMemmoryTime:=30; KI.enabled:=True; KI.zugIndex:=0; KI.lastzugTyp:=0; KI.Zuege:=0; KI.Paare:=0; SetLength(ki.karten,20); SetLength(ki.karten1,20); for i:=0 to 20 do begin ki.Karten[i].typ:=-1; ki.Karten1[i].typ:=-1; end; end;
procedure KI_Run; var rX,rY,i:Integer; test:Boolean; pos:TPos; begin test:=False; if KI.enabled = True then begin Randomize;
for i:=0 to HIGH(KI.Karten) do begin if isDa(KI.Karten1[i].typ) > -1 then ShowMessage(IntToStr(isDa(KI.Karten[i].typ)));
if (isDa(KI.Karten[i].typ) <> -1 ) and (KI.Karten[i].typ <> -1) then begin pos:=KI.karten1[isDa(KI.Karten[i].typ)]; rx:=pos.x; ry:=pos.Y; test:=True; break; end; end;
if test = False then begin repeat rX:=Random(MapX+1); rY:=Random(MapY+1); until (is_Karte(rX,rY) = False) and (Map[rX,rY].Typ <> None); end;
if (MapX+1)*(MapY+1)-GetTex2(0) < 2 then begin KI.lastzugTyp:=Map[rX,rY].Tex2; Map[rX,rY].Tex:=Map[rX,rY].Tex2; end else begin KI.Enabled:=False; inc(ki.Zuege); if GetTex2(Map[rX, rY].Tex) = 2 then begin inc(ki.Paare); SetKarteVisible( ki.lastzugTyp ); end; end; end
end; |
die ki soll folgendes machen:
Karte ziehen( erster zug) speichern in KI.karte
dann soll sie wieder ziehen(zweiter zug) und soll es in ki.karte1 feshalten
zwei array deshalb, für jeden zug eines paares in einen eingen array da die ki sonst ja nicht weiß wo die zweite karte ist.
nun soll sie schauen ob ich ich zwei gleiche karten(typ) wenn ja wähle diese karten aus.
aber irgenwie geht das nicht so recht, wenn mir jemmand helfen will wäre ich dankbar:)
bitte mit code antworten danke....
mimi - Do 31.07.03 18:00
keine ne idee wie ist fuinktinieren könnte ?
mimi - Sa 02.08.03 16:21
irngewo muss da im code ein gedaken fehler sein, naja scheint keiner zu wissen wo.
ich habe ein neues memory angefangen und baue dort eine neue KI also kann man diesen trehd hier löschen....
Keldorn - Sa 02.08.03 20:49
Hallo
wie soll denn einer wissen, wo der Fehler ist, wenn du nicht mal schreibst WAS genau nicht geht :roll: ,
der Code alleine nützt da auch nicht viel, wenn man nicht debuggen kann.
trotdem ein paar Anmerkungen, was mir auf den ersten blick aufgefallen ist:
| Zitat: |
SetLength(ki.karten,20);
SetLength(ki.karten1,20);
for i:=0 to 20 do begin
ki.Karten[i].typ:=-1;
ki.Karten1[i].typ:=-1;
end;
|
grober Schnitzer, wenn du setlenght(...,20) aufrufst, ist dein letzter eintrag 19, nicht 20. bei aktivierter bereichsprüfung bekommst du eine Exception
| Zitat: |
if KI.enabled = True then begin
Randomize;
|
randomize sollte man nur einmal aufrufen. (steht so auch in der Hilfe bzw. Suche mal nach Randomize und als Autor nach Luckie, der hat das kürzlich erklärt)
Mfg Frank
mimi - Sa 02.08.03 21:05
Delphi-Quelltext
1: 2:
| if KI.enabled = True then begin Randomize |
dabei habe ich mir was gedacht:)
der fehler ist folgender:
die ki sucht nicht in die zwei array ob sie nicht zwei gleiche karten schon hat.
Keldorn - Sa 02.08.03 21:29
| mimi hat folgendes geschrieben: |
dabei habe ich mir was gedacht:)
|
nee, haste nicht. randomize reicht zu wenn du es einmal im Programm aufrufst. Erklärung:
http://www.delphi-forum.de/viewtopic.php?t=14572&highlight=randomize
mit dem Fehler: hmm also nur mit dem Codeschnippsel wirds schwierig, dazu müßte man den kompletten Code haben, wo man mal durchsteppen kann.
Mfg Frank
mimi - Sa 02.08.03 21:44
soll ich dir mal das spiel senden ?
weil das sind eingentlich die wichtigtsten funktionen die ich gepostet habe.
zu randomins:
das rufe ich nur auf wenn die ki dran kommt das heißt drei mal danach kommt der spieler dran auch dreimal, aber dran kann es nicht liegen ist liegt warscheinlich an folgende if abfrage:
if (isDa(KI.Karten[i].typ) <> -1 ) and (KI.Karten[i].typ <> -1) then begin
Keldorn - Sa 02.08.03 21:51
kannst du machen,
weiß aber nciht, ob ich gleich dazu komme und bitte packen (hab nur eine 56K Modem :cry: )
mail erhälst du per PN
Mfg Frank
mimi - Sa 02.08.03 21:59
| Zitat: |
weiß aber nciht, ob ich gleich dazu komme und bitte packen (hab nur eine 56K Modem )
|
ich packe immer sachen die ich übers internet sende:)
sind 405 KB
als zip file...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!