| Autor |
Beitrag |
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 28.07.03 18:52
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:
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....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 31.07.03 18:00
keine ne idee wie ist fuinktinieren könnte ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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  ,
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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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: www.delphi-forum.de/...;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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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  )
mail erhälst du per PN
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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...
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
|