Autor Beitrag
F34r0fTh3D4rk
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: Fr 04.02.05 15:35 
Hi @ all :D

ok ich möchte 4 gewinnt machen, halt nur mit dreien in einer reihe

also ich habe ein
ausblenden Delphi-Quelltext
1:
fields: array of array of integer;					


mit
ausblenden Delphi-Quelltext
1:
setlength(fields,3,3);					


so und wenn spieler 1 draufklickt wird die entsprechende stelle auf 1 bei spieler 2 auf 2 gesetzt

Wie mache ich jetzt die Abfrage ob jetzt 3 horizontal vertikal oder diagonal nebeneinander liegen ? ich habe ein mehrdimensionales dynamisches array eingebaut, ich denke damit gehts einfacher als mit einem statischen array doch wie frage ich das ab ohne gaaaaaaaaaaaaaaaaaanz viele if abfragen machen zu müssen ?

Vielen Dank schon mal im Vorraus


MFG
Der Dunkelfürchter :mrgreen:


Zuletzt bearbeitet von F34r0fTh3D4rk am Fr 04.02.05 20:37, insgesamt 2-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 04.02.05 15:45 
Also der Code is ja scheußlich formatiert. Den kann ja kein Mensch lesen. Formatier den bitte um

Danke
AXMD
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: Fr 04.02.05 15:52 
hab keine lust den rest auch noch zu formatieren das hat mit der frage gar nischt zu tun, das was ich brauche ist ja das, was in dem code fehlt.

Ich habe ein mehrdimensionels dynamisches array und möchte abfragen,
ob 3 felder nebeneinander den wert 1 oder 2 haben, bei 3 * 1 hat spieler 1 gewonnen
bei 3 * 2 spieler 2

deshalb habe ich auch gefragt ob das net kürzer geht, sonst müsste ich ja das gleiche 9 mal formatieren :(


PS: nicht scheußlich, garnicht :)
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Fr 04.02.05 16:59 
@Narses: Boa! Gar nich' so einfach ohne Spacebar auszukommen. Hast Du die dafür abgebaut? 8)

@F34r0fTh3D4rk: Nun. Ich hätte es nicht gleich als Respektlosigkeit betrachtet, aber ich meine, daß es sogar sehr wichtig ist, daß du auch bei kleinen Projekten einem anerkannten StyleGuide (wie z.B. www.uni-koblenz.de/~...Code-Styleguide.html) folgst. Die Arbeit ist eher marginal - immerhin hält der Editor Einrückungen bei. Der Vorteil ergibt sich, weil du es gewohnt bist und dich bei größeren Projekten nicht überwinden must.
Ich würde für die ein oder andere Variable einen aussagekräftigeren Namen wählen.

gegrüßt!

_________________
"Bloßes Ignorieren ist noch keine Toleranz." (Theodor Fontane)
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: Fr 04.02.05 19:57 
1. Ich habe nicht Respektlos gesagt

2. Heißt sowas nicht Off Topic, bleiben wir mal bei der sache ok ?


