Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dame Spiel programmieren (https://www.delphipraxis.net/86459-dame-spiel-programmieren.html)

Rank 14. Feb 2007 14:01


Dame Spiel programmieren
 
hallo ich muss im informatik unterricht ein programm erstellen. ich habe mir das spiel dame uberlegt, jedoch scheitere ich daran die steine hüpfen zu lassen. vieleicht als hinweis: ich habe 64 panel verwendet und in jedem eine paintbox eingefügt welche die steine zeichnet. ich würde nun gerne die steine bewegen weis aber nicht wie. können sie mir vieleicht helfen? danke.
MFG Christoph

Jowo 14. Feb 2007 17:15

Re: Dame Spiel programmieren
 
Also erstmal muss ich sagen, dass es ziemlich unpraktisch sein kann, mit 64 einzelnen Panels zu arbeiten.

Aber zu deinem Problem:
Du könntest eine Procedure schreiben, der du als Parameter die Werte des aktuellen und des neuen Feldes übergibst. Diese Procedure fügt dann in das "Von-Feld" ein weißes Bild und in das "Nach-Feld" ein Bild mit der weißen oder schwarzen Figur ein.
Außerdem könntest du die Werte, auf welchen Feldern welche Figuren stehen in einem zweidimensionalen Array mit 8x8 Feldern speichern.

Ich hoffe, das hilft dir.

Alexander Roth 14. Feb 2007 18:19

Re: Dame Spiel programmieren
 
Wieso Panels?

Spiele sind ideal um objektorientiert programmiert zu werden. Wenn du so weit schon bist, würde ich dir dass empfehlen.
Wenn nicht dürfte es sehr schwer sein, ein Spiel zu programmieren.


Lass doch die Panels einfach weg.

Die Position von jeder komponente kannst du durch left und top ändern.

Rank 19. Feb 2007 11:31

Re: Dame Spiel programmieren
 
danke erstmal
aber ich habe nun einmal panels verwendet. meine lehrerin bevorzugt ebenfalls die variante mit den arrays. könntet ihr mir vieleicht dafür eine procedure schicken????
wäre sau net von euch!!
Danke
Mfg Christoph

Alexander Roth 19. Feb 2007 11:46

Re: Dame Spiel programmieren
 
Ja, wie ist das jetzt? Kannst du OOP?

Ich wüsste jetzt nicht wie du es ohne hinkriegen solltest, (oder du hättest extrem viel Arbeit).

So nächstes ist nur hilfreich für dich mit OOP:
Ich habe selbst auch ein nettes Spiel programmiert, keine anspruchsvolle Graphik, aber es erledigt seine Aufgabe Imho elegant.
Siehe ReaktioneXX


Gruß Alexander

yörsch 19. Feb 2007 11:56

Re: Dame Spiel programmieren
 
HAI
Trenne Oberflächenanzeige von dem was deine Spielsteine machen können.
1 Der Spieler macht eine Aktion (Zieht spielstein über ein Feld -> Sendet ereignis an Objekt)
2 Die Zentrale Routien/Objekt entscheidet ob OK.
3 Anwender bekommt Rückmeldung angezeigt
Eine möglich kein kann drag&Drop sein...

shmia 19. Feb 2007 12:44

Re: Dame Spiel programmieren
 
Du solltest grundsätzlich trennen zwischen dem Damespiel an sich und der Visualisierung.
Um ein Damespielfeld anzuzeigen werden nur folgende Infos benötigt:
1.) das Spielfeld als 8*8 Array
2.) ein Canvas zum zeichen
3.) Position (linke obere Ecke), ab der gezeichnet werden soll (kann am Anfang entfallen)
4.) Grösse in Pixel eines weissen oder schwarzen Feldes (kann auch ein feste Konstante sein)
Mit dieser Schnittstelle kannst du später einfach den Visualisierungteil austauschen und die Damen z.B. als Pamela Anderson gegen Anna N. Smith darstellen.

PS:
für das Damespiel und das Schachspiel kann die gleiche Visualisierung verwendet werden.

Rank 26. Feb 2007 11:08

Re: Dame Spiel programmieren
 
vielen dank für eure vielen anregugen.
es beginnt jedoch schon damit, dass ich keine ahnung habe wie ich das mit dem array machen soll! ich versteh nicht, wie ich das programmieren soll. wäre es vielleicht möglich, dass ihr mir das mal mit einem beispiel (procedure) erklären könntet? es wäre auch nicht schlimm dies am beispiel dame zu versuchen =)
mfg christoph

Tormentor32 26. Feb 2007 11:22

Re: Dame Spiel programmieren
 
Willst du das Damespiel mit KI programmieren? Dann könnte es unter Umständen recht kompliziert werden...

Nikolas 26. Feb 2007 11:29

Re: Dame Spiel programmieren
 
