Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Solitär - Schule! (https://www.delphipraxis.net/42097-solitaer-schule.html)

Phallic 13. Mär 2005 16:49


Solitär - Schule!
 
Hallo Leute,

ich muss für die Schule etwas in Delphi programmieren...und komme da nicht so richtig weiter.
Es ist ein kleines witziges Spiel, names Solitär! Also nicht das Windows Kartenspiel sondern, für die, die es nicht kennen, hier eine kleine Erklärung: Das Feld sieht so aus:

------O O O
------O O O
O O O O O O O
O O O O O O O
O O O O O O O
------O O O
------O O O


Das Feld in der Mitte ist ein freies Feld. In den anderen Löchern ist ein kleines Stöckchen. Jetzt muss man geschickt überlegen, wie man es schaffen kann, dass nur ein Stöckchen, und das in der Mitte, übrigbleibt. Man kann über Stöckchen springen, wenn nach dem Stöckchen ein leeres Feld ist. Dann nimmt man das Stöckchen aus dem Spiel!

Mein Ansatz:

Delphi-Quellcode:
.
.
.
var Form1: TForm1;
  z,zr,a,x1,x2,y1,y2,s : integer;

procedure TForm1.Button1Click(Sender: TObject);
  begin
    zr:=10;
    a:=30;
    For z:=0 to 1 do
      begin
        For s:=0 to 2 do
          begin
            x1:=zr+2*(a+zr)+(a+zr)*s;
            y1:=zr+(a+zr)*z;
            image1.Canvas.Ellipse(x1,y1,x1+30,y1+30);
          end;
      end;
  end;
Das ist der Quellcode für den ersten Block, also für:

O O O
O O O

Jetzt weiß ich leider nicht wie ich die anderen mit den selben Variablen programmieren soll. Es sollen 3 Blöcke entstehen. Den, den ich grad aufgezeichnet habe, dann den länglichen:

O O O O O O O
O O O O O O O
O O O O O O O

und zu guter letzt, der hier:

O O O
O O O

Wenn ihr mir einen Ansatz geben könntet, wäre ich euch sehr dankbar. Und bitte achtet darauf, dass ich nicht gut Delphi kann, deswegen werde ich manche Begriffe nicht kennen!

noch_ein_hannes 13. Mär 2005 18:04

Re: Solitär - Schule!
 
... und jetzt erwartest Du dass wir Deine Hausaufgaben machen? :-)

Versuch doch mal nicht in verschiedenen Blöcken zu denken, sondern das Feld als Ganzes zu sehen, d.H. Du denkst Dir ein Rechteck mit den maximalen Ausmassen z:b: so:

Code:
- 0 1 2 3 4 5 6
0 - - X X X - - 
1 - - X X X - - 
2 X X X X X X X
3 X X X - X X X
4 X X X X X X X
5 - - X X X - - 
6 - - X X X - -
So hast Du quasi ein Koordinatensystem. Jeder Punkt erhält den Wert 1, wenn ein "Stäbchen" drinsteckt, und 0 wenn nicht. Die Felder am Rand erhalten bereits am Anfang ein -1, da dort kein Stab rein darf.

Zitat:

Und bitte achtet darauf, dass ich nicht gut Delphi kann, deswegen werde ich manche Begriffe nicht kennen!
Nach der Lösung dieser (Haus)Aufgabe kannst Du es bestimmt viel besser!

malo 13. Mär 2005 18:48

Re: Solitär - Schule!
 
Noch ein Tipp mit dem Koordinatensystem: Verwende dazu doch ein zweidimensionlaes Array of integer. Das kann man dann verwenden wie ein Koordinatensystem ;)


PS: Willkommen in der DP :firejump:

Luckie 13. Mär 2005 18:55

Re: Solitär - Schule!
 
Ich wäre geneigt ein Boolean Array zu nehmen: Stcökchen drin: TRue, leer False.

malo 13. Mär 2005 18:57

Re: Solitär - Schule!
 
Zitat:

Zitat von Luckie
Ich wäre geneigt ein Boolean Array zu nehmen: Stcökchen drin: TRue, leer False.

Dachte ich auch, aber was ist mit den Feldern, die nicht genutzt werden DÜRFEN (bzw. im Spiel eigentlich nicht existieren)?

Als die Eckpunkte des Quadrats.

Luckie 13. Mär 2005 19:01

Re: Solitär - Schule!
 
Man könnte ein zweites Array führen in dem die verbotenen Koordinaten drinne stehen.

