Autor Beitrag
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 06.02.05 21:48 
hier mal mein ganzer code:

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:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
unit UMain;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    MainMenu1: TMainMenu;
    Spiel1: TMenuItem;
    Neustart1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image4Click(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure Image6Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Neustart1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i, j, k: integer;
  player: boolean;
  map: array of array of integer;
  able: array[1..9] of boolean;

implementation

{$R *.dfm}

function HCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[0,1] and map[0,2] = player then result:= true;
    if map[1,0] and map[1,1] and map[1,2] = player then result:= true;
    if map[2,0] and map[2,1] and map[2,2] = player then result:= true;
  end;
end;

function VCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[1,0] and map[2,0] = player then result:= true;
    if map[0,1] and map[1,1] and map[2,1] = player then result:= true;
    if map[0,2] and map[1,2] and map[2,2] = player then result:= true;
  end;
end;

function DCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[1,1] and map[2,2] = player then result:= true;
    if map[0,2] and map[1,1] and map[2,0] = player then result:= true;
  end;
end;

function WinCheck(Player: integer): boolean;
begin
  if HCheck(Player) or VCheck(Player) or DCheck(Player) = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  PMap : TComponent;
begin
  setlength(map,3,3);
  SetBounds((Screen.Width - Width) div 2, (Screen.Height - Height) div 2, Width, Height);
  player:= true;
  for j:= 0 to 2 do
    for k:= 0 to 2 do
      map[j,k]:= 0;
    for i:= 1 to 9 do begin
      able[i]:= true;
      PMap := FindComponent('image'+IntToStr(i));
      if PMap <> nil then with Timage(Pmap).Canvas do begin
        brush.color:= clwhite;
          rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width);
      end;
    end;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  if able[1] = true then begin
    if player = true then map[0,0]:= 1 else map[0,0]:= 2;
    player:= not player;
    if map[0,0] = 1 then with image1.Canvas do begin
      brush.Color:= clred;
        ellipse(0,0,image1.Width,image1.Height);
    end;
    if map[0,0] = 2 then with image1.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image1.Width,image1.Height);
    end;
    able[1]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
  if able[2] = true then begin
    if player = true then map[0,1]:= 1 else map[0,1]:= 2;
    player:= not player;
    if map[0,1] = 1 then with image2.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    if map[0,1] = 2 then with image2.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    able[2]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
  if able[3] = true then begin
    if player = true then map[0,2]:= 1 else map[0,2]:= 2;
    player:= not player;
    if map[0,2] = 1 then with image3.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    if map[0,2] = 2 then with image3.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    able[3]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image4Click(Sender: TObject);
begin
  if able[4] = true then begin
    if player = true then map[1,0]:= 1 else map[1,0]:= 2;
    player:= not player;
    if map[1,0] = 1 then with image4.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    if map[1,0] = 2 then with image4.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    able[4]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image5Click(Sender: TObject);
begin
  if able[5] = true then begin
    if player = true then map[1,1]:= 1 else map[1,1]:= 2;
    player:= not player;
    if map[1,1] = 1 then with image5.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    if map[1,1] = 2 then with image5.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    able[5]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image6Click(Sender: TObject);
begin
  if able[6] = true then begin
    if player = true then map[1,2]:= 1 else map[1,2]:= 2;
    player:= not player;
    if map[1,2] = 1 then with image6.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    if map[1,2] = 2 then with image6.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    able[6]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
  if able[7] = true then begin
    if player = true then map[2,0]:= 1 else map[2,0]:= 2;
    player:= not player;
    if map[2,0] = 1 then with image7.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    if map[2,0] = 2 then with image7.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    able[7]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
  if able[8] = true then begin
    if player = true then map[2,1]:= 1 else map[2,1]:= 2;
    player:= not player;
    if map[2,1] = 1 then with image8.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image8.Width,image8.Height);
   end;
    if map[2,1] = 2 then with image8.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image8.Width,image8.Height);
    end;
    able[8]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
  if able[9] = true then begin
    if player = true then map[2,2]:= 1 else map[2,2]:= 2;
    player:= not player;
    if map[2,2] = 1 then with image9.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    if map[2,2] = 2 then with image9.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    able[9]:= false;
  end;
  case player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  application.terminate;
end;

procedure TForm1.Neustart1Click(Sender: TObject);
var
  PMap : TComponent;
begin
  player:= true;
  for j:= 0 to 2 do
    for k:= 0 to 2 do
      map[j,k]:= 0;
    for i:= 1 to 9 do begin
      able[i]:= true;
      PMap := FindComponent('image'+IntToStr(i));
      if PMap <> nil then with Timage(Pmap).Canvas do begin
        brush.color:= clwhite;
        rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width);
      end;
    end;
end;

end
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 06.02.05 22:08 
Moin!

Zunächstmal: Du kannst ja doch Code formatieren! :wink: Glückwunsch. Jetzt kann man da auch mal reinsehen...

Ich habe mir den Code noch nicht genau genug angesehen, aber das fällt mir erstmal auf:
ausblenden Delphi-Quelltext
1:
if map[0,0] and map[0,1] and map[0,2] = player then result:= true;					

Das kann so nicht klappen, denn du vergleichst da das Ergebnis einer mehrfachen binären Und-Operation mit einem Integer. Also eigentlich passiert da sowas:
ausblenden Delphi-Quelltext
1:
if ( (map[0,0] and map[0,1] and map[0,2]) = player) then result:= true;					

Es wird also das Ergebnis der Und-Operationen mit der Variable player verglichen, das kann nicht das sein, was du willst.

Das ließe sich auch so formulieren:
ausblenden Delphi-Quelltext
1:
2:
3:
Result := ( (map[0,0] = player) and
  (map[0,1] = player) and
  (map[0,2] = player) );

Wenn du Ausdrücke klammerst, auch wenn das auf den ersten Blick nicht notwendig ist, dann passiert einem sowas nicht aus Versehen; ist auch einfacher beim Umstieg auf andere Programmiersprachen und man macht weniger Fehler in der Operatorenrangfolge.

----------
//EDIT: So, hab mir den Code mal angesehen; leider ist dein Konzept etwas... naja... egal. Da du dir die Arbeit mit dem Code gemacht hast, will ich dir im Gegenzug diesen Lösungsvorschlag machen:

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:
const
  // 0 1 2
  // 3 4 5
  // 6 7 8
  // Positionen der Gewinnreihen festlegen
  WinPos: Array [0..7,0..2] of Integer =
   ( (0,1,2), (3,4,5), (6,7,8), // horizontale
     (0,3,6), (1,4,7), (2,5,8), // vertikale
     (0,4,8), (2,4,6) );        // diagonale

