AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Operator in Variable speichern?

Ein Thema von Rudinii · begonnen am 2. Mär 2016 · letzter Beitrag vom 2. Mär 2016
Antwort Antwort
Rudinii
(Gast)

n/a Beiträge
 
#1

Operator in Variable speichern?

  Alt 2. Mär 2016, 17:24
Delphi-Version: 7
Hallo zusammen,
ich habe eine kleine Frage bezüglich Operatoren:
Ich möchte eine Art Spiel programmieren bei dem ein wichtiger Part "Upgrades" sind. Diese möchte ich als Records abspeichern.
Diese Upgrades sollen mit einem bestimmten Zahlenwert (Integer) entweder eine Multiplikation oder Addition durchführen. Da dies
für jedes Upgrade anders sein soll dachte ich mir ich speichere es in einer Variable ab.

Also ungefähr so:
Delphi-Quellcode:
var
Zahlwert:Integer;
BeispielUpgrade:Upgrade;
begin
Zahlwert Beispielupgrade.Rechenzeichen BeispielUpgrade.Stärke //Hier soll BeispielUpgrade.Rechenzeichen entweder '*' oder '+' sein und BeispielUpgrade.Stärke ist ein Integerwert
Irgendwelche Tipps wie ich das realisieren könnte?
Danke im Vorraus,
Rudinii
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

AW: Operator in Variable speichern?

  Alt 2. Mär 2016, 17:27
Ich würde einen Funktionspointer speichern.

Pseudocode:

Code:
function addiere(a, b): return a+b
function multipliziere(a, b): return a*b

a = 4
b = 2
op = addiere

result = op(a, b)
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Rudinii
(Gast)

n/a Beiträge
 
#3

AW: Operator in Variable speichern?

  Alt 2. Mär 2016, 17:31
Hey, schonmal danke
Bin leider noch ein Anfänger, könntest du vielleicht erläutern wie das in meinen "Code" passen würde?
Grüße,
Rudinii

EDIT: Habs raus gekriegt, kann geschlossen werden^^

Geändert von Rudinii ( 2. Mär 2016 um 17:38 Uhr) Grund: Habs verstanden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Operator in Variable speichern?

  Alt 2. Mär 2016, 17:39
Valles Vorschlag würde auf jeden Fall funktionieren und ist evtl auch etwas schöner, aber einfacher zu verstehen ist das:

Frag einfach mit einem if das Rechenzeichen ab:
Delphi-Quellcode:
if upgrade.Rechenzeichen = '+then // oder mit nem Aufzählungstyp (besser) sowas wie rzPlus
  Ergebnis := Wert + upgrade.Stärke
else
if upgrade.Rechenzeichen = '*then // oder mit nem Aufzählungstyp (besser) sowas wie rzMal
  Ergebnis := Wert * upgrade.Stärke
else
  // usw..
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Operator in Variable speichern?

  Alt 2. Mär 2016, 17:50
Oder man nimmt einen OOP Ansatz
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  TBase = class abstract
  protected
    procedure InteractionTo( Dest: TBase ); virtual;
  public
    procedure InteractWith( Source: TBase ); virtual;
  end;

  TStrength = class( TBase )
  private
    FValue: Integer;
  public
    function ToString: string; override;
    property Value: Integer read FValue write FValue;
  end;

  TUpgrade = class abstract( TBase )
  private
    FValue: Integer;
  public
    constructor Create( Value: Integer );
    property Value: Integer read FValue;
  end;

  TSomeUpgrade = class( TUpgrade )
  protected
    procedure InteractionTo( Dest: TBase ); override;
  end;

  TSomeOtherUpgrade = class( TUpgrade )
  protected
    procedure InteractionTo( Dest: TBase ); override;
  end;

  { TBase }

procedure TBase.InteractionTo( Dest: TBase );
begin
  raise Exception.Create( 'Cannot interact' );
end;

procedure TBase.InteractWith( Source: TBase );
begin
  Source.InteractionTo( Self );
end;

{ TStrength }

function TStrength.ToString: string;
begin
  Result := Format( 'Strength = %d', [ FValue ] );
end;

{ TSomeUpgrade }

procedure TSomeUpgrade.InteractionTo( Dest: TBase );
begin
  if Dest is TStrength
  then
    begin
      TStrength( Dest ).Value := TStrength( Dest ).Value + Self.Value;
      Self.FValue := 0;
    end
  else
    inherited;
end;

{ TSomeOtherUpgrade }

procedure TSomeOtherUpgrade.InteractionTo( Dest: TBase );
begin
  if Dest is TStrength
  then
    begin
      TStrength( Dest ).Value := TStrength( Dest ).Value * Self.Value;
      Self.FValue := 1;
    end
  else
    inherited;
end;

procedure Test;
var
  s: TStrength;
  u: TUpgrade;
begin
  s := TStrength.Create;
  try
    s.Value := 10;

    WriteLn( s.ToString( ) );

    u := TSomeUpgrade.Create( 10 );
    try
      s.InteractWith( u );
    finally
      u.Free;
    end;

    WriteLn( s.ToString( ) );

    u := TSomeOtherUpgrade.Create( 10 );
    try
      s.InteractWith( u );
    finally
      u.Free;
    end;

    WriteLn( s.ToString( ) );
  finally
    s.Free;
  end;
end;

{ TUpgrade }

constructor TUpgrade.Create( Value: Integer );
begin
  inherited Create;
  FValue := Value;
end;

begin
  try
    Test;
  except
    on E: Exception do
      WriteLn( E.ClassName, ': ', E.Message );
  end;

  ReadLn;

end.
Allerdings würde es wohl eher Sinn machen statt der TStrength Klasse eine Spieler-Klasse zu definieren und die Upgrades können dann auf die unterschiedlichsten Eigenschaften der Spieler-Klasse wirken.

Dann kann man auch noch alle anderen Klassen definieren, die in irgendeiner Art und Weise untereinander interagieren, was man dann einfach in den jeweiligen Klassen hinterlegt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Operator in Variable speichern?

  Alt 2. Mär 2016, 18:22
Soll die Reihenfolge der Upgrades eine Rolle spielen? Ansonsten musst du dir darüber im Klaren sein, dass du nicht Addition und Multiplikation gleich behandeln darfst sondern eine Regel festlegen musst, wie sie angewendet werden (z.B. erst die additiven Upgrades auf den Basiswert und dann mit der Summe der multiplikativen verrechnen) - und dann könnte es noch Upgrades geben, die nicht miteinander stacken
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 2. Mär 2016 um 18:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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