Einzelnen Beitrag anzeigen

Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#15

AW: Strafzeitenverwaltung in eigener Unit

  Alt 20. Jun 2010, 11:04
Hallo,

Ups, dass hatte ich so detailliert nicht auf dem Zettel. Vielleicht macht es hier ja auch Sinn in der Uhrenklasse die Zehntel optional zu halten. Ich müsste dann aber sozusagen aus den 1000ms im Timer eine 100 machen. Sollte ich die 1000 bis zum Erreichen der Minute lassen und dann wenn ich Minute = 0 und Sekunde > 0 ist, den Timer.Interval auf 100 stellen oder grundsätzlich immer?
Ich wuerde dir empfehlen, die Zeit immer in Hunderstelsekunden zu messen (Interval = 10ms), damit es wirklich passt.

Das hier verstehe ich nicht ganz. Der Timer würde dann im private der Uhrenklasse gekapselt werden. So weit ist alles klar. Start-Stop ist auch klar. Was soll aber passieren, wenn ich die Message an die PenaltyClocks (die es ja aktuell noch nicht gibt) sende? Ich dachte, dass der gekapselte Timer alle Uhren "steuert", also die Hauptuhr und die Strafzeituhren zum laufen bringt, indem ER selbst die einzelnen Uhren "zählt". Ist es also so zu verstehen, dass der gekapselte Timer nur die anderen Timer anschieben/anhalten soll???
Ich versuchs mal mit Pseusocode (Delphi ist ein paar Jahre her ^^):
Code:
class GameClock
{
   private timer;
   
   private homePenaltyClocks;
   private awayPenaltyClocks;
   
   public function create()
   {
      this->timer = new Timer;
   }
   
   public function addPenaltyClock(team, clock)
   {
      clock->team = team;
      clock->gameClock = this;
      
      if (team == 'home')
      {
         this->homePenaltyClocks->push(clock);
      }
      else
      {
         this->awayPenaltyClocks->push(clock);
      }
   }
   
   public function start()
   {
      this->timer->start();
      
      for (i = 0; i < this->homePenaltyClocks->count() && i < 2; i++)
      {
         this->homePenaltyClocks[i]->start();
      }
      for (i = 0; i < this->awayPenaltyClocks->count() && i < 2; i++)
      {
         this->awayPenaltyClocks[i]->start();
      }
   }
   
   public function stop()
   {
      this->timer->stop();
      
      for (i = 0; i < this->homePenaltyClocks->count() && i < 2; i++)
      {
         this->homePenaltyClocks[i]->stop();
      }
      for (i = 0; i < this->awayPenaltyClocks->count() && i < 2; i++)
      {
         this->awayPenaltyClocks[i]->stop();
      }
   }
   
   public function penaltyClockComplete(team)
   {
      // Erstes Element aus dem Array entfernen
      // Wenn dann immer noch 2 Strafzeiten da sind, die zweite starten.
   }
}
Ein paar kurze Erklaerungen: es gibt einen Timer fuer die Zeitmessung, sowie zwei Arrays von PenaltyClocks. Die Methode addPenaltyClock fuegt eine PenaltyClock der GameClock hinzu und uebergibt der PenaltyClock ein paar Informationen.
start() und stop() starten/stoppen die Zeitmessung sowie die der ersten beiden PenaltyClocks (soweit vorhanden).
penaltyClockComplete() sagt der GameClock, dass eine Strafzeit abgelaufen ist und eine eventuell weitere gestartet werden muss (das darfst du dann selbst implementieren - ist aber auch keine Kunst).

Code:
class PenaltyClock
{
   private timer;
   public gameClock;
   public team;
   
   public function create()
   {
      this->timer = new Timer();
   }
   
   public function start()
   {
      this->timer->start();
   }
   
   public function stop()
   {
      this->timer->stop();
   }
   