type
  TPlayer = (pvNone,pvRed,pvBlue);

  TEndCondition = (ecRunning,ecRemis,ecRedWon,ecBlueWon);

  TMapPoint = record
    Image: TImage;
    Value: TPlayer;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    MainMenu1: TMainMenu;
    Spiel1: TMenuItem;
    Neustart1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Neustart1Click(Sender: TObject);
    procedure ImageClick(Sender: TObject);
    function CheckEndCondition: TEndCondition;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  CurrentPlayer: TPlayer;
  GameState: TEndCondition;
  Map: Array [0..8] of TMapPoint;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Image-Komponenten festlegen
  Map[0].Image := Image1;
  Map[1].Image := Image2;
  Map[2].Image := Image3;
  Map[3].Image := Image4;
  Map[4].Image := Image5;
  Map[5].Image := Image6;
  Map[6].Image := Image7;
  Map[7].Image := Image8;
  Map[8].Image := Image9;
  // Start ist auch Neustart
  Neustart1Click(Self);
end;

procedure TForm1.Neustart1Click(Sender: TObject);
  var
    i: Integer;
begin
  // Spielfeld und Datenstruktur leeren
  for i := 0 to 8 do begin
    with Map[i].Image.Canvas do begin
      Brush.Color := clWhite;
      Rectangle(0,0,Map[i].Image.Width,Map[i].Image.Height);
    end;
    Map[i].Value := pvNone;
  end;
  // Spielzustand
  GameState := ecRunning;
  // nächster Spieler ist:
  CurrentPlayer := pvRed;
end;

function TForm1.CheckEndCondition: TEndCondition;
  var
    i: Integer;
    FreeAvail: Boolean;
begin
  Result := ecRunning;
  FreeAvail := FALSE;
  // Gewinnbedingungen abfragen
  i := 0;
  while ( (i <= High(WinPos)) and (Result = ecRunning) ) do begin
    if ( (Map[WinPos[i,0]].Value = Map[WinPos[i,1]].Value) and
         (Map[WinPos[i,0]].Value = Map[WinPos[i,2]].Value) ) then
      case Map[WinPos[i,0]].Value of // Gewinnbedingung erfüllt
        pvRed:
          Result := ecRedWon;
        pvBlue:
          Result := ecBlueWon;
      end;
    Inc(i);
  end;
  // Remis?
  if (Result = ecRunning) then begin
    for i := 0 to 8 do
      FreeAvail := ( FreeAvail or (Map[i].Value = pvNone) );
    if (NOT FreeAvail) then
      Result := ecRemis;
  end;
end;

procedure TForm1.ImageClick(Sender: TObject);
  var
    i: Integer;
begin
  // wenn das Spiel noch läuft
  if (GameState < ecRemis) then begin
    // Image raussuchen
    i := 0;
    while (Map[i].Image <> Sender) do
      Inc(i);
    // wenn das Feld noch frei ist
    if (Map[i].Value = pvNone) then begin
      // Feld belegen
      Map[i].Value := CurrentPlayer;
      case CurrentPlayer of
        pvRed:
          begin
            Map[i].Image.Canvas.Brush.Color := clRed;
            CurrentPlayer := pvBlue;
          end;
        pvBlue:
          begin
            Map[i].Image.Canvas.Brush.Color := clBlue;
            CurrentPlayer := pvRed;
          end;
      end;
      Map[i].Image.Canvas.Ellipse(0,0,Map[i].Image.Width,Map[i].Image.Height);
      // neuen Spielzustand ermitteln: läuft noch, unentschieden, gewonnen
      GameState := CheckEndCondition;
      case GameState of
        ecRemis:
          ShowMessage('Unentschieden!');
        ecRedWon:
          ShowMessage('Rot hat gewonnen!');
        ecBlueWon:
          ShowMessage('Blau hat gewonnen!');
      end;
    end;
  end
  else
    ShowMessage('Das Spiel ist beendet!');
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  Application.Terminate;
end;


Entscheidende konzeptionelle Änderungen gegenüber deinem Code:
- um den Code überhaupt laufen lassen zu können, mußt du in deinem Projekt die OnClick-Ereignisse ALLER(!) Images auf die entsprechende, zentrale Prozedur umstellen
- statisches Feld, statt dynamisches (ist unnötig, da die Images auch statisch sind)
- alle zu einem Feld gehörenden Eigenschaften in ein Record verpackt, dazu entsprechende Aufzählungstypen angelegt
- die Gewinnbedingungen sind als 2d-Array fest im Code verankert; bei dem Spielfeld sind Algorithmen (egal welche) oversized!
- du hast keinen globalen Spielzustand in deinem Code gehabt und auch kein Remis
- wenn das Spiel beendet ist, geht nix mehr, bis man neu startet

Schau´s dir mal genau an und stell Fragen, wenn du etwas nicht verstanden hast; es wäre jetzt SEHR SCHADE (und ich ziemlich geknickt!), wenn du dir einen ins Fäustchen lachst nach dem Motto: "Endlich hat´s einer ausgespuckt! Hauptsache ist, man nervt lange genug rum und schreibt schön viele Schiebepostings", anstatt etwas daraus zu lernen.

cu
Narses

PS: Ich gebe zu, ich habe absichtlich gewartet, damit es nicht mehr für Montag erreichbar für dich ist; ich möchte so den "Hausaufgaben-Effekt" umgehen. Sorry. :wink:
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 07.02.05 13:32 
ich versteh nicht was du am anfang meintest, das funktioniert doch ???

nur mein problem ist, dass es erst beim nächsten klick abgefragt wird
und wenn die bedingung zum gewinnen mehrmals erfüllt wird, ist das spiel nicht gewonnen.

das liegt am if ... or ... or, da müsste sowas wie UND/ODER hin aber wie mache ich das ?

deinen code werde ich mal testen wenn ich zu Hause bin, also so gefällt der mir schonmal ganz gut ^^

Die Gewinn-Reihen in einem Array zu speichern ist natürlich net schlecht :lol:

ausblenden Delphi-Quelltext
1:
Neustart1Click(Self);					


sowas wollte ich auch machen, aber ich fands anfangs unelegant, ich wollte das zuerst auf eine externe procedure auslagern, aber du hast ja recht