Du könntest dir ein Record für jedes Feld bauen:
Delphi-Quellcode:
MeinFeld= Record
 FeldFarbe: Boolean; // Schwarz oder weiss
 FigurFarbe: Byte; //1: schwarze Figue, 2: weisse Figur, 3: unbesetzt
 Dame: Boolean; // falls die Figur auf dem Feld eine Dame ist.
end;
Das kannst du dann in einem Array benutzen:
Delphi-Quellcode:
Spielfeld=array[1..8] of array of [1..8] of Meinfeld;
Am Anfang kannst du dann die Felder besetzen:
Delphi-Quellcode:
Spielfeld[1,1].feldFarbe:=1, und eine schwarze Figus steht drauf: Spielfeld[1,1].Figurfarbe:=1;
Zum zeichnen nimmst du dann einfach ein Canvas. Klickt der Spieler dann in dein Canvas, berechnest du das betreffende Feld und merkst es dir. Mit if Meinfeld[x,y].Figurfarbe=0 kannst du gleich rausfinden, ob da überhaupt eine Figur steht. Wenn da eine Figut steht, wird der Spieler dann auf ein weiteres Feld klicken, wo dann die Figur hin soll. Wenn er einfach nur schräg laufen will (ich glaube, dass darf man) kannst du einfach überprüfen, ob er dass dann darf:
(er will von a,b nach x,y ziehen)
Delphi-Quellcode:
for i:=min(a,x) to max(a,x) do
 for j:=min(b,y) to max(b,y) do
 if Feld[i,j] ist unbesetzt then weitermachen, else abrechen und Problem ausgeben.
end;

MrSpock 26. Feb 2007 11:32

Re: Dame Spiel programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Rank,

die Aussage, dass es nur mit OOP geht ist nur in soweit richtig, dass du mit der VCL natürlich Objekte benutzt. Die Programmlogik muss jedoch nicht unbedingt mit OOP umgesetzt werden, wenn ihr das so im Detail noch nicht hattet. Du kannst auch 64 Panels benutzen, wenn du das möchtest. Auch die Bewegung könntest du über Panels darstellen, in dem du ein 65. Panel von dem Ursprungsort zum Zielort bewegst. Ob das gut aussieht ist eine andere Frage, aber funktionieren würde das.

Hab dir einfach mal ein kleines Programm angehängt, das zeigt, wie sich ein Panel über andere Panels bewegt, nur damit du siehst. Es geht! :zwinker:

Rank 28. Feb 2007 12:52

Re: Dame Spiel programmieren
 
vielen vielen dank für eure unterstützung. ich werde jetzt versuchen eure tipps umzusetzen.
falls ich noch weitere fragen habe, hoffe ich das ihr weiterhin ein ohr für mich habt.
also danke danke für eure tipps.
MFG Christoph

Rank 28. Feb 2007 13:50

Re: Dame Spiel programmieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich und meine partnerin kommen mit unserem spielfeld was wir zu beginn gewählt haben nicht ganz zurecht. wir stellen jetzt das programm mal mit rein. vielleicht könnt ihr ja wenn ihr mal drüber schaut etwas finden, was den umgang vereinfacht oder wo unser problem mit den steinen liegt denn ihr habt ja am anfang geschrieben, dass die variante mit den panels nicht so günstig ist. vielleicht findet ihr ja einen neuen ansatz
danke wäre echt super
mfg christoph

Cöster 28. Feb 2007 15:08

Re: Dame Spiel programmieren
 
Was genau ist jetzt euer Problem? Wollt ihr allgemeine Tipps haben, wie ihr euren Quelltext vereinfachen könnt? Oder wie man's ohne 65 Panels und ohne 68 :shock: PaintBoxen macht?

Der Code ließe sich unglaublich vereinfachen und verkürzen, wenn ihr nur eine PaintBox benutzt. Diese hätte dann die Größe des gesamten Spielfeldes. Die 64 Felder und die Spielsteine können dann über (verschachtelte) For-Schleifen per Delphi-Referenz durchsuchenBitBlt auf diese gezeichnet werden. Die 70 Zeilen lange Button2Click-Prozedur könnte so auf ca. ein 10tel reduziert werden.
Außerdem wären eindeutigere Bezeichner nicht schlecht. Kein Mensch weiß, wo Panel49 liegt. Was Button2 ist lässt sich auch erst erahnen, wenn man sich die Implementierung seines OnClick-Ereignisses ansieht.

Mr. Pink 28. Feb 2007 18:36

Re: Dame Spiel programmieren
 
hallo, ich bin ebenfalls grade dabei ein spiel zu programmieren (hex), bzw. bin so gut wie fertig, habe das allerdings nicht oop gemacht, weil cih auch nicht wüsste was mir das für vorteile bringen sollte. wo z.b. spart man denn enorm viel arbeit beim adme-spiel, wenn man oop verwendet, anstatt das alles in viele proceduren/functionen von form1 aufzuteieln, also nur eine klasse zu verwenden? ist jetzt mal interessantshalber, habe das nämlich nicht mit oop gemacht, weil ich damit nicht so gut klarkomme und es so sehr viel einfacher und sogar kürzer finde.

