Autor Beitrag
Snippy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Mo 04.08.03 15:53 
Hi!

Da is das Prog : [url=www.snippytown.de/Delphi/Kniffel.exe]Klick mich![/url]

Wäre euch dankbar, wenn ihr es mal auf Fehler prüfen würdet und es einen netten Menschen gäbe, der mir mal die große Straße codet ;D

[url=www.snippytown.de/De....ace]Quellcode[/url]

Danke

_________________
Carpe Diem!
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 05.08.03 21:18 
hallo

Wenns geht, packe bitte das nächste mal mit ZIP, Ace hat auch nich jeder.
also gehen tuts erstemal. aber nimms mir nicht übel - du hast programmiertechnich noch einige Lücken.

Grafisch wären sicherlich noch ein paar Änderungen nötig (das gescannte Image sind nich ganz so gut aus, die Würfel werden nur aus Zahlen dargestellt. Auch sehe ich nirgends, wann/welcher Spieler drann ist

dein Code umfaßt sage und schreibe über 2900 Zeilen :shock: . das sind viel zu viele. vor allem weil in vielen Procs immer wieder das selbe gamacht wird.
Auch wirst du später nie wieder durchsehen, wenn du deinen Componenten keine sinnvollen Namen gibst, Weißt du auf anhieb deine 61 Labels und 49 Buttons ?

Du solltest dich trotzdem nochmal mit ein paar Sachen auseinandersetzen: insbesondere Schleifen, Arrays (siehe onlinehilfe und Tutorialseiten, z.B. auf delphi-source
außerdem verwendest du überall real zahlen, obwohl es eigentlcih bloß integer sind

Möglichkeiten, dein Programm anders gestalten gibts viele.
insbesondere mit der Eigenschaft Tag von Buttons (da ist ein Beipiel in der Hilfe), da kann man sich viele Schreibarbeiten ersparen,
z.B. beim übertragen könntest du z.B. den Add-Buttons tags verwenden und beim Klick den Tag des senders abfragen und dann dass entsprechende Label mit der anzeige betrauen oder auch dort ein Stringgrid verwenden oder oder ...

hier ein kurzes Beispiel, wie du z.B. die Sache ein wenig eleganter - wenn du arrays und Schleifen verwendest lösen kannst.
gugg dir insbesondere das testen, wird zwar nicht alles getestet, aber so viele Zeilen wie bei dir sind gar nicht nötig.
der code ist zwar sicherlich nicht das non+ultra, ich hab versucht es sehr einfach zu halten, versuch mal, ob du klar kommst
pack auf dein neues Formular 3 Buttons, 1Stringgrid, 1Label, benenn sie entsprechend meiner Schreibweise und weiß im Objektinspektor beim Onklick-ereignis die jeweilige Clickprocedure zu.
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:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm3 = class(TForm)
    ButtonNeuWuerfeln: TButton;
    StringGrid_Wuerfel: TStringGrid;
    ButtonTesten: TButton;
    Label1: TLabel;
    ButtonErneutWuerfeln: TButton;
    procedure ButtonNeuWuerfelnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid_WuerfelClick(Sender: TObject);
    procedure ButtonTestenClick(Sender: TObject);
    procedure ButtonErneutWuerfelnClick(Sender: TObject);
  private
    { Private-Deklarationen }
    Wuerfel,  //die aktuellen Würfel
    RausgelegteWuerfel: array [1..5of integer;//die rausgelegten Würfel
    Procedure WuerfelAnzeigen;
    Function WuerfelAnzahl(W:integer):integer;
    Function WuerfelPunkte(w:integer):integer; 
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
Var i:integer;
begin
  randomize; //wird nur einmal aufgerufen
  //initalisieren
  for i:=1 to 5 do Wuerfel[i]:=0;
  //das Grid soll nur als Beispiel und zur vereinfachten Darstellung dienen
  //Du könntest z.B. ein drawgrid nehmen und statt der Zahlen die Wuerfel als richtige Grafik im Drawgrid zeichnen
  //Möglichkeiten gibts da viele
  with StringGrid_Wuerfel do
    begin
      FixedCols := 1;
      FixedRows := 1;
      RowCount:=2;
      ColCount := 6;
      cells[0,1]:='rausgelegt';
      DefaultColWidth := 30;
      ColWidths[0]:=60;
    end;
end;

procedure TForm3.ButtonNeuWuerfelnClick(Sender: TObject);
Var I:integer;
begin
  //Würfeln
  for i:=1 to 5 do
    begin
      Wuerfel[i]:=random(6)+1;
      RausgelegteWuerfel[i]:=0;
    end;
  WuerfelAnzeigen;
end;

procedure TForm3.ButtonErneutWuerfelnClick(Sender: TObject);
Var I:integer;
begin
  //Würfeln
  for i:=1 to 5 do
   //nur dort, wo kein Wuerfel rausgelegt wurde
   if Wuerfel[i]<>0 then
    begin
      Wuerfel[i]:=random(6)+1;
      RausgelegteWuerfel[i]:=0;
    end;
  WuerfelAnzeigen;
end;

procedure TForm3.StringGrid_WuerfelClick(Sender: TObject);
begin
  //ein click im Strunggrid, den Würfel der entsprechenden Spalte rauslegen
  //ein klick auf die weißen Felder im grid genügt
  with StringGrid_Wuerfel do
    begin
      if col in [1..5then
        begin
          if Wuerfel[col]<>0 then
            begin
              //wuerfel kann rausgelegt werden
              RausgelegteWuerfel[col]:=Wuerfel[col];
              Wuerfel[col]:=0;
            end;
        end;
    end;
  WuerfelAnzeigen;
end;

procedure TForm3.ButtonTestenClick(Sender: TObject);
Var W,erg,i,i2:integer;
    ok:boolean;
begin
  Label1.Caption := 'nix';
  //normale Anzahl testen
  for W:=1 to 6 do
    begin
      erg := WuerfelAnzahl(W);
      if erg>=3 then
        begin
          label1.Caption:='Würfel '+ inttostr(W) +' wurde '+inttostr(erg)+' x gewürfelt - Punkte: '+inttostr(WuerfelPunkte(W));
          break; //schleife abbrechen
        end;
    end;

  //kleine straße testen (Beispiel1) - oder eine Schleife wie im Beispiel große Straße
  if (WuerfelAnzahl(1)=1and (WuerfelAnzahl(2)=1and (WuerfelAnzahl(3)=1and (WuerfelAnzahl(4)=1and (WuerfelAnzahl(5)=1then
    label1.Caption := 'kleine Straße';

  //große straße testen
  //Code wie kleine Straße oder auch hier ist eine Schleife möglich
  ok:=true;
  for i:=2 to 6 do
   if WuerfelAnzahl(i)<>1 then
    begin
      ok:=false;
      break;
    end;
  if ok then label1.Caption := 'große Straße';

  //Full house testen   3 + 2 gleiche Würfel
  ok:=false;
  for i:=1 to 6 do
   for i2:=1 to 6 do
    begin
      if (WuerfelAnzahl(i)=3and (WuerfelAnzahl(i2)=2then ok :=true;
    end;
  if ok then Label1.Caption := 'Fullhouse';
end;


procedure TForm3.WuerfelAnzeigen;
Var i:integer;
begin
  //Würfel im Stringgird für Kontrollzwecke anzeigen
  with StringGrid_Wuerfel do
   for i:=1 to 5 do
    begin
      if Wuerfel[i]<>0 then Cells[i,0]:=inttostr(Wuerfel[i])
                       else Cells[i,0]:='';
      if RausgelegteWuerfel[i]<>0 then Cells[i,1]:=inttostr(RausgelegteWuerfel[i])
                                  else Cells[i,1]:='';
    end;
end;

function TForm3.WuerfelAnzahl(W: integer): integer;
Var i:integer;
begin
  //gibt die Anzahl der Wuerfel (W) im rausgelegtemWuerfelArray zurück
  result:=0;
  for i:=1 to 5 do
    if RausgelegteWuerfel[i]=W then inc(result);
end;

function TForm3.WuerfelPunkte(w: integer): integer;
Var i:integer;
begin
  //gibt die Punkte der Wuerfel (W) im rausgelegtemWuerfelArray zurück
  result:=0;
  for i:=1 to 5 do
    if RausgelegteWuerfel[i]=W then inc(result,W);
end;

end.


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Snippy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Mi 06.08.03 18:22 
Danke schonmal!

Ich code auch noch nicht wirklich lange und habe mich damit auch noch nicht soo dolle auseinandergesetzt.

Also wenn der Code nicht so klasse ist ..... hauptsache es geht ;D

Cu

_________________
Carpe Diem!
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mi 01.06.05 22:15 
Also ich habe diesen Code hier zu einer kleinen Straße geschrieben, der sich natürlich auf eine große erweitern lässt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  i:=1;
  i:=i+1;
  for i:=1 to 3 do
  If (a=i) or (b=i) or (c=i) or (d=i) or (e=i) and
     (a=i+1or (b=i+1or (c=i+1or (d=i+1or (e=i+1and
     (a=i+2or (b=i+2or (c=i+2or (d=i+2or (e=i+2and
     (a=i+3or (b=i+3or (c=i+3or (d=i+3or (e=i+3then
     SGUnten.Cells[0,3]:='30';

Nur leider sagt er immer, daß es eine kleine Straße ist, egal welchen Ausfall die Würfel haben, auch bei 3-3-4-4-4 z.b.
Woran liegt das und wie kann ich es beheben? Weil normalerweise müsste er die Schleife durchmachen, bis i=3 ist, dann die erste Zeile als true abstempeln (3 ist ja dabei), dann die zweite Zeile auch (i+4 -> 4 ist dabei -> true), aber dann müsste er false sagen, weil 5 (i+2 -> 3+2) ja gar nicht dabei ist. Trotzdem kommt ne kleine Straße bei heraus. Ausnahme ist 0-0-0-0-0 (Startwürfel), da passiert nix.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Di 21.06.05 17:55 
Klammern um alle or??

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
i:=1;
  i:=i+1;
  for i:=1 to 3 do
  If ((a=i) or (b=i) or (c=i) or (d=i) or (e=i)) and
     ((a=i+1or (b=i+1or (c=i+1or (d=i+1or (e=i+1)) and
     ((a=i+2or (b=i+2or (c=i+2or (d=i+2or (e=i+2)) and
     ((a=i+3or (b=i+3or (c=i+3or (d=i+3or (e=i+3)) then
     SGUnten.Cells[0,3]:='30';


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.
DelphiChecker
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 01.06.06 09:01 
hm... eine Frage zu deinem Kniffelquelltext bei mir wird ein fehler bei form3.stringgird_wuerfeln und form3.buttenNeuWuerfeln angezeigt. Die besitzen keine Komponente... könnt ihr mir weiter helfen?
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Do 01.06.06 09:19 
user profile iconDelphiChecker hat folgendes geschrieben:
hm... eine Frage zu deinem Kniffelquelltext bei mir wird ein fehler bei form3.stringgird_wuerfeln und form3.buttenNeuWuerfeln angezeigt. Die besitzen keine Komponente... könnt ihr mir weiter helfen?


Hast du denn eine Form mit dem Namen "form3" und darauf ein Stringgrid mit dem Namen "stringgird_wuerfeln" sowie einen Button mit dem Namen "buttenNeuWuerfeln" ?
DelphiChecker
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 08.06.06 07:57 
Ja hab ich den ersten Button und das stringrid funktionieren mittlerweile,jetzt klappt es bei dem Button "testen" und "erneutWuerfeln" nicht. Was soll ich nun machen? Das Programm an sich kann auch gestartet werden,nur leider funktioniert dann nichts mehr...
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Do 08.06.06 09:09 
user profile iconDelphiChecker hat folgendes geschrieben:
Ja hab ich den ersten Button und das stringrid funktionieren mittlerweile,jetzt klappt es bei dem Button "testen" und "erneutWuerfeln" nicht. Was soll ich nun machen? Das Programm an sich kann auch gestartet werden,nur leider funktioniert dann nichts mehr...


Was klappt denn nicht ? Zeig mal deinen Quellcode..