dein code ist zwar recht schön, aber ich hätte es ja nicht wirklich alleine gelöst, der code weicht ja schon stark von meinem ab, ich würde aber gerne bei meinem code bleiben, wie kann meine beiden probleme in meinem code lösen, ohne viel zu ändern ?
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 07.02.05 14:31 
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:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
unit UMain;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    MainMenu1: TMainMenu;
    Spiel1: TMenuItem;
    Neustart1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image4Click(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure Image6Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
    procedure Neustart1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i, j, k: integer;
  player: boolean;
  map: array of array of integer;
  able: array[1..9] of boolean;

implementation

{$R *.dfm}

function HCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[0,1] and map[0,2] = player then result:= true;
    if map[1,0] and map[1,1] and map[1,2] = player then result:= true;
    if map[2,0] and map[2,1] and map[2,2] = player then result:= true;
  end;
end;

function VCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[1,0] and map[2,0] = player then result:= true;
    if map[0,1] and map[1,1] and map[2,1] = player then result:= true;
    if map[0,2] and map[1,2] and map[2,2] = player then result:= true;
  end;
end;

function DCheck(Player: integer): boolean;
begin
  result:= false;
  if player > 0 then begin
    if map[0,0] and map[1,1] and map[2,2] = player then result:= true;
    if map[0,2] and map[1,1] and map[2,0] = player then result:= true;
  end;
end;

procedure WinCheck(Player: integer);
var
  Win: boolean;
begin
  Win:= false;
  Win:= HCheck(Player);
  Win:= VCheck(Player);
  Win:= DCheck(Player);
  if Win = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  PMap : TComponent;
begin
  setlength(map,3,3);
  SetBounds((Screen.Width - Width) div 2, (Screen.Height - Height) div 2, Width, Height);
  player:= true;
  for j:= 0 to 2 do
    for k:= 0 to 2 do
      map[j,k]:= 0;
    for i:= 1 to 9 do begin
      able[i]:= true;
      PMap := FindComponent('image'+IntToStr(i));
      if PMap <> nil then with Timage(Pmap).Canvas do begin
        brush.color:= clwhite;
          rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width);
      end;
    end;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  if able[1] = true then begin
    if player = true then map[0,0]:= 1 else map[0,0]:= 2;
    player:= not player;
    if map[0,0] = 1 then with image1.Canvas do begin
      brush.Color:= clred;
        ellipse(0,0,image1.Width,image1.Height);
    end;
    if map[0,0] = 2 then with image1.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image1.Width,image1.Height);
    end;
    able[1]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
  if able[2] = true then begin
    if player = true then map[0,1]:= 1 else map[0,1]:= 2;
    player:= not player;
    if map[0,1] = 1 then with image2.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    if map[0,1] = 2 then with image2.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    able[2]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
  if able[3] = true then begin
    if player = true then map[0,2]:= 1 else map[0,2]:= 2;
    player:= not player;
    if map[0,2] = 1 then with image3.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    if map[0,2] = 2 then with image3.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    able[3]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image4Click(Sender: TObject);
begin
  if able[4] = true then begin
    if player = true then map[1,0]:= 1 else map[1,0]:= 2;
    player:= not player;
    if map[1,0] = 1 then with image4.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    if map[1,0] = 2 then with image4.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    able[4]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image5Click(Sender: TObject);
begin
  if able[5] = true then begin
    if player = true then map[1,1]:= 1 else map[1,1]:= 2;
    player:= not player;
    if map[1,1] = 1 then with image5.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    if map[1,1] = 2 then with image5.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    able[5]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image6Click(Sender: TObject);
begin
  if able[6] = true then begin
    if player = true then map[1,2]:= 1 else map[1,2]:= 2;
    player:= not player;
    if map[1,2] = 1 then with image6.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    if map[1,2] = 2 then with image6.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    able[6]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
  if able[7] = true then begin
    if player = true then map[2,0]:= 1 else map[2,0]:= 2;
    player:= not player;
    if map[2,0] = 1 then with image7.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    if map[2,0] = 2 then with image7.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    able[7]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
  if able[8] = true then begin
    if player = true then map[2,1]:= 1 else map[2,1]:= 2;
    player:= not player;
    if map[2,1] = 1 then with image8.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image8.Width,image8.Height);
   end;
    if map[2,1] = 2 then with image8.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image8.Width,image8.Height);
    end;
    able[8]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
  if able[9] = true then begin
    if player = true then map[2,2]:= 1 else map[2,2]:= 2;
    player:= not player;
    if map[2,2] = 1 then with image9.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    if map[2,2] = 2 then with image9.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    able[9]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  application.terminate;
end;

procedure TForm1.Neustart1Click(Sender: TObject);
var
  PMap : TComponent;
begin
  player:= true;
  for j:= 0 to 2 do
    for k:= 0 to 2 do
      map[j,k]:= 0;
    for i:= 1 to 9 do begin
      able[i]:= true;
      PMap := FindComponent('image'+IntToStr(i));
      if PMap <> nil then with Timage(Pmap).Canvas do begin
        brush.color:= clwhite;
        rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width);
      end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
wincheck(1);
end;

end.


jetzt funzt es !!!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.02.05 15:50 
Moin!

F34r0fTh3D4rk hat folgendes geschrieben:
jetzt funzt es !!!

Das glaub´ ich kaum, aber eins nach der Reihe... :wink:

F34r0fTh3D4rk hat folgendes geschrieben:
ich versteh nicht was du am anfang meintest, das funktioniert doch ???

Nein, das funktioniert nur zufällig, nicht beabsichtigt. :wink: Ich vermute mal, du hältst diese Zeile:
ausblenden Delphi-Quelltext
1:
if map[0,0] and map[0,1] and map[0,2] = player then result:= true;					

für eine Kurzform von:
ausblenden Delphi-Quelltext
1:
if (map[0,0] = player) and (map[0,1] = player) and (map[0,2] = player) then result:= true;					

oder? In deinem speziellen Fall ist das auch so, aber das kann man nicht verallgemeinern, denn in der 2. Zeile werden boolsche Ausdrücke logisch UND-Verknüpft, während in der 1. Zeile ein binäres Undieren der Variablen dem Vergleich vorausgeht und dieser erst das boolsche Ergebnis liefert. Das ist aber nicht allgemein das Gleiche!

F34r0fTh3D4rk hat folgendes geschrieben:
nur mein problem ist, dass es erst beim nächsten klick abgefragt wird

Nein, dein Problem ist, dass die Funktion WinCheck() nicht korrekt ist. Du rufst doch nach jedem Klick diese Funktion auf, aber sie erkennt einfach manche Gewinnreihen nicht, noch nicht bemerkt? Versuch mal damit zu gewinnen (O=rot, X=blau):
ausblenden Quelltext
1:
2:
3:
OOO
XOX
XXO

Das klappt zwar, aber erst durch die diagonale Reihe, weil du das Ergebnis nicht korrekt berechnest. Rot hat aber schon viel eher durch die horizontale Reihe gewonnen. Hier die Funktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure WinCheck(Player: integer);  
var  
  Win: boolean;  
begin  
  Win:= false;  
  Win:= HCheck(Player);  
  Win:= VCheck(Player);  
  Win:= DCheck(Player);  
  if Win = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!');  
end;

1. Win:= false und dann Win:=HCheck(Player) ist unsinnig, das FALSE hat ja gar keine Wirkung (das sagt dir doch auch der Compiler, noch nie die Warnung gesehen?).
2. Du überschreibst bei jedem weiteren Check das (möglicherweise) bereits eingetretene Gewinnergebnis!
Korrekt müßte das so lauten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure WinCheck(Player: integer);  
var  
  Win: boolean;  
begin  
  Win:= HCheck(Player) or VCheck(Player) or DCheck(Player);
  if Win = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!');  
end;

Damit sollte es klappen, allerdings hast du dann immer noch das Problem, dass du nach dem Gewinnen weiterspielen kannst... Und weiter: was ist mit unentschieden?

Tipp: Du kannst den SetBounds() Aufruf im OnCreate der Form sparen, wenn du die Eigenschaft Position der Form auf poDesktopCenter stellst.

