| Autor |
Beitrag |
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 04.02.05 15:35
Hi @ all
ok ich möchte 4 gewinnt machen, halt nur mit dreien in einer reihe
also ich habe ein
Delphi-Quelltext 1:
| fields: array of array of integer; |
mit
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 
Zuletzt bearbeitet von F34r0fTh3D4rk am Fr 04.02.05 20:37, insgesamt 2-mal bearbeitet
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 211
Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
|
Verfasst: Fr 04.02.05 16:59
@Narses: Boa! Gar nich' so einfach ohne Spacebar auszukommen. Hast Du die dafür abgebaut?
@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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 04.02.05 21:03
hab den code formatiert (auf 2 zeilen (um mehr code gings auch garnicht))
|
|
F34r0fTh3D4rk 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 04.02.05 21:36
wenn das hier jetzt jemand durchliest hält der uns für bekloppt
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 
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 34
Win XP Home
|
Verfasst: 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
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
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; begin 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;
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 
|
|
F34r0fTh3D4rk 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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:
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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 34
Win XP Home
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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:
anstatt:
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
      
Beiträge: 34
Win XP Home
|
Verfasst: So 06.02.05 14:24
Also dann fangen wir erstmal nochmal mit dem Code an:
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  :
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
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
Mit FindColons geht es dann genauso für die Spalten nur eben andersrum
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
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| var Spielflaeche: array[1..9] of integer; |
oder so(wie bei mir):
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 06.02.05 20:50
Moin!
Um vielleicht etwas mehr Sinn in die Begrifflichkeiten zu bringen:
Das hier:
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:
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:
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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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 
      
Beiträge: 5285
Erhaltene Danke: 28
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 06.02.05 21:24
oh mein gott bin ich dumm, schlagt mich bitte
das ist doch schon so banal dass es schon gar kein problem mehr ist:
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:
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:
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 !
|
|
|