Autor |
Beitrag |
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 18.12.08 18:17
Meine Funktion liefert ja die "beste" Variante.
Möglich wäre es natürlich, weiß ja nicht, wie der Rest deines Programms aussieht, die Hand als Objekt abzubilden. Dann könntest du eine Hand.Add(Karte) Methode erstellen, die der Hand eine Karte hinzufügt und eine Hand.Wert Funktion, die die aktuelle Wertigkeit des Blatts auf der Hand liefert.
|
|
Disco-tru 
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 03.03.09 16:09
So, ich hab die Datei erst jetzt aktualisiert, nachdem ich lange keine Zeit hatte, weiterzuarbeiten...
Folgende Probleme:
- Manchmal (Möglicherweise wenn ich eine Ass ziehe) und auf Stand klicke, initialisiert der PC neu...
der Quelltext dazu: (vielleicht kann man den noch ein wenig vereinfachen, bitte um Tips  )
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: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253:
| unit Game_Unit;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TKarten = Record bild : TBitmap; wert : integer; benutzt : boolean; end; TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Image8: TImage; Image9: TImage; Image10: TImage; start_btn: TButton; karte_btn: TButton; stand_btn: TButton; lblpc: TLabel; lblsp: TLabel; btn_neu: TButton; SiegeComp: TLabel; SiegeSpiel: TLabel; procedure FormCreate(Sender: TObject); procedure start_btnClick(Sender: TObject); procedure Karteermitteln(wer:integer); procedure karte_btnClick(Sender: TObject); procedure stand_btnClick(Sender: TObject); procedure btn_neuClick(Sender: TObject); procedure init; procedure labels; private public end;
var Form1: TForm1; Karte: array [1..52] of TKarten; WertComp,WertSpieler,ran,imgstelle,imgstelle2,Swin,Cwin,AssCom,Assspiel: integer; Ass_used: boolean;
implementation
{$R *.DFM}
procedure TForm1.btn_neuClick(Sender: TObject); begin cwin:=0; swin:=0; labels; init; end;
procedure TForm1.FormCreate(Sender: TObject); var i,j,count : integer; farbstr,cardstr: string; begin init; randomize; count:=1; cwin:=0; swin:=0; for i:= 2 to 14 do begin cardstr:= inttostr(i); for j:= 1 to 4 do begin case j of 1: farbstr:='c'; 2: farbstr:='d'; 3: farbstr:='h'; 4: farbstr:='s'; end; Karte[count].bild := TBitmap.Create; Karte[count].bild.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\' + cardstr + farbstr + '.bmp'); Karte[count].benutzt := false; if i < 10 then Karte[count].wert:=i; if i >= 10 then Karte[count].wert:=10; if i = 14 then Karte[count].wert:=11; inc(count); end; end; end;
procedure TForm1.stand_btnClick(Sender: TObject); begin Karteermitteln(0); case imgstelle2 of 7: image7.Picture.Bitmap:= Karte[ran].bild; 8: image8.Picture.Bitmap:= Karte[ran].bild; 9: image9.Picture.Bitmap:= Karte[ran].bild; 10: image10.Picture.Bitmap:= Karte[ran].bild; end; inc(imgstelle2); karte_btn.Enabled:=false; lblpc.caption:= inttostr(wertcomp); if (wertcomp < 16) or (wertcomp<wertspieler) then stand_btnClick(Sender); if (wertcomp > 15) and (wertcomp>=wertspieler) then begin if wertcomp <= 21 then begin showmessage('Der Computer hat mit dem Wert '+inttostr(wertcomp)+' gewonnen!'); inc(Cwin); end else begin if asscom > 0 then begin dec(wertcomp, 10); dec(asscom); lblpc.Caption:= inttostr(wertcomp); end else begin showmessage('Der Computer hat mit dem Wert '+inttostr(wertcomp)+' verloren!'); inc(Swin); end; end; init; end; labels; end;
procedure TForm1.start_btnClick(Sender: TObject); begin WertComp:= 0; WertSpieler:= 0; karte_btn.Enabled:=true; stand_btn.Enabled:=true; start_btn.Enabled:=false; Karteermitteln(0); image1.Picture.Bitmap:= Karte[ran].bild; Karteermitteln(1); image2.Picture.Bitmap:= Karte[ran].bild; Karteermitteln(1); image3.Picture.Bitmap:= Karte[ran].bild; lblsp.caption:= inttostr(wertspieler); lblpc.caption:= inttostr(wertcomp); if wertspieler = 21 then begin showmessage('Der Spieler hat einen Black Jack! GEWONNEN! '); inc(Swin); init; labels; end; end;
procedure TForm1.Karteermitteln(wer:integer); begin ran:= random(52)+1; if Karte[ran].benutzt then Karteermitteln(wer) else begin case wer of 0: begin WertComp:= WertComp + Karte[ran].wert; if (ran<=52) and (ran>48) then inc(asscom); end; 1: begin WertSpieler:= WertSpieler + Karte[ran].wert; if (ran<=52) and (ran>48) then inc(assspiel); end; end; Karte[ran].benutzt := true; end; end;
procedure TForm1.karte_btnClick(Sender: TObject); begin Karteermitteln(1); case imgstelle of 4: image4.Picture.Bitmap:= Karte[ran].bild; 5: image5.Picture.Bitmap:= Karte[ran].bild; 6: image6.Picture.Bitmap:= Karte[ran].bild; end; lblsp.caption:= inttostr(wertspieler); inc(imgstelle); if wertspieler = 21 then begin showmessage('Der Spieler hat einen Black Jack! GEWONNEN! '); inc(Swin); init; end; if wertspieler > 21 then begin if assspiel>0 then begin dec(wertspieler, 10); dec(assspiel); lblsp.Caption:= inttostr(wertspieler); end else begin showmessage('Der Spieler hat mit dem Wert '+inttostr(wertspieler)+' verloren!'); inc(Cwin); init; end; end; labels; end;
procedure TForm1.init; var i: integer; begin for i := 1 to 52 do karte[i].benutzt:= false; asscom:=0; assspiel:=0; karte_btn.Enabled:=false; stand_btn.Enabled:=false; start_btn.Enabled:=true; imgstelle2:=7; WertComp:= 0; WertSpieler:= 0; imgstelle:= 4; lblpc.Caption:= ''; lblsp.Caption:= ''; image1.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image2.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image3.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image4.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image5.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image6.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image7.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image8.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image9.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); image10.Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Cards\ruecken.bmp'); end;
procedure TForm1.labels; begin SiegeComp.Caption:= 'Gewonnen: '+inttostr(Cwin); SiegeSpiel.Caption:= 'Gewonnen: '+inttostr(Swin); end;
end. |
Zuletzt bearbeitet von Disco-tru am Di 17.03.09 15:59, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 03.03.09 16:30
Der Stacküberlauf kann eigentlich auf den ersten Blick nur hier verursacht werden: Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Karteermitteln(wer:integer); begin ran:= random(52)+1; if Karte[ran].benutzt then Karteermitteln(wer) | Ich vermute einmal, dass benutzt bei allen Karten True ist, und dann gibts ne Endlosrekursion. Und auch, wenn z.B. noch eine Karte nicht benutzt ist, kann die genau nicht getroffen werden...
So ist das keine gute Idee. Entweder schaut man wieviele Karten noch da sind, zieht eine entsprechende Zahl und geht die möglichen Zahlen durch, nimmt also die x-te mögliche dann, oder man nimmt gleich die schon genutzten raus.
In jedem Fall musst du eine Abbruchbedingung benutzen, zudem kannst du auch einfach eine Schleife statt Rekursion benutzen.
|
|
Disco-tru 
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 17.03.09 16:01
habe nun oben den sourcecode geupdatet, habe allerdings noch dass problem, dass mir der computer manchmal (vermutlich hängt es damit zusammen, wenn der computer assen zieht), dass er sich selbst neu initialisiert und keinen gewinner ausgibt... dies passiert natürlich wenn ich auf den Stand_btn klicke...
woran könnte das liegen?
lg
|
|
|