Gebt mal bitte ein Beispiel plz ich möchte es möglichst zu Montag fertig haben :(
[habs eilig deshalb formatier ich auch net viel, nur im nachhinein wenn sein muss]
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: Fr 04.02.05 21:03 
hab den code formatiert (auf 2 zeilen (um mehr code gings auch garnicht))
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: Fr 04.02.05 21:36 
wenn das hier jetzt jemand durchliest hält der uns für bekloppt :D

das ist der einzige code der benötigt wird, das problem ist ja schließlich übertrag
und veralgemeinerbar.

Wie mache ich das denn jetzt bitte helft mir doch :flehan:
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 04.02.05 21:40 
Hallo,

ich würde von dem aktuellen Punkt (also da, wo der letzte Stein eingeworfen wurde) ausgehen und dann einfach die Umliegenden Felder überprüfen. Normalerweise würde ich alle Möglichkeiten rekursive austesten, aber bei so wenig Möglichkeiten würde ich doch auf wenige If-Anweisungen (9 oder so) zurückgreifen.
Bei solch einem kleinen Programm lässt sich das kaum schneller gestalten.

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
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: Fr 04.02.05 21:43 
ich glaube es gibt acht möglichkeiten oder ? Aber dann für 2 spieler
Zitat:

XXX
OOO
OOO

OOO
XXX
OOO

OOO
OOO
XXX

XOO
XOO
XOO

OXO
OXO
OXO

OOX
OOX
OOX

XOO
OXO
OOX

OOX
OXO
XOO


ich glaube das waren alle

aber dann für jede möglichkeit 3 abfragen und das für 2 spieler

also 2 * 3 * 8 = 40 if abfragen

ok man kann da etwas einschränken und das auf 2 + 3 * 8 = 26
reduzieren, es ist aber dennoch viel :?
Loki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP Home

BeitragVerfasst: Fr 04.02.05 22:57 
Also ich hab es mal mit folgendem Code gemacht. Das ganze ist bestimmt schöner und kürzer zu machen, aber wenigstens als Denkanstoss wird es reichen :D

FSpieler muss vorher mit dem Spieler gesetzt werden der ermittelt werden soll
FSpieler ist vom Typ Integer
Spielflaeche ist ein 2 - Dimensionales Array
Die Funltionen geben True zurück wenn der in FSpieler gespeicherte Spieler in diesem Test gewonnen hat

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:
function TSpiel.FindRows(X,Y : Integer) : Boolean;
begin
  Result := False;
  if Spielflaeche[Y,X] = FSpieler then
    if X < 3 then
      Result := FindRows(X + 1,Y)
    else if X = 3 then
      Result := True;
end;



function TSpiel.FindColons(X,Y : Integer) : Boolean;
begin
  Result := False;
  if Spielflaeche[Y,X] = FSpieler then
    if Y < 3 then
      Result := FindColons(X,Y + 1)
    else if Y = 3 then
      Result := True;
end;



function TSpiel.FindPositiv : Boolean; //positiv bezieht sich auf die Steigung der Diagonalen
begin                                  //da ist mir nichts besseres eingefallen ;)
  Result := False;

  if (Spielflaeche[3,1] = FSpieler) AND (Spielflaeche[2,2] = FSpieler) AND
    (Spielflaeche[1,3] = FSpieler) then
    Result := True;
end;



function TSpiel.FindNegativ : Boolean;
begin
  Result := False;

  if (Spielflaeche[1,1] = FSpieler) AND (Spielflaeche[2,2] = FSpieler) AND
    (Spielflaeche[3,3] = FSpieler) then
    Result := True;
end;


//CheckWin wird aufgerufen mit einem Spieler und gibt True zurück wenn dieser gewonnen hat
function TSpiel.CheckWin(Spieler : Integer) : Boolean;
begin
  FSpieler := Spieler;
  Result := False;

  if FindRows(1,1) then
    Result := True;
  if FindRows(1,2) then
    Result := True;
  if FindRows(1,3) then
    Result := True;
  if FindColons(1,1) then
    Result := True;
  if FindColons(2,1) then
    Result := True;
  if FindColons(3,1) then
    Result := True;
  if FindNegativ then
    Result := True;
  if FindPositiv then
    Result := True;
end;


Hoffe das du durchblickst wenn nicht dann frag nach, dann helf ich gerne :D
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: Sa 05.02.05 12:05 
ich habe 2 spieler, wenn ein spieler einen stein setzt bekommt
das 3d array an dieser stelle eine 1 bzw eine 2.

Bei jedem Image klick steht bei mir so etwas:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Image1Click(Sender: TObject);
begin
  if able[1] = true then begin
    if player = true then fields[0,0]:= 1 else fields[0,0]:= 2;
    player:= not player;
    if fields[0,0] = 1 then with image1.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image1.Width,image1.Height);
    end;
    if fields[0,0] = 2 then with image1.Canvas do begin
      brush.Color:= clblue;
      ellipse(0,0,image1.Width,image1.Height);
    end;
  able[1]:= false;
  end;
end;


ich hoffe du blickst du durch, mich kannst du ja auch fragen ^^

ach ja es gibt bei mir spieler 0 (nicht gesetzt) spieler 1 und spieler 2
wenn ein stein auf ein feld gesetzt wurde wird das feld in dem array able auf false gesetzt beim restart ist wiede alles auf true bzw auf 0 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: Sa 05.02.05 15:39 
erklärst du mir mal bitte deinen code so ganz blicke ich da nicht durch,
bzw ich weiß net ob der auf mein gameporterbar ist (so)
Loki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP Home

