[php] Programmlogic einfach zu viele ifs

  • Hallo Zusammen,

    ich hab seit kurzem wieder Zeit mich um ein altes Projekt zu kümmern und dazu brauch ich mal Hilfe von erfahrenen PHP Programmierern.


    Also ich versuche wieder weiter an meinem Tischtennis Scoreboard zu arbeiten, ich habe die Variante mit dem RPI und dem D1 verschmissen und möchts jetzt über einen Webserver und einem Tablet machen.


    Startseite mit Auswahl der Spieler zwei Spieler sowie einer Bestoff Liste und einer Seite zum anlegen der Spieler funktionieren schon mal.

    Auf Matchseite ist die Anzeige auch fertig, ich hab jetzt noch ein Problem mit den Updatefunktionen, da hab ich einfach zu viele verschachtelte Ifs und jetzt passt die Logik einfach nicht.


    Hier mal Zweis Screenshots:


    Startseite


    Matchseite



    Ich hab jetzt einfach mal 3 Links eingebaut die per Klick über den Querystring einen Punkt bei PlayerA oder PlayerB hochzähllen und einen der den aktuellen Satz abschliesst und einen neuen beginnt.

    Und genau hier ist das Problem, ich komm einfach nicht auf einen grünen zweig mir meinen zig ifs, die sind auch nicht richtig verschachtelt weil er zb. nicht erkennt wann jemand 2 Sätze gewonnen hat und das Match somit aus ist oder wenn ein Match in den 3 Satz geht muss eigentlich nach dem dritten das Match aus sein.


    Ich weiss nicht ob jemand die Zeit oder überhaut Lust hat um mal über den Code meines Updatescripts drüber zu schauen, da sie eigentlich eh immer alles wiederholt sieht es mehr aus als es ist, es geht auch garnicht um die funktionen der Updates und inserts, es geht eigentlich mehr um die Logik der abfragen.


    Ich würde mich sehr freuen wenn mir jemand ein paar Tips geben könnte. (Aber Achtung ich habe nur begrenzt Ahnung von PHP also würde ich gerne bei einer einfachen Programmierweise bleiben, ist zwar meist mehr Code aber icch kanns zumindest halbwegs verstehen :)


    Und ja ich weis, man könnnte jeden Block um min die Hälfte verkürzen aber ich kanns so halt besser lesen.


    Hier der Codes:


    Der Plan wäre dann noch zwei grosse schöne Buttons anstelle der Textlinks einzubauen und dann direkt über das Tablet die Punkte hochzählen.


    Also es wäre super wenn mir jemand bei der Anordnung der ifs im nextSet bereich helfen könnte.

    Es soll nach jedem Satzende das nicht vom System erkannt werden muss per Klick auf den Button "Satzende" in der db beim Player der die höhere Punktezahl hat aktuelle Satzstand um eins erhöht werden.

    Weiters soll erkannt werden wenn ein Spieler zwei Sätze gewonnen hat und das Spiel beendet werden, egal ob zwei Sätze hintereinader gewonnen wurden oder der Zweite durch den dritten Satz gewonnen wurde.


    Ich hoffe das klingt nicht alles wie wirres Zeug, aber wenn man so drin steckt dann vergisst man oft mal wichtige Details zu nennen.


    Danke euch!

    • Best Answer

    Ich glaube, deine gesamte Programmlogik ist etwas... äh, unkonventionell...

    Dein Programm folgt dem Denken eines Beobachters, der den 1., 2. und 3. Satz sieht. Der Computer tickt aber ganz anders.

    Es müsste pseudocodemäßig ungefähr sowas sein:

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Yeahhh...


    Ich danke dir 3-fach Gnom, genau sowas habe ich mir gewünscht!!!


    Deine Analyse trifft zu 100% zu, ich bin kein Programmierer und habe versucht als Spieler den Prozess so aufzubauen wie ich ihn erlebt habe :)


    Danke auch für die nett umschriebene Bezeichnung meines Codes (=unkonventionell) :) du meinstet damit vermutlich Schei$$e.


    Also ich hab den Ablauf deines Vorschlags grundsätzlich verstanden und ich glaub das bringt mir auch in Zukunft bei anderen Sachen extrem viel weil es mir die Augen geöffnet hat was ich an einer Programmlogic grundsätzlich falsch verstanden habe :)


    Ich werde das auf jedenfall versuchen so umzusetzen, leider gibts da jetzt noch ein Problem.

    Ich könnte das jetzt ziemlcih einfach umstricken auf deine tolle Variante aber leider ist ein Match nicht immer bei 21 zu ende, unsere Matches soind oft so knapp und gehen dann bis zb. 25/27.


    Ich bräuchte da noch einen Tip: 21 ist unser Satzende aber nur bei 2 Punkten unterschied, das heisst wenn es 20/20 steht und eine macht einen Punkt ist das Match nicht aus, erst bei 22/20 wäre es aus und das könnte dann noch eine Zeit lang so weitergehen.


    Darum kan ich eine Prüfung auf 21 nicht machen, ich müsste zusätzlich noch den Unterschied von 2 Punkten zum anderen Player prüfen.


    Auch wenn du dafür jetzt keinen Tip hast danke ich dir vielmals für den Aufwand mein wirres Zeug gelesen und verstanden zu haben und dann noch diesen Hilfreichen Pseudocode bereitzustellen!!!!


    Vielen vielen Dank, jetzt weis ich endlich in welche Richtung ich hinarbeiten muss :) (freu mich total)

  • Auch das ist kein Problem - ich habs oben in den Code eingebaut.

    Es wird so lange der Satz weiter gespielt wie

    - keiner 21 Punkte hat (punkteA < 21 und punkteB < 21)

    ODER

    - der Abstand weniger als zwei ist ( ABS(punkteA - punkteB < 2) -- ABS ist der Absolutwert, die Funktion beseitigt das Vorzeichen. Wenn also 24:23, dann ist die Differenz 1, ohne Vorzeichen auch 1, wenn 23:24 dann ist die Differenz -1, ohne Vorzeichen 1; es wird dann weiter gespielt.)

    In Zeile 10 musst du nun prüfen, wer mehr Punkte hat - die Prüfung auf 21 (wie sie vorher da stand) würde jetzt nicht mehr genügen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Wenn dus mir so erklärst eigentlich eine logische Sache :) (ich bin definitiv nicht gemacht zum Programmieren!)


    Ich bau das jetzt gleich um und Teste, ich berichte dann ob ichs hinbekommen habe.


    Vielen Dank für die tolle Hilfe.

  • So ich habs jetzt mal versucht mit in einer SESSION abzuspoechern, aber leider hab ich das System doch noch unterschätzt :)


    Also wenn ich den von mir angepassten Code jetzt aufrufe dann bekomme ich erstmal eine Endlosschleife die dann durch Timeout abbricht.


    Wenn ich sie aber mit nem querystring aufrufe wie der Button das machen würde dann durchläuft die Schleife beim ersten Buttonclick die Schleife 21 mal > Satz ist aus.

    Wenn ich dann nochmal den link mit querystring für Punkt-Update aufrufe dann nochmal 21 mal und der Player hat zwei Sätze gewonnen.


    :conf:


    edit: jetzt hab ich vergessn den code anzuhängen, wenn ich wieder zuhause bin poste ich den noch nach.

    Edited once, last by Grand ().

  • Hier der Code:


    Hab die db Verbindung erstmal rausgelassen damit man das als 1 File testen kann.


  • Ich hab wahrscheinlich auch einen Denkfehler in der Ausführungslogik.
    Mach mal aus dem "While" in Zeile 31 und 35 jeweils ein "If".

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Nein das hat zwar die Endlosschleife behoben aber dadurch geht er ja bei jedem aufruf durch das ganze Programm und zählt sofort einen Satz hoch und Stellt den Punktestand wieder auf 0.

  • Hallo!

    Mein erster Ansatz war ein prozedurales Programm... ich hab nicht beachtet, dass dein Web-Programmcode ja iterativ aufgerufen wird...

    Probier es mal so:

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited 2 times, last by Gnom ().

  • So ich bin ein Stück weiter und es schaut gut aus! :bravo2:


    Ich hab noch die Satzprüfung eingebaut und paar kleinere Sache, aber ein Problem hab ich noch.


    Spieler A hat 21 punkte, ich muss aber 22 mal klicken damit er den nächsten Satz beginnt und dann zählt es gleich einen Punkt rauf.


    hier wieder der Aktuelle Code:

  • Gleich das mal mit dem ab, was ich dir zulettz geschickt habe. Das müsste nämlich ohne Fehler gehen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Das ist dein Code, ich hab das genau so umgesetzt.


    Es funktioniert schon nurwenn ein Spieler 21 hat und den Satz gewonnen hat wird der Satz erst beim 22 clickt hochgezählt, das ist aber auch zeitgleich der erste Punkt im neuen Satz.

  • Sieht schon mal nicht schlecht aus.

    Du musst wohl noch ein bisschen an der Reihenfolge arbeiten in der du Buttons auswertest, den Punktestand korrigieren und dann die passende Ausgabe machst.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!