F1 Mod: korrekte Gewinnberechnung?

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Hi! :cool:

Seit einiger Zeit bin ich dabei den F1 Mod und den Cash Mod zusammenzubringen. Das klappt bisher auch ganz gut. Aktuell hänge ich jedoch bei dem Problem der korrekten Berechnung des Gewinns fest und bräuchte bitte mal wieder einen größeren Denkanstoß. :)

Ich habe folgendes bisher umgesetzt:

Code: Alles auswählen

//
// Race Bet
//
if ($formel_config['show_race_bet'] == '1')
{
	$sql = "SELECT COUNT(*) AS count FROM " . FORMEL_RACES_TABLE;
	if(!$result = $db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, "Could not query formel_races table", "Error", __LINE__, __FILE__, $sql);
	}
	$total_races = $db->sql_fetchfield("count", 0, $result);   // Anzahl der Rennen pro Saison

	$sql = "SELECT COUNT(*) AS count FROM " . USER_GROUP_TABLE . " WHERE group_id=106";
	if(!$result = $db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, "Could not query formel_races table", "Error", __LINE__, __FILE__, $sql);
	}
	$total_tippers = $db->sql_fetchfield("count", 0, $result);   // Anzahl der Tipper 
	
 	$race_place_1 = $formel_config['race_place_1'];   // Gewinn vom gesamten Renneinsatz in Prozent für den 1. Platz
 	$race_place_2 = $formel_config['race_place_2'];   // Gewinn vom gesamten Renneinsatz in Prozent für den 2. Platz
 	$race_place_3 = $formel_config['race_place_3'];   // Gewinn vom gesamten Renneinsatz in Prozent für den 3. Platz
	
	$bet_race_sum = ($formel_config['race_bet'] * $total_tippers);   // Jackpot für das aktuelle Rennen
	$bet_race_place_1 = (($bet_race_sum/'100') * $race_place_1);   // Gewinn für den 1. Platz aktuelles Rennen
	$bet_race_place_2 = (($bet_race_sum/'100') * $race_place_2);   // Gewinn für den 2. Platz aktuelles Rennen
	$bet_race_place_3 = (($bet_race_sum/'100') * $race_place_3);   // Gewinn für den 3. Platz aktuelles Rennen
	
	$bet_season_sum = ($formel_config['race_season'] * $total_races * $total_tippers); // Jackpot für die Saison
	$bet_season_place_1 = (($bet_season_sum/'100') * $race_place_1);  // Gewinn für den 3. Platz für die Saison
	$bet_season_place_2 = (($bet_season_sum/'100') * $race_place_2);   // Gewinn für den 2. Platz für die Saison
	$bet_season_place_3 = (($bet_season_sum/'100') * $race_place_3);   // Gewinn für den 3. Platz für die Saison
}
Diese Berechnung funktioniert auch korrekt.

Das ganze habe ich dann in die Platzberechnung pro Rennen eingebunden:

Code: Alles auswählen

		while ($row = $db->sql_fetchrow($result))
		{
			$real_rank++;
			if($row['tipp_points'] != $previous_points)
			{
				$rank = $real_rank;
				$previous_points = $row['tipp_points'];
			}
			if ($rank === 1)
			{
				$rank_img = '<img src="' . $first_rank . '" alt="1. Platz" title="1. Platz" />';
				$tipper_won_race = $bet_race_place_1;   // Gewinn für den 1. Platz
			}
			elseif ($rank === 2)
			{
				$rank_img = '<img src="' . $secound_rank . '" alt="2. Platz" title="2. Platz" />';
				$tipper_won_race = $bet_race_place_2;   // Gewinn für den 2. Platz
			}
			elseif ($rank === 3)
			{
				$rank_img = '<img src="' . $third_rank . '" alt="3. Platz" title="3. Platz" />';
				$tipper_won_race = $bet_race_place_3;   // Gewinn für den 3. Platz
			}
			else
			{
				$rank_img = $rank;
				$tipper_won_race = '0';
			}
			$tipp_user_row = get_userdata($row['tipp_user']);
			$tipp_username = $tipp_user_row['username'];
			$tipp_userpoints_race = $row['tipp_points'];

			$template->assign_block_vars('top_tippers_race', array(
				'RANK_RACE'			=> $rank_img,
				'TIPPER_NAME_RACE'		=> $tipp_username,
				'TIPPER_POINTS_RACE'	=> $tipp_userpoints_race,
				'TIPPER_WON_RACE'		=> $tipper_won_race   // Höhe des jeweiligen Gewinns für das aktuelle Rennen
				)
			);
		}
		$db->sql_freeresult($result);