   public function onTimerComplete()
   {
      if (!this->gameClock || !this->team)
      {
         return;
      }
      
      this->gameClock->penaltyClockComplete(team);
   }
}
Die PenaltyClock enthaelt einen eigenen Timer, da sie unabhaengig zur GameClock laufen muss.
start() und stop() brauchen ja keine Informationen.
Im onTimerComplete()-Event wird dann (sofern team und gameClock gesetzt sind) der entsprechenden GameClock gesagt, dass eine Strafzeit fuer eine entsprechende Mannschaft abgelaufen ist.
Das sollte das Prinzip ein bisschen naeher bringen. Der Code ist nicht der schoenste, aber nachdem du eh Delphi-Code brauchst musst du ihn sowieso neu schreiben - so dass auch weniger Code doppelt vorkommt

Jo, davon hatte ich was gehört. Mir ist noch nicht ganz klar, wie das bei den 5-10 und 20-Minuten-Strafen ist, wo ja der Ausschluss des Spielers noch hinzukommt. Bei manchen Strafen ist es wohl so, dass DER oder EIN Spieler raus muss, aber natürlich nicht die vollen 10 Minuten absitzt. Dann gibt es da noch die Regel, dass die 2 Minuten-Strafzeit sofort gelöscht wird, wenn das in Unterzahl befindliche Team ein Tor "bekommt", respektive, dass bei einer 2+2-Strafe die ersten 2 Minuten gelöscht werden und direkt die 2. Strafzeit losläuft. Ziemlich irre!
Ok, Eishockey-Regelkunde: mal abgesehn von der "niemals mehr als 2 Strafzeiten-Regel" gibt es folgendes zu beachten:
  • 2+2 ist ein Sonderfall, ueber den du dir Gedanken machen musst. Das sind naemlich zwei Strafzeiten, die aber nicht parallel ablaufen duerfen (waere ja witzlos). Auf der anderen Seite wuerde ein Tor eine der beiden Strafzeiten negieren. Den Teil ueberlass ich dir. Eine Moeglichkeit waere, in der PenaltyClock auch abzuspeichern, was fuer eine Strafe es ist. Das brauchst du eh um bei einem Tor Minors und Majors unterscheiden zu koennen
  • 2-Minuten-Strafen enden bei einem Tor der Ueberzahl-Mannschaft.
  • 5-Minuten-Strafen enden bei einem Tor der Ueberzahl-Mannschaft nicht.
  • Bei 2+10, 5+10, 2+2+10, 5+20 (2+20 gibts eigentlich nicht) wird die Disziplinarstrafe (10 bzw. 20 Minuten) nicht auf die Anzeigetafel gesetzt, sie laeuft aber ab.
  • Der Spieler, der die Strafe begangen hat, sitzt die Disziplinarstrafe ab, waehrend die eigentliche Strafzeit von einem anderen Spieler abgesessen wird (aehnlich wie bei der "zuviel Personal"-Regel oder wenn ein Goalie 2 Minuten kassiert ).
  • Ob die Disziplinarstrafe sofort lostickt oder erst nach Ablauf der ersten 2 Minuten kann dir ein Eishockey-Regelbuch sagen, ich habs grad nicht im Kopf.
  • Alternativ geh zu einem Eishockeyspiel in einer unteren Liga (<= 2. Bundesliga) und frag die Zeitnahme, ob sie dir bisserl was erzaehlen koennen waehrend das Spiel laeuft. Die Jungs sind meistens sehr kommunikativ

Im Beispiel oben bedeutet das: dein Observer-Pattern darf nur die ersten beiden PenaltyClocks einer Mannschaft starten. Laeuft eine PenaltyClock aus, muss sie die erste nicht laufende PenaltyClock der eigenen Mannschaft starten.
Jep! Eigentlich ist es ja dann auch so, dass die bis dahin aktuell 2. Uhr an 1. Stelle rutschen muss und die neu zu startende Uhr an 2. Stelle => Wenn die Strafzeit grösser ist als die Restzeit der ersten. Das aber nur am Rande, weil ich die Uhren ja auch irgendwann mal rausschicken muss und der Empfänger natürlich grosse Lust drauf hat die Uhr korrekt sortiert zu erhalten.

Jo, im Grossen und Ganzen scheinst Du nicht nur Ahnung vom Programmieren zu haben, sondern auch einiges über die Regeln im Eishockey zu wissen. Cool!
Danke

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat