Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 23.06.10 17:34 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben Zum zitierten Posting springen:
Wie prüfst du denn jetzt, ob ein Spieler nicht mehr setzen kann?

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
für alle verbleibenden Steine, mache...
  wenn Stein abgelegt werden kann (CheckDomino, ohne ablegen!), dann...
    erhöhe Zähler um 1

wenn Zähler gleich null, dann...
  Textausgabe: "Kein Stein kann mehr abgelegt werden"
  Spielende

Genau so!

Eigentlich logisch, man braucht keinen eigenen, extra geschriebenen Code dafür! Was ich mit einem Stein mache, muss ich doch bloss in einer Schleife mit allen Steinen machen! :dance2:

Danke euch!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 28.06.10 17:24 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Globale Variablen gehören eben nicht zu einem bestimmten Objekt, sondern zu der Unit, in der die Klasse, also der Konstruktionsplan der Objekte, steht.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Zusätzlich sind globale Variablen nicht gerade übersichtlich, sagtest du ja schon, und objektorientiert schon gar nicht.

Stimmt ja alles, nur jetzt möchte ich in einer anderen Unit (Unit2) den Spieler ermitteln, der den 1. Stein legen darf: Wer (Programm oder Mensch) den Stein mit insgesamt mehr Punkten hat, beginnt. Und schon muss zumindest TDomino eine globale Variable sein, denn wenn das im private-Teil von Unit1 steht, kann ich es ja on einer anderen Unit nicht nutzen!

Wie macht man es also?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 29.06.10 19:40 
Hallo!

@user profile iconBergmann89:
Würdest du eher
a) jedem Spieler (Mensch/Programm) am Spielbeginn per Random bestimmte Steine, d. h. ein eigenes Array zuweisen, oder
b) mit einem gemeinsamen Array arbeiten, aus dem jeder Spieler jeweils einen Stein entnimmt?

Diese Frage ist mir enorm wichtig, denn momentan arbeitet das Programm mit nur einem Steine-Array!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 30.06.10 15:51 
Hey,

eig is das doch egal, oder? Kann man so oder so machen. Wenn du es jetzt schon mit einem Array für alle hast dann lass es so, kannst ja später noch als Option einbauen, das jeder sein eigenes hat...

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 30.06.10 18:13 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
eig is das doch egal, oder?
Ich weiss nicht, ob es egal ist, denn jetzt stehen beiden Spieler alle Steine zur Verfügung, dann aber hat jeder Spieler nur seine Steine. Ich weiss nicht, was besser ist!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 04.07.10 14:15 
Hallo!

Es muss doch möglich sein, mit dem Array DominoList alle bisher abgelegten Steine neu zu zeichnen. Man soll während des Spiels eine andere Farbe einstellen können, dies übermalt aber alle abgelegten Steine. Also muss ich sie neu zeichnen. Dazu muss ich zwar noch einen Integer einbauen, der das Bitmap angibt, das gezeichnet werden muss, aber daran scheitert es nicht.

Das funktioniert nicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  i, n: Integer;
  bmp: TBitmap;
begin
 bmp := TBitmap.Create;

 for i := 0 to High(DominoList) do
 begin
  Domino := DominoList[i];

  ImageList1.GetBitmap(0, bmp);  //hier wird statt 0 der Index-Zähler eingesetzt

  for n := 0 to Domino.Rotate do
   Drehen90Grad(bmp);

  DrawStone(bmp);
 end;

 bmp.Free;
end;

Was mache ich falsch?

//Edit:
Im Prinzip nichts, habe nur vergessen, den Zähler für's Drehen nach 4x auf 0 zurückzusetzen und kam dabei auf mehrere tausend Mal Drehen, was das Programm natürlich einige Zeit beschäftigte und es dadurch auf nichts mehr reagierte!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 05.07.10 17:47 
Hallo!

Es gibt doch noch ein Problem: Ich kriege die Berechnung des rechten bzw. unteren Randes nicht hin. Entweder setzt das Programm Steine auch ausserhalb des Spielfeldes, oder es erkennt weder für sich noch für mich einen Stein als passend, wenn dieser zB. ganz rechts angefügt werden muss.

Mit folgendem Code passiert das:
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:
function TForm1.FindAllPossiblePlaces(d: TDomino): Integer;
var
  x, y, n, h: Integer;
begin
 d.X := 0;
 d.Y := 0;
 d.Rotate := 0;
 n := 0;
 h := 0;
 SetLength(DominoPossibleList, 0);

 {Gesamtes Spielfeld durchgehen}
 for x := 0 to iBoardWidth do
  for y := 0 to iBoardHeight do
 begin
//So legt das Programm rechts und unten einfach weiter an
//  if (d.X*iStoneWidth < iBoardWidth) and
//     (d.Y*iStoneWidth < iBoardHeight) then

//So werden rechts und unten passende Steine nicht erkannt, offenbar aber
//nur dann, wenn der Stein, an den angelegt werden soll, waagrecht liegt!??
  if (d.X*iStoneWidth < iBoardWidth-iStoneWidth) and
     (d.Y*iStoneWidth < iBoardHeight-iStoneWidth) then
   AddToPossiblePlaces(d);  {Alle Möglichkeiten zum Ablegen ermitteln}

   RotateDomino(d);

   {4x Drehen bedeutet, die Ausgangsposition ist wieder erreicht}
   if h >= 4 then h := 0{und h muss nicht weiter erhöht werden}

   Inc(h);
   d.Rotate := h;

   {Zähler für Drehen erhöhen}
   Inc(n);

   if n = 3 then
   begin
    {Wenn 4x gedreht wurde, dann}
    {verschiebe Position um ein Feld nach rechts}
    Inc(d.X);
    n := 0;
   end;

   {Wenn X-Position ausserhalb des Spielfeldes, dann...}
   if d.X >= iBoardWidth-1 then
   begin
    d.X := 0;  {... setze X-Position auf 0,}
    Inc(d.Y);  {setze Y-Position in die nächste Zeile}
   end;

   {Wenn Y-Position ausserhalb des Spielfeldes, dann abbrechen}
   if d.Y >= iBoardHeight-1 then
    break;
 end;  {end von "for x := 0 to iBoardWidth do [...]"}

 Result := High(DominoPossibleList);