BeitragVerfasst: Sa 05.02.05 18:04 
Das Problem ist das ich ein 2 dimensionales Array als Spielfeld habe und du ein 3 dimensionales Array als Spielfeld hast. Wenn ich das jetzt richtig verstanden habe.

Was verstehste denn genau nicht am Code ? Falls es alles sein sollte dann versuch ich ihn nochmal ganz zu erklären.

MFG

Loki

/EDIT: Also ich bin jetzt davon ausgegangen das es nur um die Prüfung geht wer gewonnen hat. Falls es dir um mehr geht dann muss ich den Rest auch noch posten.
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: Sa 05.02.05 19:48 
mir geht es um die abfrage, ob 3 in einer reihe sind, ich dachte, dass
geht mit einem 3d array am besten:

Zitat:

123
123
123

anstatt:
Zitat:

123456789


zeig mir mal deine globalen variablen die dafür relevant sind und wie du das mit den spielern gemacht hast, mein code ist dann da soch etwas anders und erklär auch mal was genau in diesen functionen passiert
Loki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34

Win XP Home

BeitragVerfasst: So 06.02.05 14:24 
Also dann fangen wir erstmal nochmal mit dem Code an:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TSpiel.FindRows(X,Y : Integer) : Boolean;   
begin   
  Result := False;   
  if Spielflaeche[Y,X] = FSpieler then   
    if X < 3 then   
      Result := FindRows(X + 1,Y)   
    else if X = 3 then   
      Result := True;   
end;


Spielfläche ist ein 2 dimensionales Array of Integer.
Die Belegungen aller dieser Items ist entweder 0 für nicht besetzt oder 1 oder 2 für die 2 Spieler. Das erste Problem ist das wenn du die 2 Indizes (hmm ist das wirklich der Plural von Index ??) als X und als Y Koordinate auf deinem Feld benutzen willst das nicht geht, weil sie verdreht sind. Deshalb ruf ich die Funktionen so auf als ob es gehen würde und dreh erst in der Funktion die Koordianten um. X und Y sind die Startpunkte wo er anfangen soll zu suchen, d.h. bei FindRows immer die erste Koordinate der Reihe also einmal mit X = 1 Y = 1 dann X = 1 Y = 2 und mit X = 1 Y = 3 aufrufen und du hast alle Reihen ausprobiert. Die Funktion gibt True zurück wenn eine Reihe in der getesteten Reihe für den Spieler vorliegt der in FSpieler gerade als aktueller Spieler fetgelegt ist. FSpieler kann also 1 oder 2 sein.

Kommen wir jetzt zum internen der Funktion :D :

Zuerst testet er ob die erste übergebene Koordinate eine von dem zu testendem Spieler ist, wenn nicht dann bleibt Result auf False und die Funktion ist sofort beendet. Wenn aber die Koordinaten mit 1 zum Beispiel belegt sind und wir auf Spieler 1 testen dann guckt er ob wir schon bei dem 3. Feld sind wenn nicht dann ruft er die Funktion nochmal auf mit um eins erhöhter X Koordinate. Wenn diese jetzt nicht zu Spieler 1 gehört dann wird alles mit False abgebrochen, wenn er aber immer noch ein Feld für Spieler 1 findet ruft er die Funktion nochmal auf diesmal mit X = 3 wenn es dann ein Feld für Spieler 1 ist dann geht er in den else - Teil und setzt Result = True. So hoffe das es einigermaßen verständlich war :D

Also mach ich nochmal ein Beispiel:

Spielflaeche sieht so aus:

111 0 unbelegt
020 1 Spieler 1
022 2 Spieler 2

vorher wird FSpieler = 1 gesetzt
Gewonnen : Boolean (zeigt nachher an ob Spieler 1 gewonnen hat)

dann Funktionsaufruf: Gewonnen := FindRows(1,1);

so zuerst testet er dann ob 1,1 zu Spieler 1 gehört tut es also FindRows(2,1)
2,1 ist auch auf 1 also da X < 3 FindRows(3,1)
auch 3,1 ist auf 1 also da X = 3 Result := True

