Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Monopoly-Gundlagenprobleme (https://www.delphipraxis.net/131698-monopoly-gundlagenprobleme.html)

AcidBurn 29. Mär 2009 11:42


Monopoly-Gundlagenprobleme
 
Guten Morgen^^

Ich habe vor Monopoly mit Delphi 7 zu programmieren und habe mir schonmal ein paar Gedanken gemacht, aber hänge noch an ein paar Grundlagen..
Meine Delphi Kenntnisse würde ich als solide bezeichnen und hoffe jmd kann mir helfen, auch wenn das Thema schon öfter dran war, jedoch habe ich mit der Suchfunktion nichts passendes gefunden.

Also es geht erstmal um den Spielfeldaufbau. ich wollte es mit einem eindimensionalen array machen, das Problem ist jetzt nur die grafische Umsetzung. sollte ich das SPielfeld lieber aus 40 einzelnen Bildern aufbauen oder z.B per Laufzeit im Programm zeichnen lassen? oder sollte ich das Spielfeld aus nur einem Bild aufbauen? doch wie soll ich dann die entsprechenden Felder ansprechen, auf die man klickt?
Das zweite Problem ist wie ich die SPielfiguren auf den entsprechenden Feldern darstelle.

Meine Letzte Frage ist, ob ich in einen Bildnamen eine Variable in einer Schleife einbauen kann. zum besseren Verständnis ein Beispiel:
Ich möchte mehrere Bilder in einer For-Schleife von unsichtbar auf sichtbar machen. Die Bilder beginnen alle mit "img[Zahl]".
Gibt es also eine möglichkeit das etwa so zu gestalen:

Delphi-Quellcode:
     for i:=0 to 4 do begin
        img[i].visible := true;
     end;
Ich hoffe man kann mir schnellstmöglich helfen.
mfg
AcidBurn

Meflin 29. Mär 2009 11:50

Re: Monopoly-Gundlagenprobleme
 
Du kannst. Eine Möglichkeit wäre, dafür Hier im Forum suchenFindComponent zu verwenden, aber die sauberere wäre, die Images in einem array o.ä. zu verwalten
Delphi-Quellcode:
Bilder: array of TImage;

initialisieren... (SetLength und so...)

for i := Low(Bilder) to High(Bilder) do begin
  Bilder[i].visible := true;
end;

igel457 29. Mär 2009 11:52

Re: Monopoly-Gundlagenprobleme
 
Ich würde dir für die Grafische umesetzung zur Verwendung einer Grafikbibliothek wie zum Beispiel Andorra 2D raten. Die Spielfelder kannst du dann einfach als Sprite darstellen. Außerdem lassen sich so viel einfacher weitere Elemente des Spielfelds anzeigen und 3D-Effekte einfügen. Die Mausklickabfrage wird dir so auch abgenommen.
Die Felder würde ich mit dem Canvas auf ein TBitmap "vorrendern" (je nach Eigenschaften in der Definitionsdatei) und dann in die Grafikbibliothek laden.

Ich würde das Spielfeld in einer Definitonsdatei (XML) speichern:
Code:
<field>
  <type>start</type>
</field>
<field>
  <name>Badstraße</name>
  <price>250</price>
  <type>street</type>
  <color>Blue</color>
</field>
<field>
  <name>Zusatzsteuer</name>
  <type>tax</type>
  <cost>3000</cost>
</field>
<field>
  <name>Turmstraße</name>
  <price>275</price>
  <type>street</type>
  <color>Blue</color>
</field>
Schau dir einfach mal ein Paar Tutorials zum Thema Andorra 2D, XML (Jedi SimpleXML/AdSimpleXML.pas) und Offscreen-Bitmaps (TBitmap) an.

Matze 29. Mär 2009 11:58

Re: Monopoly-Gundlagenprobleme
 
Hallo, herzlich Willkommen!

Gleich vorweg: Der Sinn eines Forums ist, eine gemeinsame Lösung zu erarbeiten, von der auch andere profitieren können. Du kannst deine E-Mail-Adresse also gleich wieder entfernen. Das hat gleich den positiven Nebeneffekt, dass Spam-Bots diese nicht finden können.

Hast du wirklich die Suchfunktion genutzt? Über Hier im Forum suchenMonopoly finden sich so viele Themen, auch mit Lösungsansätzen.

Wenn du Andorra nicht nutzen möchtest/darfst, kannst du das beispielsweise auch mit Records lösen. Das könnte ganz grob so aussehen:

Delphi-Quellcode:
type TPrice = record
  Street: Integer;
  StreetHypo: Integer;
  House: Integer;
  Hotel: Integer;
end;

type TField = record
  Color: TColor;
  Players = array of Integer; // Spieler, die sich auf dem Feld befinden (Indizes)
  Price: TPrice;              // Kosten
  HouseNum: Integer;
  HotelNum: Integer;
  FieldType: // ... Steuer, Bahnhof, ...
end;

MyField: array of TField;
Das lässt sich auch schön objektorientiert lösen, wenn deine Kenntnisse so weit sind. Mit Andorra geht das natürlich schöner und evtl. auch einfacher und performanter. Ggf. sogar mit netten Grafik-Effekten.

Aber schaue dir die Monopoly-Themen durch. Da findest du genug Infos über eine mögliche Umsetzung.

Grüße

AcidBurn 29. Mär 2009 12:38

Re: Monopoly-Gundlagenprobleme
 
Also erstmal danke für die schnellen Antworten.
Ich denke die Methode mit den records ist für mich am besten, da ich von Andorra noch nie etwas gehört habe und mich damit erst lange zeit befassen müsste.

Ein Array von Typ TImage um die einzelnen Spielfelder in einer Schleife sichtbar zu machen ist schön und gut, jedoch wird mein quelltext dadurch auch nicht kürzer, aber vllt gibts ja auch noch eine andere Möglichkeit. Hier ein Ausschnitt wie ich es gelöst habe:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    //Spielfelder
    img00: TImage; img01: TImage; img02: TImage;      // Die einzelnen Bilder auf dem Spielfeld bis 40!
end;

type TFeld = record
    img: array of TImage;
end;

var
feld: TFeld;
So und wenn ich jetzt das Spielfeld aufbauen will muss ich doch erst deklarieren, dass der Inhalt von "feld.img[Index] := img00" ist oder nicht? ich kann dann zwar eine Schleife für das visible schreiben, aber nicht für die Zuweisungen, von gerad eben.
Es kommt also folgendes zusammen:

Delphi-Quellcode:
procedure TForm1.Spielfeld_aufbauen;
var i: integer;
begin
  feld.img[0] := img00; feld.img[1] := img01; feld.img[2] := img02; //usw. (Für 40 Felder zu lang!)

  for i:=low(feld.img) to high(feld.img) do begin
    feld.img[i].Visible := true;
  end;
end;
Geht das nicht noch anders zu lösen?

mfg

Matze 29. Mär 2009 12:44

Re: Monopoly-Gundlagenprobleme
 
FindComponent wurde bereits genannt. Suche doch dann nach diesen Stichwörtern, dann würdest du auch eine Lösung finden:

Delphi-Quellcode:
for i := 1 to 40 do
  (FindComponent('img' + IntToStr(i)) as TImage).Visible := true;
Deine TImages müssen dann so benannt sein: "img1", "img2", ... ohne führende Nullen.
Der Code macht alle 40 Bilder sichtbar (oder wie viele es beim Monopoly sind).

Grüße

AcidBurn 29. Mär 2009 18:41

Re: Monopoly-Gundlagenprobleme
 
Klasse das funktioniert jetz alles :)