Eigentlich finde ich, kann man deinen Code kaum retten, aber ich verstehe auch, wenn du dabei bleiben willst; nur, ohne die eine oder andere grundlegend strukturelle Anpassung wirst du damit nicht weit kommen. :( Damit meine ich z.B. die Compiler-Warnung: "[Warnung] Unit1.pas(110): FOR-Schleifenvariable muss eine einfache lokale Variable sein" oder das Problem, dass man nach dem Gewinnen noch weiterspielen kann, es kein Remis gibt... usw.

cu
Narses
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 07.02.05 17:03 
ups hab die falsche unti gepostet sry, das muss natürlich so heißen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function Draw: boolean; //Ein Unentschieden prüfen
var
  x,y,r: integer;
begin
  result:= false;
  r:= 0;
  for x:= 0 to 2 do for y:= 0 to 2 do r:= r + map[x,y]; //Alle Werte zusammenzählen (Spieler1: 1, Spieler2: 2)
  if r >= 13 then result:= true; //Wenn alle Felder belegt sind ist der minimalwert 13 (5 * 1 + 4 * 2)
end;

procedure WinCheck(Player: integer); //Prüfen ob die Bedingungen erfüllt wurden, oder ob es ein Unentschieden gibt
var
  Win: boolean;
begin
  Win:= false;
  if win = false then Win:= HCheck(Player);
  if win = false then Win:= VCheck(Player);
  if win = false then Win:= DCheck(Player);
  if Win = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!'); //Spieler 1 oder 2 hat gewonnen
  if Draw = true then showmessage('Unentschieden!'); //Unentschieden
end;
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 07.02.05 17:07 
oh sry narses hab deinen beitrag grad erst gelesen :lol:

ausblenden Delphi-Quelltext
1:
Win:= HCheck(Player) or VCheck(Player) or DCheck(Player);					


so DARF es nicht heißen, das hatte ich auch zuerst, was ist denn, wenn sowas passiert:
ausblenden Quelltext
1:
2:
3:
XXX
00X
00X


Das OR ist ein 'muss Oder', also dürfen nicht mehrere bedingungen erfüllt sein, das kann aber passieren!

und das:
Zitat:

Zitat:

F34r0fTh3D4rk hat folgendes geschrieben:
nur mein problem ist, dass es erst beim nächsten klick abgefragt wird


Nein, dein Problem ist, dass die Funktion WinCheck() nicht korrekt ist. Du rufst doch nach jedem Klick diese Funktion auf, aber sie erkennt einfach manche Gewinnreihen nicht, noch nicht bemerkt? Versuch mal damit zu gewinnen (O=rot, X=blau):

stimmt auch nicht, dass es erst nächste runde abgefragt wurde, lag daran, dass der spieler auf not spieler gesetzt wurde und dann der falsche Spieler abgefragt wurde, also musste das case of zu einem not case of werden und dann ging es

mit dem zentrieren hattes du ja rechst aber:
Zitat:

Eigentlich finde ich, kann man deinen Code kaum retten, aber ich verstehe auch, wenn du dabei bleiben willst; nur, ohne die eine oder andere grundlegend strukturelle Anpassung wirst du damit nicht weit kommen. Damit meine ich z.B. die Compiler-Warnung: "[Warnung] Unit1.pas(110): FOR-Schleifenvariable muss eine einfache lokale Variable sein" oder das Problem, dass man nach dem Gewinnen noch weiterspielen kann, es kein Remis gibt... usw.

warum ist der nicht zu retten, es funktioniert alles wie es soll und ich hab keine probleme, villeicht hättest du das ja nicht hingekriegt ohne nochmal von vorne anfangen zu müssen, aber das ist off topic.
nur weil dein code vielleicht "besser" ist, vielleicht eleganter, aber nicht kürzer, ist mein code doch nicht fürn Müll, es gibt schließlich mehr als nur eine Möglichkeit ein Problem zu lösen. Trotzdem danke für deine Mühe :wink:


Zuletzt bearbeitet von F34r0fTh3D4rk am Mo 07.02.05 17:22, insgesamt 2-mal bearbeitet
suomi85
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 07.02.05 17:14 
Wenn du nicht willst, dass sowas
ausblenden Quelltext
1:
2:
3:
xxx
00x
00x


passiert, solltest du aus dem OR einfach ein XOR machen. Jedenfalls wenn ich dein Problem richtig verstehe.
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 07.02.05 17:16 
habs ja schon hinbekommen 8)

(im letzten beitrag hab ich noch was hinzugefügt :) )

ausblenden Quelltext
1:
 FOR-Schleifenvariable muss eine einfache lokale Variable sein					


ist doch nicht schlimm wenn man die variable immer nur für das gleiche benutzt, ok lokal ist theoretisch besser, aber in diesem Fall nicht zwingend notwendig

Zitat:

Nein, das funktioniert nur zufällig, nicht beabsichtigt. Ich vermute mal, du hältst diese Zeile:

if map[0,0] and map[0,1] and map[0,2] = player then result:= true;

für eine Kurzform von:

if (map[0,0] = player) and (map[0,1] = player) and (map[0,2] = player) then
result:= true;

oder? In deinem speziellen Fall ist das auch so, aber das kann man nicht verallgemeinern, denn in der 2. Zeile werden boolsche Ausdrücke logisch UND-Verknüpft, während in der 1. Zeile ein binäres Undieren der Variablen dem Vergleich vorausgeht und dieser erst das boolsche Ergebnis liefert. Das ist aber nicht allgemein das Gleiche!

ok dat mussu mir jetzt nochmal erklären, das 2. liefert ein true wenn das was in der klammer steht war ist und das erste ? wäre das erste das gleiche wie das:
ausblenden Delphi-Quelltext
1:
if ((map[0,0] and map[0,1] and map[0,2]) = player) then result:= true;					

aber was passiert denn da ?
hab deine aussage leider net ganz verstanden :?

//////////////////////////////////////////

ach ja und in diesem code hier:
ausblenden Quelltext
1:
//EDIT: So, hab mir den Code mal angesehen; leider ist dein Konzept etwas... naja... egal. Da du dir die Arbeit mit dem Code gemacht hast, will ich dir im Gegenzug diesen Lösungsvorschlag machen:					

hat die string variable (etwas... naja...egal) welchen wert ? :mrgreen:
Loki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP Home

BeitragVerfasst: Mo 07.02.05 20:23 
@F34r0fTh3D4rk: willst du jetzt noch meinen Code haben ? Aber ich habe das ganze mit BitButtons gemacht auf die ich zeichne. Ging mir nicht ums Design sondern um die Programmierung *ggg* Also wenn du den Code trotzdem noch haben willst dann schick ich ihn dir. Muss dann nur noch ein paar Kommentare hinzufügen und ich bin mir nicht sicher ob es morgen dann noch was wird.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.02.05 22:38 
Moin!

Ich muss zugeben, die Art, in der du hier auftrittst, macht es mir etwas schwer, sachlich mit dir umzugehen. Deine Beharrlichkeit, die von mir genannten Ansätze einfach nicht logisch zu durchdenken, ist schon erstaunlich. Nun denn, bevor es OT wird:

F34r0fTh3D4rk hat folgendes geschrieben:
villeicht hättest du das ja nicht hingekriegt ohne nochmal von vorne anfangen zu müssen