so wird dann Gewonnen := True und wir sehen das Spieler 1 gewonnen hat :D

Mit FindColons geht es dann genauso für die Spalten nur eben andersrum :D
So denke das Prinzip ist jetzt verständlich und du kannst es jetzt auf dein Programm umschreiben. Falls nicht sag wo es genau nicht klappt und ich versuch zu helfen :)
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 06.02.05 15:23 
Hoi

Warum ist ein 3d-Array besser für die Abfrage geeignet?

Ich finde es seltsam, dass hier so viel Code für einen solchen trivialen Fall gepostet wird, das ist doch eher selten der Fall.
Warum hast du den Rat von wulskin nicht beherzigt und prüfst bei dem zuletzt gesetzen Spielstein, ob ein Spieler gewonnen hat? Das ist doch ganz leicht zu packen. Stattdessen lässte dir soviel Code posten, den du am Ende nicht ganz durchblicken kannst.

MfG

10F10
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 20:05 
Zitat:

Das erste Problem ist das wenn du die 2 Indizes (hmm ist das wirklich der Plural von Index ??) als X und als Y Koordinate auf deinem Feld benutzen willst das nicht geht, weil sie verdreht sind. Deshalb ruf ich die Funktionen so auf als ob es gehen würde und dreh erst in der Funktion die Koordianten um.


deswegen, weil man ein 3d array nunmal 3 dimensional darstellen kann
und es koordinaten hat, wie das in diesem fall mit einem 2d array geht
ist mir schleierhaft.

ist die variable denn so:
ausblenden Delphi-Quelltext
1:
2:
var
Spielflaeche: array[1..9] of integer;


oder so(wie bei mir):
ausblenden Delphi-Quelltext
1:
2:
var
Spielflaeche: array of array of integer;


ich denk mal oberes.

kannst du mir mal deinen ganzen source per email schicken ?

-> [url]seth_alphasquad@web.de[/url]
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 20:50 
Moin!

Um vielleicht etwas mehr Sinn in die Begrifflichkeiten zu bringen:

Das hier:
ausblenden Delphi-Quelltext
1:
2:
var  
Spielflaeche: array of array of integer;

ist ein ZWEI-dimensionales Array, daran zu erkennen, das dort 2x array steht. Es gibt also X- und Y-Koordinaten, um bei allgemein üblichen Begrifflichkeiten zu bleiben.

Das hier:
ausblenden Delphi-Quelltext
1:
2:
var  
Spielflaeche: array[1..9] of integer;

ist demzufolge ein EIN-dimensionales Array, da es hier nur X-Koordinaten gibt.

Und um das ganze abzurunden, ist das hier:
ausblenden Delphi-Quelltext
1:
2:
var
raum: ARRAY[0..max,0..max,0..max] of Integer;

ein DREI-dimensionales Array, da es 3 Koordinaten benötigt, um ein Element eindeutig zu beschreiben.

cu
Narses

//EDIT: Ach ja, nochwas: Warum ein DYNAMISCHES Array besser geeignet sein soll, ein STATISCHES Spielfeld zu beschreiben, ist allerdings eine Einsicht, die du uns nicht vorenthalten solltest.


Zuletzt bearbeitet von Narses am So 06.02.05 20:54, insgesamt 1-mal bearbeitet
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 20:52 
also doch so wie ich es gemacht habe, jemand hat mir nämlich erzählt, das array of array 3d sein soll, ich hab mich auch gewundert, also danke jetzt hab ichs kapiert
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:24 
oh mein gott bin ich dumm, schlagt mich bitte :autsch:

das ist doch schon so banal dass es schon gar kein problem mehr 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:
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[1,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;

aufgerufen bei jedem klick mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
case player of
true: WinCheck(1);
false: WinCheck(2);
end;


jedoch habe ich ein kleines problem, die abfrage geschied erst beim nächsten klicken, weil das feld ja erst im moment der abfrage geschrieben wird, soll ich
da jetzt n sleep einbauen oder soll ich das wo anders abfragen, wenn ja, wo ?

obwohl:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    if map[0,2] = 1 then with image3.Canvas do begin
      brush.Color:= clred;
      ellipse(0,0,image3.Width,image3.Height);
    end;

funktioniert ja auch korrekt !