Jetzt gibt es nur noch ein Problem vor dem ich stehe und ich hoffe auch da kann mir geholfen werden ;)

Ich will nun bei einem Neuen Spiel das gestartet wird ein Fenster aufrufen indem alle Optionen für ein neues Spiel eingestellt werden. Also Spielernamen, Anzahl der SPieler, etc.
Ich dachte mir das macht man am besten mit einem neuen Formular (vllt gehts auch besser anders?). Das Problem hierbei ist nur dass das neue Formular eine neue Unit benötigt. und diese neue Unit braucht ja Variablen aus der Ersten Unit. Nur muss ja auch die erste unit variablen der zweiten unit bekomme wenn ich z.b die varbiable SPielername in unit1 deklariert habe, muss sie unit 2 füllen und unit 1 braucht sie dann später wieder um etwas damit zu machen.
Nun kann man natürlich im "uses" Teil keine doppelte verzweigung herstellen.

Ich hoffe dabei bekomm ich nochmal Hilfe ;)

mfg

mkinzler 29. Mär 2009 18:47

Re: Monopoly-Gundlagenprobleme
 
Man kann problemlos von einer Unit auf die globalen Variablen eine anderen Unit zugreifen. das gilt auch für ein Formular. Besser wäre es aber, die gemeinsam verwendeten Variablen in eine 3. Unit auszulagern, welche dann von den anderen Units zugegriffen wird.