Ultimator 13. Mär 2005 19:04

Re: Solitär - Schule!
 
Man könnte auch einen eigenen Aufzählungstypen verwenden, etwa "besetzt", "leer", "verboten" und dann ein 2D-Array of TEigenerAufzählungstyp.
Das fände ich am einfachsten ;-)

Phallic 13. Mär 2005 19:39

Re: Solitär - Schule!
 
leider habe ich von all dem gar nichts verstanden....Vielleicht habe ich es schlecht erklärt. Unser Lehrer will, dass wir einfach durch ändern der Farbe, das Spiel schaffen kann. Aber ich hänge immer noch beim Spielfeld...und das mit Koordinatensystem....häää???? Wie gesagt..ich kann kein Delphi und finde es sehr kompliziert...und unser Lehrer hat gesagt wir sollen in Blöcken denken..

Luckie 13. Mär 2005 19:40

Re: Solitär - Schule!
 
Warum sagt der dir, du sollst so was programmieren, wenn du kein Delphi kannst? :gruebel:

Phallic 13. Mär 2005 19:41

Re: Solitär - Schule!
 
Wenn es um Befehle geht, bringt er uns nichts bei, so ist das halt bei dem....ich bin schon stolz, dass ich das geschafft habe..aber die 2 Blöcke weiß ich einfach net, wie ich die unten dran setzen kann..

Luckie 13. Mär 2005 19:43

Re: Solitär - Schule!
 
Benötigtes Wissen: Array, for-Schleifen, if-Abfragen. Rest ist Programmlogik, die man nicht beibringen kann.

Phallic 13. Mär 2005 21:27

Re: Solitär - Schule!
 
Meine Frage ist egtl: Wie kann ich dem zweiten Block sagen, dass er nach dem ersten Block unten drunter weiter machen soll?

noch_ein_hannes 13. Mär 2005 22:51

Re: Solitär - Schule!
 
Ich finde es allerdings auch sehr merkwürdig, dass ein Leher seinen Schülern Aufgaben gibt ohne ihnen vorher das Wissen bzw. die Grundlage zum Lösen beizubringen. :-(

Das "in Blöcken" denken ist ja schön und gut, aber in Koordinaten bzw. in Arrays ist es doch wesentlich praktischer. Wenn Dein Leher die Lösung verraten hat, dann poste diese doch mal hier ...

Phallic 13. Mär 2005 22:58

Re: Solitär - Schule!
 
Nein, leider hat er diese nicht verraten. Aber allerdings habe ich es jetzt selber geschafftz..mit bißchen rumprobieren und der Benutzen von nur 2 Boxen! ;)

Jetzt allerdings weiß ich nicht wie man Kreise ausfüllen lässt...ich brauch doch dafür eine variable oder?
Und dann war da doch irgendetwas...mit floodfill...allerdings weiß ich das nicht mehr genau ^.^

Und wie mache ich es, dass sich alle z.b blau ausfüllen...nur das in der Mitte bleibt weiß?

Delphi-Quellcode:
.
.
.
var
  Form1: TForm1;
  z,zr,a,x1,x2,y1,y2,s : integer;

.
.
.

procedure TForm1.Button1Click(Sender: TObject);
  begin
    zr:=10;
    a:=30;
    For z:=0 to 6 do
      begin
        For s:=0 to 2 do
          begin
            x1:=zr+3*(a+zr)+(a+zr)*s;
            y1:=zr+(a+zr)*z;
            image1.Canvas.Ellipse(x1,y1,x1+15,y1+15);
          end;
      end;
    For z:=0 to 2 do
      begin
        For s:=0 to 6 do
          begin
            x1:=zr+(a+zr)+(a+zr)*s;
            y1:=9*zr+(a+zr)*z;
            image1.canvas.Ellipse(x1,y1,x1+15,y1+15);
          end;
      end;
  end;

Matze 13. Mär 2005 23:02

Re: Solitär - Schule!
 
Delphi-Quellcode:
Canvas.Brush.Color := clRed;
Füllt das die Kreise nicht aus?

Phallic 13. Mär 2005 23:03

Re: Solitär - Schule!
 
Doch! Hat prima funktioniert!! Danke sehr...! Nur das in der Mitte ^^..muss mal schauen...

Matze 13. Mär 2005 23:05

Re: Solitär - Schule!
 
Du könntest ja hinterher mit weiß über den mittleren kreis zeichnen oder in den Schleifen die Koordinaten überprüfen und falls diese das mittlere Feld sind, eben weiß zeichnen.