Das funktioniert jedoch nur ansatzweise. Solange es nur einen Gewinner pro Platz gibt, ist die Berechnung korrekt. Gibt es jedoch 2 oder mehrere pro Platz, stimmt die Berechnung nicht mehr.
Korrekt wäre es so:

Der 1. Platz bekommt 50%, der 2. Platz 30% und der 3. Platz 20% des Gewinns. Gibt es zwei 1. Plätze, entfällt der 2. Platz, der Gewinn für den 1. und 2. Platz wird addiert und durch 2 geteilt. D. h. beide 1. Plätze bekommen je 40%. Gibt es drei oder mehr 1. Plätze werden die 100% des Gewinns entsprechend geteilt. Dito das ganze für den 2. Platz. Betrifft dies den 3. Platz teilen sich halt alle dessen 20%.

Wo ist mein Denkfehler?

Bye
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von oxpus »

Du gehst in deiner Berechnung auch nur stur davon aus, dass es nur jeweils einen der ersten Plätze gibt.
Wenn mehrere erste, zweite, ... Plätze möglich sind, musst du das erst feststellen und dann die Prämien anschliessend verteilt berechnen.
In einer Abfrage so aus der Datenbank ist es dabei also nicht getan ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Moin! :cool:

O.k., ich habe das jetzt mal so in Angriff genommen:

Code: Alles auswählen

$sql = "SELECT * FROM " . FORMEL_TIPPS_TABLE . " WHERE tipp_race='race_id'
     ORDER BY tipp_points DESC LIMIT 3";
if ($result = $db->$sql_query($sql))
{
     message_die(GENERAL_ERROR, "Could not query formel_tipps table", "ERROR", __LINE__, __FILE__, $sql);
}
echo $tipp_points['tipp_points'];
Dadurch werden schonmal die 3 höchsten Punkte angezeigt. Nur wie bekomme ich das Ergebnis wie oben gewünscht?

Nachtrag:

Ich habe in meiner Pause während der Arbeit etwas Zeit nachzudenken. Testen kann ich es allerdings noch nicht. Folgende SQL Abfrage sollte doch eigentlich das Gewünschte bringen?

Code: Alles auswählen

$sql = "SELECT COUNT(tipp_points) Anzahl FROM " . FORMEL_TIPPS_TABLE . "
     WHERE tipp_race = race_id
     GROUP BY tipp_points
     ORDER BY tipp_points DESC
     LIMIT 3";
Wie bekomme ich aber diese 3 Werte in je eine PHP Variable?

Bye
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von oxpus »

Überleg dir doch mal logisch, was zu tun ist:
Du musst zunächst feststellen, wer und welche Anzahl User auf Platz 1, 2, 3, n sind.
Dann hast du schon einmal je Rank eine Zahl = Abfrage 1.
Anschließend wäre je Rang zu prüfen, ob mehr als 1 User vorhanden ist, dann ist nämlich der nächste Rang nicht zu bewerten!
Und kommen gar mehr als 3 User zusammen, ist auch der übernächste Rang futsch.
Etc...

Anschliessend hast du für Platz 1, 2, 3, n eine Prämie.
Sofern nun die Plätze überhaupt existieren, ist die Verteilung einfach.
Ist aber ein Rang nicht vorhanden, muss die dafür ermittelte Prämie dem nächst "höheren" Platz zugeschlagen und dann gleichmäßig auf die User verteilt gerechnet werden.

Das ist alles schon nicht einfach und sicherlich nicht mit einer SQL-Abfrage getan ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Hi! :cool:

Zum Anfang wäre ich ja schon zufrieden die jeweilige Anzahl der ersten 3 Plätze zu haben. Damit wäre dann der Rest nicht mehr sooo kompliziert.

Die o.g. SELECT COUNT() Abfrage ist schon mal richtig, denn wenn ich diese Abfrage in PMA starte, gibt es genau das Ergebnis was ich möchte, nämlich z.B.:

1
1
5

Das entspricht 1x Platz 1, 1x Platz 2 und 5x Platz 3.

Dito wenn ich dies ausführe:

Code: Alles auswählen

while($row = mysql_fetch_object($result))
{
	echo $row->anzahl;
	echo "<br>";
}
Wie bringe ich dieses Ergebnis jedoch in die drei gewünschten Variablen?