Hm, starker Tobak, mach mal langsam... Also, hier ist DEIN Code von weiter oben zusammengeflickt und funktionsfähig, allerdings ohne eine explizite Ausgabe, dass es unentschieden ausgegangen ist:
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:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
unit Unit1;

 
interface  

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

 
type  
  TForm1 = class(TForm)  
    MainMenu1: TMainMenu;
    Spiel1: TMenuItem;
    Neustart1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    procedure FormCreate(Sender: TObject);  
    procedure Image1Click(Sender: TObject);  
    procedure Image2Click(Sender: TObject);  
    procedure Image3Click(Sender: TObject);  
    procedure Image4Click(Sender: TObject);  
    procedure Image5Click(Sender: TObject);  
    procedure Image6Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);  
    procedure Image8Click(Sender: TObject);  
    procedure Image9Click(Sender: TObject);  
    procedure Neustart1Click(Sender: TObject);  
    procedure Beenden1Click(Sender: TObject);  
  private  
    { Private-Deklarationen }  
  public  
    { Public-Deklarationen }  
  end;  

 
var  
  Form1: TForm1;  
  i, j, k: integer;  
  player: boolean;  
  map: array of array of integer;
  able: array[1..9] of boolean;

 
implementation  

 
{$R *.dfm}  

 
function HCheck(Player: integer): boolean;  
begin  
  result:= false;  
  if player > 0 then begin  
    if map[0,0] and map[0,1] and map[0,2] = player then result:= true;  
    if map[1,0] and map[1,1] and map[1,2] = player then result:= true;  
    if map[2,0] and map[2,1] and map[2,2] = player then result:= true;  
  end;  
end;  

 
function VCheck(Player: integer): boolean;  
begin  
  result:= false;  
  if player > 0 then begin  
    if map[0,0] and map[1,0] and map[2,0] = player then result:= true;  
    if map[0,1] and map[1,1] and map[2,1] = player then result:= true;  
    if map[0,2] and map[1,2] and map[2,2] = player then result:= true;  
  end;  
end;  

 
function DCheck(Player: integer): boolean;  
begin  
  result:= false;  
  if player > 0 then begin  
    if map[0,0] and map[1,1] and map[2,2] = player then result:= true;  
    if map[0,2] and map[1,1] and map[2,0] = player then result:= true;  
  end;  
end;  

 
procedure WinCheck(Player: integer);
var
  Win: boolean;
begin
  Win:= HCheck(Player) or VCheck(Player) or DCheck(Player);
  if Win = true then begin
    showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!');
    // spiel gewonnen, ende is
    for i := 1 to 9 do
      able[i] := FALSE;
  end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  setlength(map,3,3);
//SetBounds((Screen.Width - Width) div 2, (Screen.Height - Height) div 2, Width, Height);
// unnötig, wenn Form1.Position := poDesktopCenter gesetzt ist (IDE)
  Neustart1Click(Self);

end;


procedure TForm1.Image1Click(Sender: TObject);
begin
  if able[1] = true then begin
    if player = true then map[0,0]:= 1 else map[0,0]:= 2;
    player:= not player;  
    if map[0,0] = 1 then with image1.Canvas do begin  
      brush.Color:= clred;  
        ellipse(0,0,image1.Width,image1.Height);  
    end;  
    if map[0,0] = 2 then with image1.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image1.Width,image1.Height);  
    end;  
    able[1]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;

 
procedure TForm1.Image2Click(Sender: TObject);  
begin  
  if able[2] = true then begin  
    if player = true then map[0,1]:= 1 else map[0,1]:= 2;  
    player:= not player;  
    if map[0,1] = 1 then with image2.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image2.Width,image2.Height);  
    end;  
    if map[0,1] = 2 then with image2.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image2.Width,image2.Height);  
    end;  
    able[2]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image3Click(Sender: TObject);  
begin  
  if able[3] = true then begin  
    if player = true then map[0,2]:= 1 else map[0,2]:= 2;  
    player:= not player;  
    if map[0,2] = 1 then with image3.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image3.Width,image3.Height);  
    end;  
    if map[0,2] = 2 then with image3.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image3.Width,image3.Height);  
    end;  
    able[3]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image4Click(Sender: TObject);  
begin  
  if able[4] = true then begin  
    if player = true then map[1,0]:= 1 else map[1,0]:= 2;
    player:= not player;  
    if map[1,0] = 1 then with image4.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image4.Width,image4.Height);  
    end;  
    if map[1,0] = 2 then with image4.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image4.Width,image4.Height);  
    end;  
    able[4]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image5Click(Sender: TObject);  
begin  
  if able[5] = true then begin  
    if player = true then map[1,1]:= 1 else map[1,1]:= 2;  
    player:= not player;  
    if map[1,1] = 1 then with image5.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image5.Width,image5.Height);  
    end;  
    if map[1,1] = 2 then with image5.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image5.Width,image5.Height);  
    end;  
    able[5]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image6Click(Sender: TObject);  
begin  
  if able[6] = true then begin  
    if player = true then map[1,2]:= 1 else map[1,2]:= 2;  
    player:= not player;  
    if map[1,2] = 1 then with image6.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image6.Width,image6.Height);  
    end;  
    if map[1,2] = 2 then with image6.Canvas do begin
      brush.Color:= clblue;  
      ellipse(0,0,image6.Width,image6.Height);  
    end;  
    able[6]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image7Click(Sender: TObject);  
begin  
  if able[7] = true then begin  
    if player = true then map[2,0]:= 1 else map[2,0]:= 2;  
    player:= not player;  
    if map[2,0] = 1 then with image7.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image7.Width,image7.Height);  
    end;  
    if map[2,0] = 2 then with image7.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image7.Width,image7.Height);  
    end;  
    able[7]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image8Click(Sender: TObject);  
begin  
  if able[8] = true then begin  
    if player = true then map[2,1]:= 1 else map[2,1]:= 2;  
    player:= not player;  
    if map[2,1] = 1 then with image8.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image8.Width,image8.Height);  
   end;  
    if map[2,1] = 2 then with image8.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image8.Width,image8.Height);  
    end;  
    able[8]:= false;  
  end;  
  case not player of
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Image9Click(Sender: TObject);  
begin  
  if able[9] = true then begin  
    if player = true then map[2,2]:= 1 else map[2,2]:= 2;  
    player:= not player;  
    if map[2,2] = 1 then with image9.Canvas do begin  
      brush.Color:= clred;  
      ellipse(0,0,image9.Width,image9.Height);  
    end;  
    if map[2,2] = 2 then with image9.Canvas do begin  
      brush.Color:= clblue;  
      ellipse(0,0,image9.Width,image9.Height);  
    end;  
    able[9]:= false;  
  end;  
  case not player of  
  true: WinCheck(1);  
  false: WinCheck(2);  
  end;  
end;  

 
procedure TForm1.Beenden1Click(Sender: TObject);  
begin  
  application.terminate;  
end;  

 
procedure TForm1.Neustart1Click(Sender: TObject);  
var  
  PMap : TComponent;  
begin  
  player:= true;  
  for j:= 0 to 2 do  
    for k:= 0 to 2 do  
      map[j,k]:= 0;  
    for i:= 1 to 9 do begin  
      able[i]:= true;  
      PMap := FindComponent('image'+IntToStr(i));  
      if PMap <> nil then with Timage(Pmap).Canvas do begin  
        brush.color:= clwhite;  
        rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width);  
      end;  
    end;
