Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ClientDataBase Frage (https://www.delphipraxis.net/182988-clientdatabase-frage.html)

xRaysen 2. Dez 2014 09:07

Delphi-Version: 2007

ClientDataBase Frage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bräuchte dringen eure Hilfe.
Mein Problem ist, dass ich ein kleines 2D Spiel programmieren will und dabei gegen Monster kämpfe (Pokemon mäßig), dabei sollen Leben,Angriff,Verteidigung und Name aus
einer ClientDataBase ausgelesen werden, jedoch finde ich nur Befehle bei denen ich die Werte aus der ersten Reihe auslesen kann. Könnte mir jemand sagen wie ich es nun
schaffe auch aus den anderen Reihen Werte auszulesen? Bisher habe ich es mit FieldByName und FieldValues probiert. Im Anhang ist ein Bild, mit erster Reihe ist die Murloc
Reihe gemeint. Ich bin noch ein Anfänger also bitte keine zu komplizierten Lösungen. :)

DeddyH 2. Dez 2014 09:10

AW: ClientDataBase Frage
 
Das ist nicht die erste Reihe, sondern der aktuelle Datensatz. Du kannst aber den Datensatzzeiger mit Methoden wie Next, Prior, First und Last positionieren.

xRaysen 2. Dez 2014 10:30

AW: ClientDataBase Frage
 
Könntest du mir noch sagen wie der Befehl dann aussehen müsste?

DeddyH 2. Dez 2014 10:39

AW: ClientDataBase Frage
 
Teste doch mal das hier:
Delphi-Quellcode:
DeinDataset.First;
while not DeinDataset.EOF do
  begin
    ShowMessage(DeinDataset.Fields[0].AsString);
    DeinDataset.Next;
  end;
DeinDataset must Du natürlich durch den richtigen Namen (ClientDataset1?) ersetzen. Wenn das klappt, bist Du die gesamte Datenmenge von vorn nach hinten durchlaufen und hast von jedem Datensatz den Wert des ersten Feldes ausgegeben. Andererseits hast Du doch einen DBNavigator auf dem Formular, mit dem geht das natürlich auch, wenn er korrekt mit dem Dataset (über eine Datasource) verbunden ist.

xRaysen 2. Dez 2014 11:29

AW: ClientDataBase Frage
 
Vielen Dank!!!
Funktioniert endlich. :-D

xRaysen 2. Dez 2014 11:41

AW: ClientDataBase Frage
 
...

DeddyH 2. Dez 2014 11:42

AW: ClientDataBase Frage
 
Was soll denn der Normalzustand sein?

Sir Rufo 2. Dez 2014 12:46

AW: ClientDataBase Frage
 
Gut, die Datenbank, kann man als Speicher benutzen, aber für das Spiel selber sollte man sich mindestens eine Klasse bauen, mit der man dann einfach arbeiten kann.

Zum Beispiel
Delphi-Quellcode:
type
  TEntity = class
  private
    FName: string;
    FLivePoints: Integer;
    FStrength: Integer;
  public
    constructor Create( const AName: string; ALivePoints, AStrength: Integer );
    procedure Attack( AEntity: TEntity );
    function IsAlive: Boolean;
    property Name: string read FName;
    property LivePoints: Integer read FLivePoints;
    property Strength: Integer read FStrength;
  end;

  { TEntity }

procedure TEntity.Attack( AEntity: TEntity );
begin
  // Selber schlagen?
  if Self = AEntity
  then
    Exit;

  // Lebenspunkte und Stärke verändern sich im Kampf
  Self.FLivePoints := Self.FLivePoints - AEntity.FStrength div 2;
  Self.FStrength := Self.FStrength + AEntity.FStrength div 2;
  AEntity.FLivePoints := AEntity.FLivePoints - Self.FStrength;
end;

constructor TEntity.Create( const AName: string; ALivePoints, AStrength: Integer );
begin
  inherited Create;
  FName := AName;
  FLivePoints := ALivePoints;
  FStrength := AStrength;
end;

function TEntity.IsAlive: Boolean;
begin
  Result := FLivePoints > 0;
end;
Nun kann man zwei Kontrahenten erzeugen und gegenseitig einprügeln lassen
Delphi-Quellcode:
procedure Fight;
var
  L1, L2, LSieger : TEntity;
begin
  L1 := nil;
  L2 := nil;
  LSieger := nil;
  try

    // bereit machen

    L1 := TEntity.Create( 'Peter', 100, 5  );
    L2 := TEntity.Create( 'Wolf', 50, 10 );

    // prügeln bis zum Umfallen

    while L1.IsAlive and L2.IsAlive then
    begin
      case Random(2) of
        0 : L1.Attack( L2 );
        1 : L2.Attack( L1 );
      end;
    end;

    // Auswertung

    if L1.IsAlive then
      LSieger := L1
    else
      LSieger := L2;
    if Assigned( LSieger ) then
      WriteLn( LSieger.Name, ' hat gewonnen!' )
    else
      WriteLn( 'Das Match ging unentschieden aus!' );
  finally
    L1.Free;
    L2.Free;
  end;
end;

Fedral144 6. Dez 2014 11:37

AW: ClientDataBase Frage
 
DeinDataset must Du natürlich durch den richtigen Namen (ClientDataset1?) ersetzen. Wenn das klappt, bist Du die gesamte Datenmenge von vorn nach hinten durchlaufen und hast von jedem Datensatz den Wert des ersten Feldes ausgegeben. Andererseits hast Du doch einen DBNavigator auf dem Formular, mit dem geht das natürlich auch, wenn er korrekt mit dem Dataset (über eine Datasource) verbunden ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.

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