Bye
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von oxpus »

Noch einmal: Du kannst das nicht mit einer Abfrage lösen!!!!!!!!!!!!!!!!!!!!!!!!
Erst musst du feststellen, welche User in welcher Anzahl einen Rang belegen, um dann im zweiten Schritt festzustellen, ob dadurch ein Rang überhaupt zum Tragen kommt.
Und dann im dritten Schritt wäre die Berechnung der Preisgelder dran, die aus den entfallenen Rängen die Preise den nächst höheren Rängen zuschlägt und dann verteilt.

Anders ist das nicht zu lösen!!!!!
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Hi! :cool:

Ich wiederspreche wirklich sehr, sehr ungerne. :anbet
Aber bis auf genau dieses eine Problem funktioniert der Rest wie die Berechnung des Gewinn bereits. Es kommen hierbei nur die Plätze zum tragen, die es auch wirklich gibt, inkl. deren Anzahl. Um das ganze zu automatisieren fehlen mir einfach nur noch diese drei Variablen.

Bye (hoffentlich sind die Berliner Bürger heute schön ruhig... und ich kann diese Nachtschicht geniessen. :)
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Hi! :cool:

Ich hab's nun hinbekommen. Ein Tipp im NewsNet mit dem Stichwort "Variable Variablen" und ein Beispielscript war die Lösung. Das ganze sieht nun so aus:

Code: Alles auswählen

		$i = 1;
		while($row = mysql_fetch_object($result))
		{
			$var_name = "anz_place_" . $i;
			$$var_name = $row->anzahl;
			$i++;
		}
Eigentlich gar nicht so kompliziert wenn man es weiß. :)
Warum sind Dokus eigentlich immer so unlogisch und weltfremd geschrieben? :(

Bye
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Hi großer Meister! :cool:

Ich muss hier leider nochmal "nerven". Während es bei den Einzelrennen perfekt funktioniert, tut es bei der Saison leider nicht sauber funktionieren. ^6
Folgender Code ist im Einsatz:

Code: Alles auswählen

	$sql = "SELECT SUM(tipp_points) AS total_points, tipp_user FROM " . FORMEL_TIPPS_TABLE . "
		GROUP BY tipp_user
		ORDER BY total_points DESC";
	if (!$result = $db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Could not query formel_tipps', '', __LINE__, __FILE__, $sql);
	}

	$i = 1;
	while($row = mysql_fetch_object($result))
	{
		$var_name = "anz_place_season_" . $i;
		// $var_name enthält den Namen der Variable
		// man beachte das doppelte "$":
		$$var_name = $row->anzahl;
		$i++;
	}
Die Variablen $anz_place_season_1, $anz_place_season_2, $anz_place_season_3 bleiben jedoch leer.

Wie bekomme ich SUM und COUNT in SQL zusammen?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von oxpus »

Naja, $row->anzahl wird zwar verwendet, aber mit diesem SQL-Statement kommt "total_points" und "tipp_user" raus.
Also kein "anzahl" ;)
SUM und COUNT lassen sich aber auch kombinieren. Das sollte SQL können...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: F1 Mod: korrekte Gewinnberechnung?

Beitrag von Dungeonwatcher »

Moin, moin! :cool:
oxpus hat geschrieben:Naja, $row->anzahl wird zwar verwendet, aber mit diesem SQL-Statement kommt "total_points" und "tipp_user" raus.
Also kein "anzahl" ;)
Genau.
SUM und COUNT lassen sich aber auch kombinieren. Das sollte SQL können...
Und daran hänge ich seit vielen Stunden fest. Aus dem Handbuch werde ich nicht im geringsten schlau und im Netz finde ich keinerlei Beispiele.

Nachtrag:

Ich hab's hinbekommen:

Code: Alles auswählen

	$sql = "SELECT COUNT(a.total_points) AS anzahl FROM (SELECT SUM(tipp_points) AS total_points, tipp_user FROM " . FORMEL_TIPPS_TABLE . "
			GROUP BY tipp_user
			ORDER BY total_points DESC) AS a
		GROUP BY a.total_points DESC";
		
	if (!$result = $db->sql_query($sql))
	{
		message_die(GENERAL_ERROR, 'Could not query formel_tipps', '', __LINE__, __FILE__, $sql);
	}

	$i = 1;
	while($row = mysql_fetch_object($result))
	{
		$var_name = "anz_place_season_" . $i;
		$$var_name = $row->anzahl;
		$i++;
	}
Antworten