end;


end.

Ich habe die geflickten Stellen hervorgehoben, damit klar ist, was da von mir und was von dir ist. Wenn du den Code mit deinem weiter oben (und hoffentlich noch nicht von dir veränderten) geposteten Code vergleichst, wirst du feststellen, dass meine genannten Änderungen exakt die Probleme beheben.

F34r0fTh3D4rk hat folgendes geschrieben:
aber nicht kürzer

Hm, dein Code oben hat ca. 340 Zeilen, meiner hat ca. 180 Zeilen; interessante Form des Vergleichs, (340 < 180) = TRUE? :wink:

Ich bin nicht der Meinung, sondern es ist offensichtlich, dass dein Code erstaunlich ineffizient, demzufolge schwer zu debuggen, ist. Oder warum habe ich für meinen Code ca. 10min gebraucht und du doktorst jetzt schon Tage hier rum? Ich will keine arrogante Nummer auf deine Kosten abziehen, deshalb entschuldige ich mich schon jetzt dafür; was ich damit zeigen möchte, ist, dass eine gut geplante Datenstruktur und ein konsequent durchdachter Ansatz und daraus resultierende Umsetzung den größten Teil des Debugging überflüssig machen. Wenn du etwas mehr Erfahrung beim Programmieren und vor allem in der Informatik gesammelt hast, verstehst du vielleicht, was ich meine.

Jetzt noch zu den offenen Behauptungen:

F34r0fTh3D4rk hat folgendes geschrieben:
so DARF es nicht heißen, das hatte ich auch zuerst, was ist denn, wenn sowas passiert
Das OR ist ein 'muss Oder', also dürfen nicht mehrere bedingungen erfüllt sein, das kann aber passieren

Die Aussage ist falsch, denn der von dir zitierte Fall DARF erst gar nicht eintreten; wenn jemand bereits gewonnen hat, gibt es keine doppelten Gewinnbedingungen, da das Spiel zu Ende ist. Aus diesem Grund ist das ODER völlig korrekt eingesetzt: die erste wahre Bedingung beendet das Spiel, egal welche.

F34r0fTh3D4rk hat folgendes geschrieben:
stimmt auch nicht, dass es erst nächste runde abgefragt wurde, lag daran, dass der spieler auf not spieler gesetzt wurde und dann der falsche Spieler abgefragt wurde, also musste das case of zu einem not case of werden und dann ging es

Wenn du mal in DEINEN Code da oben schaust, wirst du feststellen, dass die von dir angesprochene case-Anweisung bereits so ist, wie du sie jetzt beschreibst - offensichtlich hast du in deinen Versuchen, das Problem durch "empirische Informatik" (oder auch "rumbasteln") zu lösen, verfummelt, so dass du beim Probieren einen Fehler eingebaut hast - der Code war zu dem Zeitpunkt, als du ihn gepostet hast ja korrekt. :wink:
Ich wiederhole: Der Fehler lag in der nicht korrekten Bildung des Wahrheitswertes. Du kannst das selbst problemlos verifizieren, bau einfach den alten Code an der Stelle ein und schau, was passiert: die Gewinnbedingung wird nicht korrekt berechnet. Deinen alten Code findest du in meinem vorletzten Beitrag, falls du nicht mehr wissen solltest, was du da genau geschrieben hast... :wink:

Ein Denkanstoß vielleicht noch: Wenn du einen Ansatz gewählt hättest, der die Gewinnbedingung unabhängig vom aktuellen Spieler prüft, hättest du mit solchen Problemen nix am Hut; bestechende Idee, oder? :wink:

F34r0fTh3D4rk hat folgendes geschrieben:
ist doch nicht schlimm wenn man die variable immer nur für das gleiche benutzt, ok lokal ist theoretisch besser, aber in diesem Fall nicht zwingend notwendig

Bitte nicht wieder falsch verstehen, aber das ist typisch für deinen Programmierstil - egal, geht doch - Leider ist aber genau das der Grund, wieso du so lange Debugging-Phasen hast; wenn du etwas mehr Sorgfalt beim coden aufwenden würdest, ließe sich das in besser funktionierendem Code erkennen. Mein Informatiklehrer nannte das immer "defensive Programmierweise", ich muss ihm schon Recht geben. Abgesehen davon, wenn das so "unschlimm" ist, warum nimmt es der Compiler dann zum Anlaß, eine Warnung zu erzeugen... ?

F34r0fTh3D4rk hat folgendes geschrieben:
ok dat mussu mir jetzt nochmal erklären

Ich möchte sicherheitshalber nochmal klarstellen, dass ich GAR NICHTS ERKLÄREN MUSS. Ich mache das, weil es mir (manchmal) Spaß macht, jemandem beim Programmieren lernen zu helfen. Du bist allerdings ein erstaunlich "resistenter" Fall... :wink:
Bevor wir das sinnvoll klären können, würde ich gerne wissen, ob dir "binäre Operationen" wie UND, ODER, NICHT etwas sagen (damit meine ich NICHT das and, or, not in IF-Abfragen, also die boolschen Operatoren). Wenn du damit nichts anfangen kannst, ist zum einen klar, warum du meine Aussagen nicht verstehst, zum anderen solltest du dann in dieser Richtung etwas "Forschung" betreiben. Alternativ kann ich auch (kurz) etwas dazu sagen, wie du willst.

Vielleicht hast du ja auch (mittlerweile?) keinen Bock, überhaupt Vorschläge von mir zu lesen; kein Thema, sag es, ignorier meine Beiträge und wir lassen das einfach.

cu
Narses
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 08.02.05 15:15 
du mich nicht verstehen, da wir sprechen unterschiedliches niveau! :idea:

Zitat:

Hm, dein Code oben hat ca. 340 Zeilen, meiner hat ca. 180 Zeilen; interessante Form des Vergleichs, (340 < 180) = TRUE?

ich kann ja bei meinem code auch mal die anderen 8 images weglassen, dann ist meiner kürzer :D

Zitat:

Jetzt noch zu den offenen Behauptungen:

Zitat:

so DARF es nicht heißen, das hatte ich auch zuerst, was ist denn, wenn sowas passiert
Das OR ist ein 'muss Oder', also dürfen nicht mehrere bedingungen erfüllt sein, das kann aber passieren


Die Aussage ist falsch, denn der von dir zitierte Fall DARF erst gar nicht eintreten; wenn jemand bereits gewonnen hat, gibt es keine doppelten Gewinnbedingungen, da das Spiel zu Ende ist. Aus diesem Grund ist das ODER völlig korrekt eingesetzt: die erste wahre Bedingung beendet das Spiel, egal welche.

doch der Fall kann und darf eintreten, guckst du hier:
das spielfeld sieht so aus:
ausblenden Quelltext
1:
2:
3:
XX
OOX
OOX

dann ist Spieler1 nochmal dran und macht das hier:
ausblenden Quelltext
1:
2:
3:
XXX
OOX
OOX

somit wurde die gewinnbedinung zweimal erfüllt! :wink:
Zitat:

Zitat:

