Suchen
Inside Forum
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > PHP > PHP

PHP Alles rund um PHP

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 09.01.2017, 23:12
profexxi profexxi ist offline
Neuer Besucher
 
Registriert seit: 07.11.2008
Beiträge: 2
Standard Darts-Skript

Hi,

so kurz nach der Darts-WM würde ich gerne ein neues PHP-Projekt beginnen. Ich bin kein Anfänger und hab auch schon einiges in PHP geschrieben, jedoch liegt mein letztes Projekt schon viele Jahre zurück, so dass ich etwas "eingerostet" bin. Ich hoffe, hier kann mir der ein oder andere mit einzelnen Ansätzen oder Ideen helfen, mein Projekt umzusetzen.

Grundlegend soll es um die Statistik einer einzelnen Darts-Mannschaft gehen. Wir spielen häufig untereinander und protokollieren die Spiele auch mittels Stift und Papier. Sehr gerne würde ich das aber zukünftig eleganter gestalten und die Spielergebnisse in einer MySQL-Datenbank ablegen und mittels eines PHP-Skripts auslesen bzw. auswerten.

Gespielt wird eigentlich fast ausschließlich 501. Das heißt, jeder Spieler beginnt mit einem Punktestand von 501 und muss diesen auf 0 runterspielen. Hierbei wird abwechselnd mit jeweils 3 Dartpfeilen auf die Scheibe geworfen und die erzielten Punkte entsprechend ihrer Wertigkeit von der Restsumme abgezogen. Soweit, so gut.

Mein Problem ist nun, dass ich bereits an der grundlegensten Frage hänge, wie ich das am besten realisiere. Meine Überlegung geht nun dahin, eine Tabelle mit folgenden Feldern anzulegen und entsprechend mit Inhalt zu befüllen:

id - spiel - spieler - wurf - score
---------------------------------------
1 - 1 - Hans - 1 - 86
2 - 1 - Peter - 1 - 43
3 - 1 - Markus - 1 - 112
4 - 1 - Hans - 2 - 49
5 - 1 - Peter - 2 - 94
6 - 1 - Markus - 2 - 66
7 - 1 - Hans - 3 - 74
...
...
...
59 - 2 - Hans - 1 - 59
60 - 2 - Peter - 1 - 82
..
..
..
usw.


Jetzt sollte ich das ganze via PHP auslesen und entsprechend in einer Tabelle wiedergeben. Hierbei sollten zuerst die Anzahl der Spieler pro Spiel erkannt werden und dann jeweils deren Würfe untereinander in einer Tabelle ausgegeben und berechnet werden. Sprich, die jeweiligen Würfe von der Restsumme (bzw. beim ersten Wurf von 501) abgezogen werden. Beispiel zum oben genannten Datenbankinhalt:

Code:
+-------+---------+----------+
| Hans  | Peter   | Markus   |
+-------+---------+----------+
| 501   | 501     | 501      |
| 415   | 458     | 389      |
| 366   | 364     | 323      |
| 292   |
...
...
...
| 0     | 117     |  26      |
+-------+---------+----------+


Zunächst dachte ich mir, dass ich das problemlos hinbekomme. Nachdem ich anfangen wollte, kamen mir aber die ersten grundlegenden Gedanken, wie das ganze funktionieren soll ?

Zunächst einmal müsste ich per Datenbankabfrage herausfinden, wieviele Spieler überhaupt mitspielen. Sprich, wieviel verschiedene Namen sind pro Spiel-ID hinterlegt. Das dürfte mit folgender Abfrage kein Problem sein:

SQL Quellcode:
SELECT COUNT(DISTINCT spieler) AS anzahl FROM darts WHERE spiel='1'


Mithilfe dieser Anzahl könnte ich dann die HTML-Tabelle mit Spalten bestücken. Wie gehe ich aber nun weiter vor ? Soll ich z.B. für jede Spalte (Spieler) eine separate while-Schleife durchlaufen lassen, vor der Schleife einer Variable den Wert 501 ($score = 501;) geben und dann in der Schleife die ausgelesenen Datensätze (Würfe) von der Variable nacheinander abziehen, ausgeben und $score mit dem letzten berechneten Wert neu setzen ? Beispielsweise so:

PHP Quellcode:
$score = 501;
echo $score;
while ($row = mysql_fetch_array($result)) {
    $diff = $score - $row['score'];
    echo "<br>".$diff;
    $score = $diff;
}



Ich frage mich dabei nur, ob es ein Problem geben wird, da die Spieler eine unterschiedliche Anzahl an Würfen haben. Zum einen hat der Sieger eines Spiels, wenn man es nach dessen Finish beendet, auf jeden Fall einen Wurf mehr als alle anderen und die anderen haben den Endwert nicht auf 0. Zum anderen lassen wir häufig die weiteren Spieler weiterspielen, bis der wirklich letzte, der dann nicht mehr zu Ende spielt, ermittelt ist. In diesem Fall hätten die Spieler auch eine unterschiedliche Anzahl an Würfen.

