/***************************************************
                     wbsatz.c
Satzlängen bei Wasser-Ball-Über-Die-Schnur berechnen
                     von Haxe
                www.pansensack.de
***************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct ergebnis {
  int ballwechsel;
  int punkte[2];
};

struct ergebnis *satz(void);
int boolrand(void);


/* Hauptprogramm */

int main(void) {
  int    max=0;
  double count=0, sum=0;
  struct ergebnis *current;
  
  printf("wbsatz 1.0 - Spielt zufällige Sätze für "
         "Wasser-Ball-Über-Die-Schnur.\n\n");
  srand(time(0));  /* init */
  
  while(1) {                            /* immer wieder... */
    count++;
    current = satz();                   /* einen Satz spielen... */

    sum += current->ballwechsel;        /* und das Ergebnis auswerten */ 
    if (current->ballwechsel > max) {
      max = current->ballwechsel;      
      printf("Neuer Rekordsatz mit %i Ballwechseln "
             "(bisheriger Durchschnitt: %f)\n"
	     "nach Berechnung von insgesamt %.0f Sätzen. "
	     "Endstand: %i zu %i\n\n",
	     current->ballwechsel, sum/count, count,
	     current->punkte[0], current->punkte[1]);
    }
  }  

  return(0);   /* Ende, kommt aber nicht vor :-) */
}


/* Zufälligen Satz berechnen und Ergebnis zurückgeben */

struct ergebnis *satz(void) {
  int angeber=0, winner, diff;
  static struct ergebnis this;
  int *p = this.punkte;
  
  this.ballwechsel = 0;   /* Alles auf null */
  p[0] = p[1]      = 0;
  
  do {   
    this.ballwechsel++;
    winner = boolrand();
    if (winner == angeber)
      p[winner]++;
    angeber = winner;
    if ((p[winner] == 4) && (p[0] * p[1] == 0)) /* Kurzsatz */
      break;
    diff = p[0] - p[1];
  } while ((diff*diff < 4) || (p[winner] < 8)); /* Abbruch bei 8 und Tiebreak */ 

  return(&this);
}


/* Boolesche Zufallszahl
   Die Güte der Zufallszahl ist systemabhängig.
   Bei Versuchen unter Windows (Visual C++) gab es auf
   diese Weise bis zu 72 Ballwechsel, unter Linux (glibc)
   bis zu 115 Ballwechsel. Wer es noch weiter treiben will,
   muss an dieser Stelle einen besseren Zufi verwenden. */

int boolrand(void) {
  return (rand() & 1);
}


