Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Herausfinden ob Breakpoint ist oder nicht - Wie? (https://www.delphipraxis.net/168831-herausfinden-ob-breakpoint-ist-oder-nicht-wie.html)

torud 13. Jun 2012 10:26

Delphi-Version: 7

Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Hallo Wissende,

ich habe zur Verfügung den Punktestand von Spieler A (30) und B (40) und weiss wer den Aufschlag (A) hat.

In dem konstruierten Fall hat Spieler A den Aufschlag und nur 30 Punkte und Spieler B hat 40 Punkte. Somit haben wir die Situation, dass wir einen Breakball haben.

Breakball ist immer, wenn der Aufschlagsempfänder 40 Punkte oder Vorteil hat und der Aufschlagende weniger Punkte als der andere hat. Bei 0 - 40 hätte man zum Beispiel 3 Breakballe, weil man 3 mal die Chance hat mit dem nächsten Punkt das Spiel zu gewinnen.

Ich bin nun am Rätseln, wie ich eine Funktion schreiben kann, die möglichst kurz ist, die mir als Ergebnis einfach nur einen boolschen Wert True zurückgibt, wenn wir einen Breakball haben.

Wenn ich jetzt einfach nur nach Strings vergleichen würde, wäre die Routine ewig lang. Geht das auch einfacher?

Für die, die nicht wirklich Ahnung vom Tennis haben.
Es gibt folgende Punkte innerhalb eines Punktspieles:

0,15,30,40 der danach erungene Punkt würde den Spielpunkt erbringen.

Stünde es 40 - 40 wäre Einstand
Danach Käme dann 40 - A -> Spieler B hat Vorteil und wenn Spieler A Aufschlag hätte, wäre Breakball und umgekehrt.

Ich bin am grübeln, ob es sinnvoll wäre da nen eigenen Typen für die Punkte zu deklarieren, weiss aber noch nicht genau wie.
Habt Ihr Ideen dazu?

himitsu 13. Jun 2012 10:53

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Du hast doch Zahlen, wieso willst du da Strings vergleichen?


- Fasse doch erstmal die Bedingungen in kurze Sätze. (hast du schon, ber mehr so im rießigen Text verteilt)
- gruppiere diese (Teil)Sätze ordentlich, nach ihren Zusammenhängen
- wandle alle Sätze in Formeln um
- und fertig

Zitat:

Breakball ist immer,
wenn der Aufschlagsempfänder 40 Punkte
oder
Vorteil hat
und
der Aufschlagende weniger Punkte als der andere hat.
A = Aufschlagende
B = Aufschlagsempfänder

Delphi-Quellcode:
Breakball :=
(
  (PunkteB = 40)
  or
  ( was war nochmal vorteil? )
)
and
(PunkteA < PunkteB)
;
oder, da ich in deinem Satz nicht erkennen konnte, wie die Zusammenhänge sind, bzw. wie die Klammersetzung wäre. :stupid:
[edit] ich glaub Ersteres klingt besser/richtiger [/edit]
Delphi-Quellcode:
Breakball :=
(PunkteB = 40)
or
(
  ( was war nochmal vorteil? )
  and
  (PunkteA < PunkteB)
)
;

torud 13. Jun 2012 10:58

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Hallo,

folgende Punkte gibt es:

0,15,30,40

Mit dem folgenden Punkt erhält ein Spieler den Spielpunkt, wenn der andere < 40 Punkte hat.

Folgende Breakballsituation gibt es:

Aufschlag hat Spieler A
Spielstand ist A - B
0 - 40 -> 3 breakbälle B*
15 - 40 -> 2 breakbälle B*
30 - 40 -> 1 breakball B*
40 - 40 -> 0 breakbälle B
40 - A -> 1 breakball B*

* Macht Spieler B den nächsten Punkt, gewinnt er das Spiel

Aufschlag hat Spieler B
Spielstand ist A - B
40 - 0 -> 3 breakbälle A*
40 - 15 -> 2 breakbälle A*
40 - 30 -> 1 breakball A*
40 - 40 -> 0 breakbälle A
A - 40 -> 1 breakball A*

* Macht Spieler A den nächsten Punkt, gewinnt er das Spiel

Wichtig ist also, WER Aufschlag hat.

Da es zu einer Vermischung von Datentypen kommt (0,15,30,40,A), dachte ich, dass es vielleicht sinnvoll wäre einen eigenen Datentypen einzusetzen.

Ich hoffe, das macht es leichter, die Breakball-Situation einzuschätzen.

BUG 13. Jun 2012 11:06

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Zitat:

Zitat von torud (Beitrag 1170622)
Ich hatte über einem eigenen Typen nachgedacht, weil es Punkte 0,15,30 und 40 gibt und der Vorteil als A (wie Advantag) kommt. Es liegt hier also eine Vermischung von Datentypen vor.

Was du vermutlich suchst, sind zusammengesetzte Datentypen:
Delphi-Quellcode:
type
  TTennisMatchPunktZahlDingens = record
    punkte: integer;
    advantag: boolean;
  end.
Wenn du dir überlegst, welche Datentypen du zur Laufzeit benutzt, dann ist "Ich packe einfach alles in einen String." fast immer die falsche Entscheidung.

torud 13. Jun 2012 11:17

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Ich hatte vermutet, dass so was hier aus SInn machen könnte:

Delphi-Quellcode:
TMatchStatus = (p0, p15, p30, p40, pA);
Aber wenn ich´s wüsste, hätte ich nicht gefragt.

Aphton 13. Jun 2012 13:58

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Nur aus Neugier:
Wenn einer Breakball hat, jedoch die Runde verliert, ists dann (sozusagen) wieder Gleichstand? Dh. kann man nur gewinnen, wenn man bei einem Breakball punktet?

A - B - (* Breakball)
30 - 40* - B punktet, gewinnt Match/Runde
30 - 40* - A punktet -> neuer Stand:
40 - 40 - A punktet nochmal -> ...
40* - 40 - entweder A punktet und gewinnt oder B punktet (neuer Stand:)
40 - 40

läuft das so ständig hin und her?

torud 13. Jun 2012 14:32

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Hallo,

hier mal ein möglicher Verlauf:

* schlägt auf

A* - B
0 - 15 durch Punkt B
0 - 30 durch Punkt B
0 - 40 = 3BP durch Punkt B
15 - 40 = 2BP durch Punkt A
30 - 40 = 1BP durch Punkt A
40 - 40 = Einstand durch Punkt A
40 - A = Vorteil B = 1BP Punkt durch B
40 - 40 = Einstand nach Punkt durch A
A - 40 = Vorteil A nach Punkt A

Der Spielpunkt könnte vergeben werden, wenn B bei Breakball einen weiteren Punkt macht. Dann erhält B einen Spieltpunkt und die Gamepunkte werden wieder auf 0 resetet.
Der Spielpunkt kann auch vergeben werden, wenn A einen Punkt macht und es A - 40 steht. In dem Falle liegt aber keine Breakball vor, da ein BP nur der Aufschlagsemüfänger haben kann. Kann ein Aufschlagender Spieler einen Spielpunkt mit dem nächsten Punkt erringen, nennt man das Spielpunkt.

Der Wechsel von 40 - 40 nach A - 40 oder 40 - A kann ewig hin und her gehen. Solange, bis einer den entscheidenden Punkt macht.

Ein zu 0-Spiel würde so verlaufen.

Stand Spiele = 0-0

A schlägt auf
0 - 0 danach Punkt A
15 - 0 danach Punkt A
30 - 0 danach Punkt A
40 - 0 danach Punkt A

Stand Spiele = 1-0
aktueller Stand im nachfolgenden Spiel ist wieder 0-0

Aphton 13. Jun 2012 14:46

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Ok, glaube es verstanden zu haben. Liefere demnächst ein Codefetzen...

Luckie 13. Jun 2012 14:52

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Argh, hättest du das Wort Tennis nicht am Anfang gleich nennen können? Ich habe mich die ganze Zeit gefragt, von was du da überhaupt redest. Erst als du die Regeln erklärt hast, habe ich verstanden um was es eigentlich geht.

Sagt man bei 40:40 nicht eigentlich Deuce?

Aber lös dich doch mal von den krummen Punkten vom Tennis:

0 entspricht 0
15 entspricht 1
30 entspricht 2
40 entspricht 3

Steht es also 0:40 im Tennis hast du 0:3 -> 3-0=3 Breakpunkte.
steht es 15:40 im Tennis hast du 1:3 -> 3-1=2 Breakpunkte.

Wenn du jetzt den Datentyp Enum nimmst kannst du mit den Ordinalwerten der Einträge rechnen. So meine Idee. Eine konkrete Umsetzung mit Code kann ich dir leider nicht anbieten.

Aphton 13. Jun 2012 14:56

AW: Herausfinden ob Breakpoint ist oder nicht - Wie?
 
Delphi-Quellcode:
type
  TTennisPunkte = (tp0 = 0, tp15 = 15, tp30 = 30, tp40 = 45, tpA = 60); // in 15er Schritten, da es programmintern evt. besser zu handhaben ist
  PTennisSpieler = ^TTennisSpieler;
  TTennisSpieler = record
    Punkte: TTennisPunkte;
    Aufschlag: Boolean;
    {...}
  end;

function istBreakBall(SpielerA, SpielerB: TTennisSpieler): Boolean;
  { Zitat
      Breakball ist immer, wenn der Aufschlagsempfänder 40 Punkte oder Vorteil hat
      und der Aufschlagende weniger Punkte als der andere hat. Bei 0 - 40 hätte
      man zum Beispiel 3 Breakballe, weil man 3 mal die Chance hat mit dem
      nächsten Punkt das Spiel zu gewinnen.
  }
var
  Aufschlagender, AufschlagEmpfänger: PTennisSpieler;
begin
  if not (SpielerA.Aufschlag xor SpielerB.Aufschlag) then
    raise Exception.Create('Ungültige Aufschlagsituation.');
  if SpielerA.Aufschlag then
  begin
    Aufschlagender := @SpielerA;
    AufschlagEmpfänger := @SpielerB;
  end else
  begin
    Aufschlagender := @SpielerB;
    AufschlagEmpfänger := @SpielerA;
  end;
  Result := (AufschlagEmpfänger.Punkte >= tp40) and (Aufschlagender.Punkte < AufschlagEmpfänger.Punkte);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 1 von 3  1 23      

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