Ihr seht, ich bin noch ziemlich verwirrt, was die Realisierung betrifft. Möglicherweise habe ich auch den ein oder anderen völlig falschen Gedankengang. Dies dürfte dann der Tatsache geschuldet sein, dass ich einfach viele Jahre gar nichts mehr mit PHP gemacht habe und mich erst wieder einfinden muss. Über eure Hilfestellungen würde ich mich auf jeden Fall sehr freuen.

Auf jeden Fall schon einmal besten Dank im Voraus :-)

Edit: Eine kleine Ergänzung noch. Weshalb das ganze so ausführlich gestaltet werden soll, hat zwei Gründe: Zum einen sollen die Spiele alle als genauer Spielablauf abrufbar sein, zum anderen sind wir alle ein bisschen Statistikfreaks. Das heißt, es sollen zusätzlich noch Statistiken für einzelne Spiele oder Spieler berechenbar sein, z.B.
- Wieviel Punkte hat ein Spieler im Schnitt mit 3 Darts geworfen (Tabellenfeld "wurf") - sowohl im jeweiligen Spiel als auch insgesamt seit Beginn der Aufzeichnung ?
- Wieviele Würfe hat ein Spieler im Schnitt benötigt, um ein Spiel zu beenden ?
- Wie oft hat ein Spieler gewonnen ?

Evt. wird das ganze später noch durch mehrere Legs, etc. erweitert. Aktuell genügt uns aber die Einzelspielstatistik.

Dass das ganze ein entsprechender Aufwand beim einpflegen der Daten ist, ist mir bewusst. Das macht aber auch nichts :-)

Geändert von profexxi (09.01.2017 um 23:23 Uhr) Grund: Ergänzung
Mit Zitat antworten
  #2  
Alt 10.01.2017, 11:09
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.243
Standard AW: Darts-Skript

Du bist zwar schon lange angemeldet, aber ich sage trotzdem mal: Willkommen im Forum.

Da du für den Aufbau der Darstellung zu einem Spiel wohl so oder so immer alle Daten des Spiels benötigst, würde ich das im SQL gar nicht so kleinschrittig angehen, sondern einfach alle Datensätze holen, also SELECT col1, col2, … FROM table WHERE spiel_id = $xy, und die Daten dann mit PHP weiter analysieren und verarbeiten.

(Möglicherweise wäre es noch ganz sinnvoll, die Spieler als eigene Tabelle anzulegen und in der Wurftabelle nicht den Namen einzutragen, sondern nur die ID des Spielers, und die Namen dranzujoinen oder mit einer zusätzlichen Query zu holen. Das könntest du bei Bedarf aber auch später noch umbauen. Andererseits wird die Eingabe der Daten aber so oder so so umständlich, dass du dir schnell Hilfe dazu programmieren wirst/solltest. (Ich würde mir was schreiben, das ein einfaches Textformat einlesen kann, das in etwa so aufgebaut ist wie deine geplante Ausgabe.) Wenn du das machst, kannst du auch die Spieler als eigene Tabelle anlegen, weil die Eintragungen so oder so automatisiert vorgenommen werden.)

Die Daten würde ich mir dann so umstellen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86,
        'Peter'  => 43,
        'Markus' => 112
    ),
    2 => array(
        'Hans'   => 49,
        'Peter'  => 94,
        'Markus' => 66
    ),
    ...
);


Der Index auf erster Ebene ist wurf.

Dann kannst du es im Grunde einfach mit zwei geschachtelten Schleifen durchlaufen, um die Tabelle zu erzeugen.

An zusätzlichen Daten müsstest du noch ein Hilfs-Array der Form…

PHP Quellcode:
$pointsLeft = array(
    'Hans'  => 501,
    'Peter' => 501,
    ...
);


…anlegen, aus dem du pro Wurf die jeweilige Punktzahl abziehst, um die gewünschte Darstellung erreichen zu können.

Die beiden gezeigten Arrays würden natürlich dynamisch generiert – je nach den Daten eines Spiels.
Mit Zitat antworten
  #3  
Alt 12.01.2017, 01:22
profexxi profexxi ist offline
Neuer Besucher
 
Registriert seit: 07.11.2008
Beiträge: 2
Standard AW: Darts-Skript

Zitat:
Zitat von Marc Ermshaus Beitrag anzeigen
Du bist zwar schon lange angemeldet, aber ich sage trotzdem mal: Willkommen im Forum.
Vielen Dank :-) Ich hatte mich damals registriert und dann fehlte mir irgendwie die Zeit zum programmieren. Aber was lange wärt, wird auch mal gut... ;-)

Zitat:
Da du für den Aufbau der Darstellung zu einem Spiel wohl so oder so immer alle Daten des Spiels benötigst, würde ich das im SQL gar nicht so kleinschrittig angehen, sondern einfach alle Datensätze holen, also SELECT col1, col2, … FROM table WHERE spiel_id = $xy, und die Daten dann mit PHP weiter analysieren und verarbeiten.
Wenn ich aber direkt am Anfang alle Daten hole, wie finde ich später noch heraus, wieviele Spieler am Spiel teilnehmen ? Ich dachte über eine Abfrage mit DISTINCT könnte ich das vorab in Erfahrung bringen. Könntest Du mir das näher darlegen, wie Du das strukturieren würdest ? Ich stehe da wohl ein wenig auf dem Schlauch...



Zitat:
Die Daten würde ich mir dann so umstellen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86,
        'Peter'  => 43,
        'Markus' => 112
    ),
    2 => array(
        'Hans'   => 49,
        'Peter'  => 94,
        'Markus' => 66
    ),
    ...
);


Der Index auf erster Ebene ist wurf.
Da knüpft sich mein vorheriges Verständnisproblem an. Wie erstelle ich ein dynamisches Array, ohne zu wissen, wieviele Würfe es insgesamt gab ? Wieviele Spieler mitspielen ? Das mit dem Umstellen verwirrt mich auch etwas.

Wenn ich z.B. einfach alle Daten aus der Datenbank für ein bestimmtes Spiel abrufe:

SQL Quellcode:
SELECT * FROM darts WHERE spiel='1'


dann bekomme ich ja immer zusammenhängende Datensätze (spieler, wurf, score - Beispiel: Hans, 1, 86
Es erschließt sich mir nicht, wie ich jetzt daraus ein dynamisches Array mit dem Wurf als Index erstelle. Ich kann ja keine Spieler zusammen gruppieren, da jeder Datensatz einzeln abgerufen wird. Konkret müsste das array dann ja so aussehen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86
    ),
    1 => array(
        'Peter'  => 43
...
    ),
    ...
);


Hab ich irgendwo einen Denkfehler oder fehlen mir nur noch ein paar Zwischenschritte, um dort hinzugelangen, wie Du es meinst ?

Danke auf jeden Fall für deine Hilfestellung. Du bist mir eine große Hilfe :-)
Mit Zitat antworten
  #4  
Alt 12.01.2017, 09:29
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.243
Standard AW: Darts-Skript

Grundsätzlich kannst du die benötigten Informationen alle aus den von der DB gelieferten Daten ableiten.

Die Anzahl der Teilnehmer des Spiels ist beispielsweise die Anzahl der Einträge mit wurf=1. (Falls es keine exotischen Fälle gibt, dass Teilnehmer später einsteigen oder dergleichen.) Die Info ergibt sich durch die Gruppierung aber später im Grunde von allein.

Die Namen sind die spieler-Felder der besagten Einträge. (Dito Gruppierung.)

Die Anzahl der Würfe ist der höchste Wert des wurf-Felds eines der Einträge. Das ergibt sich bei einer Gruppierung, wie ich sie vorgeschlagen habe, aber auch von allein. Du gehst die Datensätze durch und das wurf-Feld eines Datensatzes ist eben immer der Index im gruppierten Array.

Es ist ein wenig knifflig zu erklären und in den Details auch ein wenig knifflig zu programmieren, aber das kommt durch die Aufgabe an sich.

Grob kann die Gruppierung in etwa so funktionieren, wobei $data die Datensätze aus der DB sind.

(Aus dem Kopf geschriebener Umriss/Anfang.)

PHP Quellcode:
$grouped = array();

foreach ($data as $item) {
    if (!array_key_exists($item['wurf'], $grouped)) {
        $grouped[$item['wurf']] = array();
    }

    $grouped[$item['wurf']][$item['spieler']] = $item['score'];
}

Geändert von Marc Ermshaus (12.01.2017 um 09:31 Uhr)
Mit Zitat antworten
  #5  
Alt 17.01.2017, 23:52
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.243
Standard AW: Darts-Skript

Etwas Gebastel/Prototyping:

PHP Quellcode:
<?php

$data = array();

$data[] = array(
    'id'      => 3,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 1,
    'score'   => 112
);

$data[] = array(
    'id'      => 4,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 2,
    'score'   => 49
);

$data[] = array(
    'id'      => 5,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 2,
    'score'   => 94
);

$data[] = array(
    'id'      => 1,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 1,
    'score'   => 86
);

$data[] = array(
    'id'      => 7,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 3,
    'score'   => 180
);

$data[] = array(
    'id'      => 8,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 3,
    'score'   => 80
);

$data[] = array(
    'id'      => 9,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 3,
    'score'   => 72
);

$data[] = array(
    'id'      => 2,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 1,
    'score'   => 43
);