Alexander Roth 28. Feb 2007 18:57

Re: Dame Spiel programmieren
 
hi,

also ich glaube die eleganz von OOP wird hier ein bisschen unterschätzt.
Denn gerade größere Spiele sind ohne OOP unmöglich und auch nur eine simple Erwiterung eines vorhandenen Spiels wie Dame ist mit OOp viel einfacher.
Doch wenn natürlich Rank kein OOP beherrscht, finde ich Cöster's Methode noch die Beste. Da es graphisch wohl am schnellsten gehen sollte.

Gruß Alexander

shmia 1. Mär 2007 12:54

Re: Dame Spiel programmieren
 
Also hier das Kochrezept:
man nehme ein TDrawGrid mit:
ColCount = 9
RowCount = 9
DefaultColWidth = 34
DefaultRowHeight = 34
Dann eine TImagelist auf das Formular mit Height und Width auf 32 setzen.
Dann diverse schwarze und weisse Spielfigueren in die Imageliste einfügen.
PS: falls jemand alle Schachfiguren in Schwarz und Weiss als 32*32 Bitmap hat, dann her damit.

Sodann diesen Code einbasteln:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    DrawGrid1: TDrawGrid;
    ImageList1: TImageList;
    Button1: TButton;
    procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

type
   TChessField = array[1..8, 1..8] of Smallint;
var
   chessField : TChessField;

implementation

{$R *.DFM}


procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   figur : Smallint;
   bkcolor : TColor;
begin
   if ACol = 0 then
   begin
      // Beschriftung vertikal
      if ARow <> 0 then
         DrawGrid1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, IntToStr(ARow));
   end
   else if ARow = 0 then
   begin
      // Beschriftung horizontal
      DrawGrid1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, chr(Ord('A')+ACol-1));
   end
   else
   begin
      // "eigentliches" Schachbrett

      // Hintergrund Farbe ermitteln
      if Odd(ACol+ARow) then
         bkcolor := clLime
      else
         bkcolor := clWhite;

      // Hintergrund zeichnen
      DrawGrid1.Canvas.brush.Color := bkcolor;
      DrawGrid1.Canvas.FillRect(rect);

      // Spielfigur zeichen
      figur := chessField[ACol, ARow];
      ImageList1.Draw(DrawGrid1.Canvas, Rect.Left, Rect.Top, figur);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   chessField[4,3] := 1;
   chessField[3,4] := 2;
   chessField[5,4] := 3;
   DrawGrid1.Invalidate;
end;

end.

Rank 5. Mär 2007 11:15

Re: Dame Spiel programmieren
 
hallo und danke noch mal für die tips!
Mr. Pink wir haben mal eine bitte! wäre es vielleicht möglich das du uns das programm mal schickst? das problem ist nämlich, dass wir nur noch3 wochen zeit haben und dieses spiel die gesamtnote für dieses halbjahr ausmacht und wir nicht weiter kommen. es wäre uns eine echte hilfe.
MFG Christoph

Rank 19. Mär 2007 12:13

Re: Dame Spiel programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
danke shmia, wir haben dein Programm eingegeben und es funktioniert.
in die Imagelist haben wir scwarze und rote punkte eingesetzt,. welche wir selber im paint gezeichnet haben.
wenn wir nun das programm starten können wir zwar die einzelnen Felder im Drawgrid erfassen, jedoch werden keine punkte gezeichnet. was für einen Fehler haben wir gemacht? wir stellen dir unser Programm mal rein, wäre ganz nett wenn du nochmal einen blick darüber werfen könntest.
MFG Christoph

shmia 19. Mär 2007 12:46

Re: Dame Spiel programmieren
 
Zitat:

Zitat von Rank
jedoch werden keine punkte gezeichnet

Weil das Event OnDrawCell nicht verbunden ist.
DrawGrid auswählen, im Objektinspektor auf Seite Ereignisse, OnDrawCell auswählen, aufklappen und DrawGrid1DrawCell eintragen.

Blackheart 19. Mär 2007 12:48

Re: Dame Spiel programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn Ihr die Steine mit Canvas zeichnet, warum dann nicht auch gleich das Spielfeld.

Edit:

Habs Mir nicht angeschaut, und mal wieder falsch gelesen.

Rank 26. Mär 2007 12:11

Re: Dame Spiel programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo hallo, mein vollständiges Spieleld habe ich jetzt! (DANKE DANKE DANKE)
auch das mit den Spielfiguren klappt, nur das sie leider auf alle Felder eingetragen sind und das somit auch das springen untereinander nicht klappt. ich stell das Programm einfach nochmal rein, vielleicht fällt euch ja noch was ein.
MFG Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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