end;


Die Grafik verdeutlicht nochmal, was ich meine!
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 07.07.10 19:36 
Hallo!

Das Programm ist mittlerweile so komplex geworden, dass eine einfache Antwort nicht so schnell möglich ist,
aber ich war ja nicht faul und habe *gedacht* und auch probiert und siehe da: :dance2:

Ich denke, das ist es jetzt:
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:
function TForm1.FindAllPossiblePlaces(d: TDomino): Integer;
var
  x, y, n, h: Integer;
  b: Boolean;
begin
 d.X := 0;
 d.Y := 0;
 d.Rotate := 0;
 n := 0;
 h := 0;
 SetLength(DominoPossibleList, 0);

 {Gesamtes Spielfeld durchgehen}
 for x := 0 to iBoardWidth do
  for y := 0 to iBoardHeight do
 begin
  if (d.X*iStoneWidth < iBoardWidth) and
     (d.Y*iStoneWidth < iBoardHeight) then
  begin
   b := True;

   // !
   if (d.X*iStoneWidth+iStoneWidth = iBoardWidth) and (d.Dir = diHorz) then
    b := False;

   // !
   if (d.Y*iStoneWidth+iStoneWidth = iBoardHeight) and (d.Dir = diVert) then
    b := False;

   if b then  // !
    AddToPossiblePlaces(d);  {Alle Möglichkeiten zum Ablegen ermitteln}
  end;

  RotateDomino(d);

  //...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 17.07.10 19:25 
Hallo!

Sorry, dass ich mich ein weiteres Mal in Serie melde, aber der Code FindAllPossiblePlaces stimmt immer noch nicht. Entweder bekomme ich es hin, dass er Steine nicht unten bzw. rechts ausserhalb des Spielfeldes anlegt, also korrekt arbeitet, aber dafür nicht alle möglichen Plätze innerhalb des Spielfeldes findet.

Oder er findet alle Plätze, legt dafür aber unten bzw. rechts ausserhalb des Spielfeldes an.

Ich möchte aber, dass er alle möglichen Plätze innerhalb des Spielfeldes findet! Ich kriege das einfach nicht hin.
So findet er nicht alle möglichen Plätze im Spielfeld, legt aber stets korrekt an:
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:
function TForm1.FindAllPossiblePlaces(d: TDomino): Integer;
var
  x, y, n, h: Integer;
  b: Boolean;
begin
 d.X := 0;
 d.Y := 0;
 d.Rotate := 0;
 n := 0;
 h := 0;
 SetLength(DominoPossibleList, 0);

 {Gesamtes Spielfeld durchgehen}
 for x := 0 to iBoardWidth do
  for y := 0 to iBoardHeight do
 begin
//Was stimmt hier nicht?
  if (d.X*iStoneWidth <= iBoardWidth-iStoneWidth) and
     (d.Y*iStoneWidth <= iBoardHeight-iStoneWidth) then
  begin
   b := False;
(*
//Was stimmt hier ...
   if (d.Dir = diHorz) and (d.X*iStoneWidth+iStoneWidth+iStoneWidth < 684) then
    b := True;
//... und hier nicht?
   if (d.Dir = diVert) and (d.Y*iStoneWidth+iStoneHeight+iStoneHeight < 642) then
    b := True;
*)


//Code vereinfacht, das Problem bleibt aber bestehen - es findet nicht alle möglichen Plätze!
   if (d.Dir = diHorz) then
    if (d.X < 16and (d.Y < 14then b := True;
//wenn hier ein else steht, werden nur die waagrechten Plätze gefunden, aber da nicht alle!
   if (d.Dir = diVert) then
    if (d.X < 17and (d.Y < 13then b := True;

   if b then AddToPossiblePlaces(d);  {Alle Möglichkeiten zum Ablegen ermitteln}
  end;


//Dass der Fehler ab hier irgendwo liegt, schliesse ich aus!
  RotateDomino(d);

  {4x Drehen bedeutet, die Ausgangsposition ist wieder erreicht}
  if h >= 4 then h := 0{und h muss nicht weiter erhöht werden}

  Inc(h);
  d.Rotate := h;

  {Zähler für Drehen erhöhen}
  Inc(n);

  if n = 3 then
  begin
   {Wenn 4x gedreht wurde, dann}
   {verschiebe Position um ein Feld nach rechts}
   Inc(d.X);
   n := 0;
  end;

  {Wenn X-Position ausserhalb des Spielfeldes, dann...}
  if d.X >= iBoardWidth-1 then
  begin
   d.X := 0;  {... setze X-Position auf 0,}
   Inc(d.Y);  {setze Y-Position in die nächste Zeile}
  end;

   {Wenn Y-Position ausserhalb des Spielfeldes, dann abbrechen}
  if d.Y >= iBoardHeight-1 then
   break;
 end;  {end von "for x := 0 to iBoardWidth do [...]"}

 Result := High(DominoPossibleList);
end;


//Edit: Code ist jetzt etwas vereinfacht, das löst das Problem aber nicht!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!