stimmt auch nicht, dass es erst nächste runde abgefragt wurde, lag daran, dass der spieler auf not spieler gesetzt wurde und dann der falsche Spieler abgefragt wurde, also musste das case of zu einem not case of werden und dann ging es

Wenn du mal in DEINEN Code da oben schaust, wirst du feststellen, dass die von dir angesprochene case-Anweisung bereits so ist, wie du sie jetzt beschreibst - offensichtlich hast du in deinen Versuchen, das Problem durch "empirische Informatik" (oder auch "rumbasteln") zu lösen, verfummelt, so dass du beim Probieren einen Fehler eingebaut hast - der Code war zu dem Zeitpunkt, als du ihn gepostet hast ja korrekt.

du hast mir aber darauf geantwortet bevor ich den fehler behoben habe.
Gib schon zu, du hast einen Fehler erkannt, der garnet da war, bzw hast du die eigentliche ursache des fehlers net erkannt, Player wird doch noch auf not Player gesetzt bevor die case abfrage kommt, also ist diese genau verkehrt herum! :roll:

Zitat:

Ein Denkanstoß vielleicht noch: Wenn du einen Ansatz gewählt hättest, der die Gewinnbedingung unabhängig vom aktuellen Spieler prüft, hättest du mit solchen Problemen nix am Hut; bestechende Idee, oder?

muss ja nicht sein wenns auch sparender geht, lieber die procedure 1 mal korrekt laufen lassen, als einmal zuviel ohne sinn, dass dabei was rauskommt :shock:

Zitat:

Bitte nicht wieder falsch verstehen, aber das ist typisch für deinen Programmierstil - egal, geht doch - Leider ist aber genau das der Grund, wieso du so lange Debugging-Phasen hast; wenn du etwas mehr Sorgfalt beim coden aufwenden würdest, ließe sich das in besser funktionierendem Code erkennen. Mein Informatiklehrer nannte das immer "defensive Programmierweise", ich muss ihm schon Recht geben. Abgesehen davon, wenn das so "unschlimm" ist, warum nimmt es der Compiler dann zum Anlaß, eine Warnung zu erzeugen... ?

ok ich gebe dir recht, aber dass ich die variablen global gemacht habe, war nur dazu da, um die funktionalität zu prüfen, ich könnte die variable bnatürlich auch bei jeder neuen funktion lokal machen, aber wenn sie dann doch nicht funktioniert und ich nochmal von vorne anfange ist das naja zuviel schreibkram, aber danke, dass du mich drauf aufmerksam gemacht hast, hab das debug window nämlich net immer aktiv und dann sehe ich sowas meistens net :(, daran werde ich arbeiten

Zitat:

Alternativ kann ich auch (kurz) etwas dazu sagen, wie du willst.

das wäre nett, danke :)

Zitat:

Vielleicht hast du ja auch (mittlerweile?) keinen Bock, überhaupt Vorschläge von mir zu lesen; kein Thema, sag es, ignorier meine Beiträge und wir lassen das einfach.

Konstruktive vorschläge kann ich durchaus gut leiden, aber wenn etwas nicht zum ziel führt, sondern einfach nur um den heißen brei geredet wird, bringt das nichts.
Deine Vorschläge sind zt gut und ich werde mir das auch zu herzen nehmen 8)

MFG
F34r0fTh3D4rk

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:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
unit UMain;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    MainMenu1: TMainMenu;
    Spiel1: TMenuItem;
    Neustart1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image4Click(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure Image6Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Neustart1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  player: boolean; //Spieler unterscheiden
  map: array of array of integer; //Zuordnungsarray
  able: array[1..9] of boolean; //Variablen zum (de)aktivieren einzelner Felder

implementation

{$R *.dfm}

function HCheck(Player: integer): boolean; //Prüfen ob 3 gleiche Scheiben horizontal in einer Reihe sind
begin
  result:= false;
  if player > 0 then begin
    if (map[0,0] = player) and (map[0,1] = player) and (map[0,2] = player) then result:= true;
    if (map[1,0] = player) and (map[1,1] = player) and (map[1,2] = player) then result:= true;
    if (map[2,0] = player) and (map[2,1] = player) and (map[2,2] = player) then result:= true;
  end;
end;

function VCheck(Player: integer): boolean; //Prüfen ob 3 gleiche Scheiben vertikal in einer Reihe sind
begin
  result:= false;
  if player > 0 then begin
    if (map[0,0] = player) and (map[1,0] = player) and (map[2,0] = player) then result:= true;
    if (map[0,1] = player) and (map[1,1] = player) and (map[2,1] = player) then result:= true;
    if (map[0,2] = player) and (map[1,2] = player) and (map[2,2] = player) then result:= true;
  end;
end;

function DCheck(Player: integer): boolean; //Prüfen ob 3 gleiche Scheiben diagonal in einer Reihe sind
begin
  result:= false;
  if player > 0 then begin
    if (map[0,0] = player) and (map[1,1] = player) and (map[2,2] = player) then result:= true;
    if (map[0,2] = player) and (map[1,1] = player) and (map[2,0] = player) then result:= true;
  end;
end;

function Draw: boolean; //Ein Unentschieden prüfen
var
  x,y,r: integer;
begin
  result:= false;
  r:= 0;
  for x:= 0 to 2 do for y:= 0 to 2 do r:= r + map[x,y]; //Alle Werte zusammenzählen (Spieler1: 1, Spieler2: 2)
  if r >= 13 then result:= true; //Wenn alle Felder belegt sind ist der minimalwert 13 (5 * 1 + 4 * 2)
end;

procedure WinCheck(Player: integer); //Prüfen ob die Bedingungen erfüllt wurden, oder ob es ein Unentschieden gibt
var
  Win: boolean;
begin
  Win:= false;
  if win = false then Win:= HCheck(Player);
  if win = false then Win:= VCheck(Player);
  if win = false then Win:= DCheck(Player);
  if Win = true then showmessage('Spieler ' + inttostr(player) + ' hat gewonnen!'); //Spieler 1 oder 2 hat gewonnen
  if (win = false) and (Draw = true) then showmessage('Unentschieden!'); //Unentschieden
end;

procedure TForm1.FormCreate(Sender: TObject); //Restart aufrufen und Map initialisieren
begin
  setlength(map,3,3); //Spielfeldgröße festlegen
  Neustart1Click(self);
end;

procedure TForm1.Image1Click(Sender: TObject); //Bild wurde geklickt
begin
  if able[1] = true then begin //Wenn das Feld aktiviert ist ...
    if player = true then map[0,0]:= 1 else map[0,0]:= 2; //Abfragen welcher Spieler an der Reihe ist und das Feld mit seinem Wert beschreiben
    player:= not player; //Der andere Apieler ist nächstes Mal an der Reihe
    if map[0,0] = 1 then with image1.Canvas do begin //Wenn das Feld Spieler 1 gehört ...
      brush.Color:= clred;
        ellipse(0,0,image1.Width,image1.Height); //Roten Kreis auf das Feld zeichen
    end;
    if map[0,0] = 2 then with image1.Canvas do begin //Wenn das Felder Spieler 2 gehört ...
      brush.Color:= clblue;
      ellipse(0,0,image1.Width,image1.Height); //Blauen Kreis auf das Feld zeichnen
    end;
    able[1]:= false; //Das Feld deaktivieren
  end;
  case not player of //Den Spieler ermitteln, der den letzten Spielzug getätigt hat
  true: WinCheck(1); //Wenn Spieler 1 den letzten Zug hatte, prüfen ob er gewonnen hat
  false: WinCheck(2); //Wenn Spieler 2 den letzten Zug hatte, prüfen ob er gewonnen hat
  end;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
  if able[2] = true then begin
    if player = true then map[0,1]:= 1 else map[0,1]:= 2;
    player:= not player;
    if map[0,1] = 1 then with image2.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    if map[0,1] = 2 then with image2.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image2.Width,image2.Height);
    end;
    able[2]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
  if able[3] = true then begin
    if player = true then map[0,2]:= 1 else map[0,2]:= 2;
    player:= not player;
    if map[0,2] = 1 then with image3.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    if map[0,2] = 2 then with image3.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image3.Width,image3.Height);
    end;
    able[3]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image4Click(Sender: TObject);