$data[] = array(
    'id'      => 6,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 2,
    'score'   => 66
);

$data[] = array(
    'id'      => 10,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 4,
    'score'   => 143
);

$data[] = array(
    'id'      => 11,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 4,
    'score'   => 20
);

$data[] = array(
    'id'      => 12,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 4,
    'score'   => 95
);

$data[] = array(
    'id'      => 13,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 5,
    'score'   => 75
);

$data[] = array(
    'id'      => 14,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 5,
    'score'   => 80
);

/**
 * Sortiert die DB-Daten, um den Code für die Generierung des Scoreboards zu
 * vereinfachen
 *
 * Kann auch via SQL erledigt werden. Für Details zur Sortierung siehe auch
 * Kommentar zu `generateScoreboard`.
 *
 * @param array $data
 * @return array
 */

function sortData(array $data)
{
    usort($data, function ($a, $b) {
        if ($a['wurf'] !== $b['wurf']) {
            return ($a['wurf'] < $b['wurf']) ? -1 : 1;
        }

        return strcmp($a['spieler'], $b['spieler']);
    });

    return $data;
}

/**
 * Erzeugt eine Scoreboard-Datenstruktur, die auf einfache Weise dargestellt
 * werden kann
 *
 * Die Eingabedaten müssen
 *
 * 1. aufsteigend nach Wurf
 * 2. aufsteigend nach Spielername
 *
 * sortiert sein.
 *
 * @param array $sortedData
 * @return array
 */

function generateScoreboard(array $sortedData)
{
    $scoreboard = array();

    if (count($sortedData) === 0) {
        return $scoreboard;
    }

    $scoreboard[0] = array();

    $players = array();

    // Einen "Wurf 0" hinzufügen mit den Startpunktzahlen

    foreach ($sortedData as $d) {
        $scoreboard[0][$d['spieler']] = array(
            'remainingScore' => 501,
            'score'          => 0
        );
        $players[] = $d['spieler'];

        if ($d['wurf'] > 1) {
            break;
        }
    }

    foreach ($sortedData as $d) {
        // Stellt sicher, dass für jeden Wurf für jeden Spieler ein brauchbarer
        // Eintrag existiert
        if (!array_key_exists($d['wurf'], $scoreboard)) {
            $tmp = array();

            foreach ($players as $player) {
                $tmp[$player] = array(
                    'remainingScore' => $scoreboard[$d['wurf'] - 1][$player]['remainingScore'],
                    'score'          => 0
                );
            }

            $scoreboard[$d['wurf']] = $tmp;
        }

        $scoreboard[$d['wurf']][$d['spieler']] = array(
            'remainingScore' => $scoreboard[$d['wurf'] - 1][$d['spieler']]['remainingScore'] - $d['score'],
            'score'          => $d['score']
        );
    }

    return $scoreboard;
}

/**
 * @param array $scoreboard
 * @return string
 */

function renderScoreboardAsHtml(array $scoreboard)
{
    if (count($scoreboard) === 0) {
        return '';
    }

    $e = function ($s) {
        return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
    };

    $html = '<table>';

    $html .= '<thead><tr>';

    $html .= '<th>Wurf</th>';

    foreach (array_keys($scoreboard[0]) as $player) {
        $html .= '<th>' . $e($player) . '</th>';
    }

    $html .= '</tr></thead>';

    $html .= '<tbody>';

    foreach ($scoreboard as $round => $scores) {
        $html .= '<tr>';
        $html .= '<td>' . $e($round) . '</td>';
        foreach ($scores as $score) {
            $html .= '<td>' . $e($score['remainingScore']) . '</td>';
        }
        $html .= '</tr>';
    }

    $html .= '</tbody>';
    $html .= '</table>';

    return $html;
}



$data       = sortData($data);
$scoreboard = generateScoreboard($data);
$html       = renderScoreboardAsHtml($scoreboard);

echo $html;


PS: Ist nicht ganz die Datenstruktur, die ich hier im Thread schon beschrieben habe. Ich fand es letztlich doch sinnvoller, die „verbleibenden Punkte“ pro Spieler mit den Restdaten zu verbinden (var_dump($scoreboard);, um die Details zu sehen).

Geändert von Marc Ermshaus (18.01.2017 um 00:03 Uhr)
Mit Zitat antworten


Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dateiupload Datei an Skript ohne Skript im Broser an zuzeigen fruitgnome PHP 8 16.03.2011 20:01
Über PHP-Skript ein weiteres PHP-Skript auf ausführen clown011182 PHP 2 07.02.2007 22:01
Captchas-Skript in Gästebuch-Skript einbauen tibero PHP 6 03.02.2006 07:57
Zweites Skript setzt erstes Skript ausser Gefecht silber JavaScript 2 24.07.2005 17:53


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC