Autor Beitrag
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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 ;-) )

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Karte: array [1..52of 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 < 16or (wertcomp<wertspieler) then
  stand_btnClick(Sender);
 if (wertcomp > 15and (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
      0begin
          WertComp:= WertComp + Karte[ran].wert;
          if (ran<=52and (ran>48)   then
          inc(asscom);
         end;
      1begin
          WertSpieler:= WertSpieler + Karte[ran].wert;
          if (ran<=52and (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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.03.09 16:30 
Der Stacküberlauf kann eigentlich auf den ersten Blick nur hier verursacht werden:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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