Autor Beitrag
herni
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Di 14.03.06 21:33 
Hallo Leute,
ich habe angefangen das Brettspiel Mühle zu programmieren. Ihr könnt es euch hier runterladen: web25.ks1.kdsrv.de/leer/muele.rar

So ich habe mir wie ihr seht ein Feld mit 24 Images gemacht. Und in der Prozedur pruefmuehle kommt es zu einem Problem. Startet das Spiel mal, klickt auf "Neues Spiel" und dann an eine beliebige Position, wo ihr euren Stein hinsetzen wollt. Und dann kommt es in der Prozedur pruefmuehle in Zeile 113 zu irgend einem Zugriffsfehler. Leider kann ich mir der kryptischen Fehlermeldung nicht viel anfangen, aber ich hoffe das mir jemand helfen kann, da mir nicht klar ist wo das Problem liegt. In den anderen Prozeduren funktioniert das Zugreifen auf die Images per feld[i] ja auch. Wäre euch sehr dankbar wenn mir hier jemand weiterhelfen könnte.

P.S.: Bitte nicht erschrecken, die Grafik werde ich noch etwas schicker gestalten :-)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 14.03.06 21:43 
poste mal denn quelltext der betroffenen procedure.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 14.03.06 21:53 
also wenn ich anstelle von
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
   begin
  linie[j]:= true;
  {prozedur die stein wegnimmt}
  end;
i:=i+3;
inc(j);
Until j=16;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 begin
  linie[j]:= true;
  {prozedur die stein wegnimmt}
  end;
i:=i+1;
inc(j);
Until j=16;
end;

schreibe klappt es wunderbar ;)
"i" nimms ansonsten nach der repeat-prozedur einen wert von 48 (16*3) an, und dieser ist in deinem array ja nicht definiert :)


Zuletzt bearbeitet von Marc. am Di 14.03.06 22:24, insgesamt 4-mal bearbeitet
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 14.03.06 21:55 
das reicht mir nicht! ich brauche die ganze procedure!

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 14.03.06 21:56 
er hat seine quelltext doch hochgeladen :roll:

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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    P1: TImage;
    P2: TImage;
    P3: TImage;
    P5: TImage;
    P4: TImage;
    P6: TImage;
    P7: TImage;
    P8: TImage;
    P9: TImage;
    P10: TImage;
    P11: TImage;
    P12: TImage;
    P13: TImage;
    P14: TImage;
    P15: TImage;
    P16: TImage;
    P17: TImage;
    P18: TImage;
    P19: TImage;
    P20: TImage;
    P21: TImage;
    P22: TImage;
    P23: TImage;
    P24: TImage;
    Start: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;

    procedure SchwarzSetzt(var anzahl_schwarz:integer);
    procedure StartClick(Sender: TObject);
    procedure WeissSetzt(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure pruefmuehle(farbe: string);




  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  anzahl_weiss, anzahl_schwarz: integer;
  feld: array [1..24of TImage;
  linie: array [1..16of boolean;

implementation

{$R *.dfm}

procedure TForm1.WeissSetzt(Sender: TObject);
begin
IF anzahl_weiss>=1 then
  begin
  IF TImage(Sender).Tag=0 then
    begin
    TImage(Sender).Picture.LoadFromFile('muehlstein_weiss.bmp');
    TImage(Sender).Tag:=1;
    anzahl_weiss:=anzahl_weiss-1;
    Label2.Caption:=inttostr(anzahl_weiss);
    SchwarzSetzt(anzahl_schwarz);
    end
    else
    begin
    IF (TImage(Sender).Tag=1OR (TImage(Sender).Tag=2then Application.MessageBox('Hier befindet sich bereits ein Stein, bitte wählen Sie einen freien Platz!','Bereits belegt',MB_OK);
    end;
  end;
end;

procedure TForm1.SchwarzSetzt(var anzahl_schwarz:integer);
var gesetzt: boolean;
    i: integer;
begin
gesetzt:=false;
Repeat
  i:=random(23)+1;
  If feld[i].Tag=0 then
    begin
    feld[i].Picture.LoadFromFile('muehlstein_schwarz.bmp');
    feld[i].Tag:=2;
    gesetzt:=true;
    anzahl_schwarz:=anzahl_schwarz-1;
    Label4.Caption:=inttostr(anzahl_schwarz);
    end;
Until gesetzt=true;
pruefmuehle('schwarz');
end;

procedure TForm1.pruefmuehle(farbe: string);
var i,j,f: integer;
begin
If farbe='schwarz' then f:=2;
If farbe='weiss' then f:=1;
i:=1;
j:=1;
Repeat
If (feld[i].Tag=f) and (feld[i+1].Tag=f) and (feld[i+2].Tag=f) and (linie[j]=false) then
  begin
  linie[j]:= true;
  {prozedur die stein wegnimmt}
  end;
i:=i+1;
inc(j);
Until j=16;
end;

procedure TForm1.StartClick(Sender: TObject);
var i: integer;
begin
For i:=1 To 24 Do
  begin
  feld[i].Picture.LoadFromFile('muehlstein_leer.bmp');
  feld[i].Tag:=0;
  end;
anzahl_schwarz:=9;
anzahl_weiss:=9;
Label2.Caption:=inttostr(9);
Label4.Caption:=inttostr(9);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
feld[1]:=P1;
feld[2]:=P2;
feld[3]:=P3;
feld[4]:=P4;
feld[5]:=P5;
feld[6]:=P6;
feld[7]:=P7;
feld[8]:=P8;
feld[9]:=P9;
feld[10]:=P10;
feld[11]:=P11;
feld[12]:=P12;
feld[13]:=P13;
feld[14]:=P14;
feld[15]:=P15;
feld[16]:=P16;
feld[17]:=P17;
feld[18]:=P18;
feld[19]:=P19;
feld[20]:=P20;
feld[21]:=P21;
feld[22]:=P22;
feld[23]:=P23;
feld[24]:=P24;
For i:=1 To 16 Do
  begin
  linie[i]:=false;
  end;
end;

end.


bitte schön ;)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 14.03.06 22:18 
was ist 3*16?

das ist auf jeden fall dein fehler.

du incrementierst zum einen j 16 mal. zum anderen un jeder runde i um 3. machst du das ganze 16 runden lang bist du bei 48! was deutlich jenseits von 24 liegt. und das ist ja die obergrenze deines arrays auf das du mit i zugreifst.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 14.03.06 22:20 
habe ich doch schon gesagt :lol:
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 14.03.06 22:28 
du kannst auch nicht so einfach auf eine "linie" prüfen. dazu musst du schon ganz genau alle möglichen kombinationen wie eine linie auftreten kann probieren. allerdings kannst du dir das vereinfach indem du dir ein konstantes array anlegst das die indices der jeweiligen drei felder aufnimmt die eine linie bilden.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?