matashen 30. Mär 2009 08:23

Re: Monopoly-Gundlagenprobleme
 
ihr macht das alles so kompliziert...
... ich mach grad im Retrobereich Monopoly für den Atari Lynx (wer in nicht kennt der guckt mal bei Wiki)
Wer die Beta sehen will tippt lynxopoly bei youtube :)

Da quetsch ich das ganze mit C und Assembler in 64KB RAM (OK da gehen erstmal 17KB für Loader und Screenbuffer weg also eigentlich 47 KB).

Und das ganze passt da rein, kann sogar noch nen hübschen MOD-Sound integrieren :)


Ach ja die Original-Feldnamen sind geschützt von Hasbro - sollten also eigene Namen und Texte verwendet werden. Hasbro ist da nicht sehr kulant zumal grad zusammen mit EA-Games die ganzen Brettspiele als Online/und Handy versionen vermarktet werden.

Andorra2D ist da woll etwas mit Kanonen auf Spatzen geschossen. Ein Image für das Spielfeld und ein paar Timages für die Figuren sollten ausreichen.

Ich würde auch nicht jedem Feld einen Counter reservieren für die Spieler die geparkt sind, da dies unerheblich ist. Sondern ein array wo die spielerposition drin steht
spielerbeifeld array[0.. bisspielerzahl] of byte;
damit weist du wo der spieler steht der an der reihe ist
und kannst dann deine Bildfigur bequem auf das passende Feld ziehen

Wenn du hier mit counter für die Spieler auf den einzelnen Feldern rummachst musst du trotzdem irgendwie ermitteln auf welches feld dann gezogen wird und wo dann die grafik hin soll etc....

für die positionen der Figurengrafik am Spielfeld ist es am einfachsten auch ein array zu machen

spielerfigurx:array [0..39] of

dann kannst du dein figurenimage.left:=spielfigurx[spielerbeifeld[spielernummer]]; machen und gut ist....
wesentlich weniger code und einfacher aufgebaut.....
...natürlich geht das auch mit tausend zeilen XML-Code und ner Datenbank im Hintergrund ;)

Gruß Matthias

AcidBurn 30. Mär 2009 20:36

Re: Monopoly-Gundlagenprobleme
 
Also insgeamt sieht es relativ gut aus und ich danke euch für die sehr hilfreichen tipps.

Es gibt bei mir im moment ein größeres und ein kleines Problem. ich fang mit dem großen an:

Ich habe ein extra formular erstellt, wo die spieler bestimmte einstellungen beim spielstart vornehmen können.
diese wird mit showmodal aufgerufen, etwa so:

Delphi-Quellcode:
procedure TForm1.Opt_NewGame;
begin
  Form2.ShowModal;
end;
Die form wird auch genau so geöffnet wie es sein soll. ich habe dann auf der 2. Form ein paar edit felder usw und einen button beidem die werte aus den edit feldern in variablen geschrieben werden und die Form2 geclosed wird.
Das Problem ist jetzt: wenn ich keine Einstellungen vornehme funktioniert alles wunderbar nur sobald ich etwas auf der 2. Frm verändere kommt ne riesen Fehlermeldung vonwegen AccesValidation was weiß ich^^ und der debugger zeigt auf das "end;" hinter ShowModal...
Hat vllt einer ne Idee an was das liegen könnte??

Meine 2. Frage ist: ich will dein extra bild für jede Spielfigur machen, nur wie bewege ich diese auf dem spielfeld? ich habe das spielfeld so aufgebaut, dass jedes feld aus einem einzelnen bild besteht.

Ich hoffe man kann mir nochmals helfen =)

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Seite 1 von 2  1 2      

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