Phallic 13. Mär 2005 23:08

Re: Solitär - Schule!
 
Darin liegt ja das Problem vom ganzen Delphi...

Gut, mir selbst kann ich sagen: Mach mal den mittleren Kreis weiß..

Aber Delphi braucht da andere befehle...kann dem ja nicht sagen middle circle, white :P

:x

Damit man net denkt, dass ich spammen will, editier ich ma den davor...

nein, die Koordinaten kenne ich nicht, ich habe sie ja niemals eingegeben, habe dem ja nur gesagt er soll da einmal kreise nach unten und einmal kreise nach rechts zeichnen...Mehr habe ich ja nicht gemacht...und selbst wenn ich die koordinaten kennen sollte, würde es immer noch an den Befehlen liegen, dass ich diesen kreis nicht ausfüllen kann, da ich nicht weiß wie man die koordinaten in welchem befehl reinbringt..

Matze 13. Mär 2005 23:10

Re: Solitär - Schule!
 
Zitat:

Zitat von Phallic
Aber Delphi braucht da andere befehle...kann dem ja nicht sagen middle circle, white :P

Musst du doch nicht, du kennst doch die Koordinaten des mittleren Kreises.

atreju2oo0 14. Mär 2005 02:47

Re: Solitär - Schule!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei mir heisst das Spiel Halma und ich habe es auch mal gemacht...
Ist zwar nicht fertig geworden aber die Grundfunktionen gehen!
Vielleicht hilft es Dir ja!
;)

Luckie 14. Mär 2005 03:33

Re: Solitär - Schule!
 
Mal eine Zwischenfrage an den Threadersteller Phallic: Soll das ganze mit dem .NET Framework gelöst werden oder warum steht das hier in der .NET Sparte?

Phallic 14. Mär 2005 14:52

Re: Solitär - Schule!
 
Ich habe halt Delphi 8 also die .NET version...die durften wir uns von der Schule nehmen..

Phallic 14. Mär 2005 17:37

Re: Solitär - Schule!
 
Also...ich hab mich wieder umentschieden...auf 3 Blöcke, da ich angst hatte mit zwei blöcken aufeinander würde es vielleicht fehler geben...also:

Delphi-Quellcode:
var
  Form1: TForm1;
  z,zr,a,x1,x2,y1,y2,s : integer;

.
.
.
procedure TForm1.Button1Click(Sender: TObject);
  begin
    spielfeld.Canvas.Brush.Color:= clRed;
    zr:=10;
    a:=30;
    For z:=0 to 1 do
      begin
        For s:=0 to 2 do
          begin
            x1:=zr+3*(a+zr)+(a+zr)*s;
            y1:=zr+(a+zr)*z;
            spielfeld.Canvas.Ellipse(x1,y1,x1+15,y1+15);
          end;
      end;
    For z:=0 to 2 do
      begin
        For s:=0 to 6 do
          begin
            x1:=zr+(a+zr)+(a+zr)*s;
            y1:=9*zr+(a+zr)*z;
            spielfeld.Canvas.Ellipse(x1,y1,x1+15,y1+15);
          end;
      end;
    For z:=0 to 1 do
      begin
        For s:=0 to 2 do
          begin
            x1:=zr+3*(a+zr)+(a+zr)*s;
            y1:=21*zr+(a+zr)*z;
            spielfeld.Canvas.Ellipse(x1,y1,x1+15,y1+15);
          end;
      end;
  end;
Danke atreju2oo0 für deinen Quellcode...Leider kann ich mit ihm nicht viel anfangen, besser gesagt, gar nichts, denn das alles, was da drinnen steht, hab ich kaum im Unterricht besprochen.

ich habe immer noch nicht den passenden Befehl gefunden, um eine Bestimmte Koordinate auszufüllen, und ich habe das Problem, dass ich nicht weiß, wie ich die Koordinate herausfinde...Vielleicht könntet ihr mir da hlefen?

Danke!

--Phallic

noch_ein_hannes 14. Mär 2005 17:55

Re: Solitär - Schule!
 
Du musst doch in Deinem mittleren "Block" nur s und z vergleichen ....
... den Rest solltest Du jetzt aber selbst erledigen :-)

Phallic 14. Mär 2005 20:02

Re: Solitär - Schule!
 
Ich kenne halt den Befehl nicht...um einen kreis ausmalen zu könne...und da dieses Delphi auf Englisch ist, hilft die Hilfe auch nicht weiter...