begin
  if able[4] = true then begin
    if player = true then map[1,0]:= 1 else map[1,0]:= 2;
    player:= not player;
    if map[1,0] = 1 then with image4.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    if map[1,0] = 2 then with image4.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image4.Width,image4.Height);
    end;
    able[4]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image5Click(Sender: TObject);
begin
  if able[5] = true then begin
    if player = true then map[1,1]:= 1 else map[1,1]:= 2;
    player:= not player;
    if map[1,1] = 1 then with image5.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    if map[1,1] = 2 then with image5.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image5.Width,image5.Height);
    end;
    able[5]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image6Click(Sender: TObject);
begin
  if able[6] = true then begin
    if player = true then map[1,2]:= 1 else map[1,2]:= 2;
    player:= not player;
    if map[1,2] = 1 then with image6.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    if map[1,2] = 2 then with image6.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image6.Width,image6.Height);
    end;
    able[6]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
  if able[7] = true then begin
    if player = true then map[2,0]:= 1 else map[2,0]:= 2;
    player:= not player;
    if map[2,0] = 1 then with image7.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    if map[2,0] = 2 then with image7.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image7.Width,image7.Height);
    end;
    able[7]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
  if able[8] = true then begin
    if player = true then map[2,1]:= 1 else map[2,1]:= 2;
    player:= not player;
    if map[2,1] = 1 then with image8.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image8.Width,image8.Height);
   end;
    if map[2,1] = 2 then with image8.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image8.Width,image8.Height);
    end;
    able[8]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
  if able[9] = true then begin
    if player = true then map[2,2]:= 1 else map[2,2]:= 2;
    player:= not player;
    if map[2,2] = 1 then with image9.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    if map[2,2] = 2 then with image9.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image9.Width,image9.Height);
    end;
    able[9]:= false;
  end;
  case not player of
  true: WinCheck(1);
  false: WinCheck(2);
  end;
end;

procedure TForm1.Beenden1Click(Sender: TObject); //Beenden wurde geklickt
begin
  application.terminate; //Programm beenden
end;

procedure TForm1.Neustart1Click(Sender: TObject); //Neustart wurde geklickt, alles wieder zurücksetzen
var
  PMap : TComponent;
  i, j, k: integer;
begin
  player:= true; //Spieler = Spieler Nr 1
  for j:= 0 to 2 do
    for k:= 0 to 2 do
      map[j,k]:= 0; //Die Map leeren
    for i:= 1 to 9 do begin
      able[i]:= true; //Die Felder zum klicken freigeben
      PMap := FindComponent('image'+IntToStr(i)); //Image Komponenten suchen
      if PMap <> nil then with Timage(Pmap).Canvas do begin
        brush.color:= clwhite;
        rectangle(0,0,Timage(Pmap).width,Timage(Pmap).width); //Image Komponeten mit einem weißen Quadrat füllen
      end;
    end;
end;

end.


Moderiert von user profile iconraziel: Beiträge zusammengefasst
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.02.05 10:45 
Ich hab mir jetzt nicht alles durchgelesen, sondern alles immer ein bisschen überflogen, aber du sagtest doch, es sei wie 4 Gewinnt, also wie kann in dieser Situation der Spieler mit den "X"-en an der Reihe sein?

ausblenden Quelltext
1:
2:
3:
XX
OOX
OOX


wo hat dann zwischendurch Spieler "O" gesetzt?
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 09.02.05 11:23 
ja spieler X fängt an, es sind 9 felder, neun ist ungerade, dh

Reihenfolge:

ausblenden Quelltext
1:
2:
1 2 3 4 5 6 7 8 9
X O X O X O X O X


also kann es durch aus passieren !!!
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mi 09.02.05 11:30 
Nein, kann es nicht:
ausblenden Quelltext
1:
2:
3:
4:
 1:  2:  3:  4:  5:  6:  7:
                 X   X
          X  OX  OX  OX Problem!
  X  OX  OX  OX  OX OOX

_________________
JSXGraph


Zuletzt bearbeitet von raziel am Mi 09.02.05 11:31, insgesamt 1-mal bearbeitet
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 09.02.05 11:30 
nein es kann nicht passwieren, bei 4 gewinnt wird immer unten aufgefüllt, bei deienr aussage fängt der mit X an

_ _ _
_ _ _
_ _ X



_ _ _
_ _ _
_ O X


_ _ _
_ _ X
_ 0 X


(wenn O jetzt nicht oben rechts hinmacht ist der eh dumm ;>)


_ _ _
_ O X
_ O X

(wer gehen mal davon aus das wird das erreich wollen was du uns gezeigt hast

_ X _
_ O X
_ O X



_ X _
_ 0 X
0 0 X


(so und nu wirds schwer mit dem doppeltem win da X dran ist
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 09.02.05 11:32 
ach dreck :( kann man net wirgenwie anzeigen lassen ob gerade jemand was im thread postet dann kommen die gleichen lösungen nicht öfter vor
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 09.02.05 11:36 
Sagt mal, muss das eigentlich sein, dass Ihr hier immer wieder den gesamten Quelltext mit über 300 Zeilen postet? Es reichen doch bestimmt auch die relevanten Teile, oder? :roll:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.02.05 11:53 
Hast du trotzdem schön erklärt, uall@ogc :wink:
Wollte das nicht so ausführlich machen, ich dachte das sei klar :)
Loki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP Home

BeitragVerfasst: Mi 09.02.05 15:59 
Also so wie ich das kenne,wenn er es wirklich wie 4 Gewinnt machen will nur mit 3 dann ist es so richtig wie ihr das geschriben habt. Wenn er aber sowas wie TicTacToe schrieben will dann geht es so wie er es beschrieben hat. Bis jetzt war ich dem Irrtum erlegen das er sowas wie TicTacToe machen will *grins* und dann wird es auch hinfällig wenn er wirklich 3 Gewinnt machen will das ich meinen Code poste weil es nun mal TicTacToe ist. (auch wenn ich mir nicht sicher bin ob er ihn überhaupt noch haben wollte)

MFG

Loki