Ich habe die Prozedur OnMouseDown genommen...weiß ujetzt allerdings nicht weiter..:/

Boombuler 15. Mär 2005 07:42

Re: Solitär - Schule!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

wenns nich umbedingt Kreise sein müssen kannst du dir auch mal das Stringgrid bzw das Drawgrid ansehen damit sollte es relativ einfach sein die kästchen zu füllen... Allerdings halte ich die Einteilung in 3 Blöcke für nicht so sinnvoll! Ein Array wäre da schon angebrachter!

ps Kurzer ablauf tipp:

1. Realisieren welcher zug gemacht werden soll!
2. Prüfen ob dies ein gültiger Zug ist (Innerhalb des Feldes und freies feld sowie Reichweite)
3. Zug umsetzen (Werte im Array ändern)
4. Feld neu zeichnen.

eigentlich relativ einfach dabei denke ich das punkt 2 mit abstand das schwerste sein sollte!

So nun viel Spass beim umsetzten und lass dir nich von jemanden einreden VB wäre besser!! ;)

Greetz
Boombuler

Edit:
Ich habs mal gerade selber noch geschrieben! Quellcode is im anhang! allerdings dürfe meine art die Shapes zu positionieren dich nich weiter bringen (es sei denn du kennst dich mit Bitshifting aus)
Aber evtl findest du ja noch ein bis zwei brauchbare ideen darin!

noch_ein_hannes 15. Mär 2005 09:18

Re: Solitär - Schule!
 
Zitat:

Ich kenne halt den Befehl nicht...um einen kreis ausmalen zu können
Komisch, in Deinem bisherigen Script "malst" Du doch Kreise aus ...
Jetzt musst Du nur noch weisse statt rote erzeugen.

Phallic 15. Mär 2005 18:27

Re: Solitär - Schule!
 
Also wir hatten heute Informatik...und er hat uns gesagt wie man die Farbe ändern kann...also habe ich das mal probiert...

Schwachsinn!

Delphi-Quellcode:
procedure TForm1.spielfeldMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    begin
      if spielfeld.Canvas.Pixels[x,y]= clRed then
        begin
          spielfeld.Canvas.Brush.Color:= clBlack;
          spielfeld.Canvas.FloodFill(x1,y1,clRed,FsSurface);
        end;
      if spielfeld.Canvas.Pixels[x,y]= clBlack then
        begin
          spielfeld.Canvas.Brush.Color:= clRed;
          spielfeld.Canvas.FloodFill(x1,y1,clBlack,FsSurface);
        end;
    end;
So hat er es an die tafel angeschrieben..

Hat irgendjemand einen Vorschlag?

FanFailure 16. Mär 2005 02:15

Re: Solitär - Schule!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Phallic
Schwachsinn!

Wieso Schwachsinn? Ändert sich die Farbe Deiner Kreise nicht?
(Evtl. solltest Du sie größer zeichnen, damit Du nicht daneben klickst. :wink: )

Zitat:

Zitat von Phallic
Hat irgendjemand einen Vorschlag?

Auf jeden Fall:

1. Nimm ein 2-dim. Integer-Array in das Du den aktuellen zustand der Felder speicherst.
2. Überlege Dir, welche Felder Zustände Du brauchst und weise ihr eine Zahl zu.
z.B.: 0 = Feld mit Stein, 1 = Feld ohne Stein, 2 = verbotenes Feld (d.h. keine Steine erlaubt), 3 = Feld mit markiertem Stein
3. Fülle das Array mit den entspr. Zuständen
4. Zeichne das Spielfeld, indem zu zeilenweise durch das Array läufst und im Fall 0 ein Feld mit Stein, im Fall 1 ein Feld ohne Stein, im Fall 2 kein Feld und im Fall 3 ein Feld mit einem markierten Stein zeichnest.


Zum Zeichnen:

Mit Canvas.Ellipse kannst Du eine Ellipse bzw. (wenn Höhe = Breite) einen Kreis zeichnen.
Wichtig sind auch Canvas.Brush.Color zum Definieren der Hintergrundfarbe des Kreises bzw. Canvas.Pen.Color zum Definieren der Randfarbe des Kreises.

Was Du Dir jetzt überlegen musst:
Wie kann ich die Felder grafisch darstellen und wie kann ich später durch anklicken des Spielfeldes (an der Pos. x,y) die Zeilen- und Spaltennummer berechnen?
Dazu sollte Dir die Grafik im Anhang weiterhelfen.

Viel Erfolg!

FF


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz