Chat
Ask me anything
Ithy Logo
Sign in to save

Tennis Score Tracker in C#

Een console applicatie voor score tracking in tenniswedstrijden

tennis court with rackets

Key Takeaways

  • Interactie met de scheidsrechter: Na elk punt wordt er gevraagd wie het punt heeft gescoord en daarna wordt de score in de console afgedrukt.
  • Volledige scoring logica: De applicatie houdt rekening met de tennis puntentelling (0, 15, 30, 40, deuce, voordeel) en implementeert spellen, sets en een tie-break wanneer nodig.
  • Wedstrijdstructuur: De match wordt gespeeld tot twee winnende sets en bij gelijke stand in games (6-6) wordt een tie-break gestart.

Inleiding

Deze C# console applicatie is ontworpen voor scheidsrechters die de score van een tenniswedstrijd willen bijhouden. Tennis kent een uniek puntensysteem wat, in tegenstelling tot andere sporten, bestaat uit de notaties “love”, “15”, “30” en “40”. Daarnaast is er een bijzondere regel voor de stand “deuce” en “voordeel”. De applicatie vraagt na elk punt de invoer van de scheidsrechter om bij te houden welk spel en welke set de spelers winnen. Een volledige wedstrijd bestaat uit meerdere games die op hun beurt worden gegroepeerd in sets en bij een gelijke stand (6-6 in games) komt er een tie-break.

Het hoofddoel van deze implementatie is het bieden van een overzichtelijke en eenduidige manier om de puntentelling te beheren, zodat de uitslag van de wedstrijd duidelijk en transparant is voor alle betrokkenen.

Code Overzicht en Structuur

Hieronder wordt de structuur en logica van de applicatie uitgebreid beschreven. De toepassing is opgedeeld in meerdere methoden die elk een specifiek deel van de tennisregels implementeren:

1. Main en Match Loop

In de Main-methode wordt de hoofdwedstrijdlussen geïnitieerd. Er wordt een nieuwe wedstrijd gestart en de applicatie blijft in een loop tot een speler twee sets gewonnen heeft. Binnen deze loop worden sets gestart en bijgehouden.

2. Set en Game Logica

Elke set bestaat uit meerdere games. Een speler wint een set als hij minstens 6 games heeft gewonnen waarbij er een verschil van 2 games is tussen de spelers. Als de game score 6-6 bereikt, wordt er een tie-break gestart. Tijdens een reguliere game kent de puntentelling de volgorde 0, 15, 30, 40, en daarna “game”, mits er een verschil van ten minste 2 punten is. Als beide spelers 40-40 bereiken (deuce), moet een speler twee punten achter elkaar scoren om de game te winnen.

3. Tie-Break Implementatie

Wanneer beide spelers een game score van 6-6 hebben in een set, schakelt de applicatie over naar een tie-break modus. Een tie-break wordt gespeeld tot een speler 7 punten behaalt met een verschil van twee punten. De puntentelling in de tie-break wordt eenvoudig bijgehouden door de punten van beide spelers afzonderlijk op te tellen. Bij het einde van de tie-break krijgt de winnende speler de extra game en wordt de set beslissend gemaakt.

4. Puntentelling Afdrukken

Na elk punt dat gespeeld is, drukt de applicatie de actuele score af. Naast de puntentelling binnen een game, worden de games en sets bijgehouden om de algemene wedstrijdscore te tonen. Deze vorm van feedback maakt het voor de scheidsrechter makkelijk de voortgang te monitoren.

5. Gebruik en Validatie

De code bevat invoerverificatie. Wanneer een invoer niet overeenkomt met de verwachte waarden (bijvoorbeeld niet "1" of "2" ingevoerd), wordt de gebruiker gevraagd om een correcte invoer te geven. Dit zorgt ervoor dat de applicatie robuust blijft en geen ongeldige data verwerkt.


De C# Code Implementatie

Hieronder vindt u de complete code voor deze tennis score tracker. De code legt uit hoe de puntentelling, games, sets en tie-break worden geïnitialiseerd en beheerd. Let op dat in deze code de traditionele tennis score notaties worden gehanteerd en dat de logica goed gestructureerd is.


// Deze applicatie houdt de score bij van een tenniswedstrijd volgens de traditionele tennis regels.
// De wedstrijd wordt gespeeld naar 2 sets, en er kan een tie-break gespeeld worden als beide spelers 6 games hebben.
using System;

namespace TennisScoreTracker
{
    class Program
    {
        static void Main(string[] args)
        {
            // Spelersnamen instellen
            string speler1 = "Speler 1";
            string speler2 = "Speler 2";

            // Telling voor gewonnen sets
            int setsSpeler1 = 0;
            int setsSpeler2 = 0;
            
            // Hoofdwedstrijd loop - gespeeld tot een speler 2 sets wint
            while (setsSpeler1 < 2 && setsSpeler2 < 2)
            {
                // Elke set begint met 0 games voor beide spelers
                int gamesSpeler1 = 0;
                int gamesSpeler2 = 0;
                bool isTieBreak = false;  // Indicator voor tie-break modus

                Console.WriteLine("Start een nieuwe set!");

                // Set loop: Zolang geen speler de set heeft gewonnen
                while (true)
                {
                    // Bij een game score van 6-6 schakelen we over op tie-break modus
                    if (gamesSpeler1 == 6 && gamesSpeler2 == 6)
                    {
                        isTieBreak = true;
                        Console.WriteLine("Tie-break gestart!");
                        // Voer de tie-break uit
                        int tieBreakWinner = SpeelTieBreak(speler1, speler2);
                        if (tieBreakWinner == 1)
                        {
                            gamesSpeler1++;
                        }
                        else
                        {
                            gamesSpeler2++;
                        }
                        // Break out uit de set loop, omdat de tie-break de set beslist
                        break;
                    }
                    else
                    {
                        // Speel een reguliere game
                        int gameWinner = SpeelGame(speler1, speler2);
                        if (gameWinner == 1)
                        {
                            gamesSpeler1++;
                        }
                        else
                        {
                            gamesSpeler2++;
                        }
                    }
                    
                    // Toon de game score binnen de set
                    Console.WriteLine("Set score: {0} {1} - {2} {3}", speler1, gamesSpeler1, gamesSpeler2, speler2);
                    
                    // Controleer of een speler de set heeft gewonnen 
                    if ((gamesSpeler1 >= 6 || gamesSpeler2 >= 6) && Math.Abs(gamesSpeler1 - gamesSpeler2) >= 2)
                    {
                        break;
                    }
                }

                // Bepaal welke speler de set wint en verhoog de set score
                if (gamesSpeler1 > gamesSpeler2)
                {
                    setsSpeler1++;
                    Console.WriteLine("{0} wint de set! Totale sets: {1} - {2}", speler1, setsSpeler1, setsSpeler2);
                }
                else
                {
                    setsSpeler2++;
                    Console.WriteLine("{0} wint de set! Totale sets: {1} - {2}", speler2, setsSpeler2, setsSpeler1);
                }
            }

            // Beslissen wie de wedstrijd wint
            if (setsSpeler1 == 2)
            {
                Console.WriteLine("{0} wint de wedstrijd!", speler1);
            }
            else
            {
                Console.WriteLine("{0} wint de wedstrijd!", speler2);
            }

            // Wacht op een toets zodat de console open blijft
            Console.WriteLine("Druk op een toets om af te sluiten...");
            Console.ReadKey();
        }

        // Methode om een reguliere game te spelen
        static int SpeelGame(string speler1, string speler2)
        {
            int puntenSpeler1 = 0;
            int puntenSpeler2 = 0;

            while (true)
            {
                // Druk de huidige puntentelling af
                Console.WriteLine("Huidige game score: {0} {1} - {2} {3}", speler1, ConverteerPunten(puntenSpeler1), ConverteerPunten(puntenSpeler2), speler2);
                Console.WriteLine("Wie wint het punt? (voer 1 in voor {0}, 2 voor {1})", speler1, speler2);
                string input = Console.ReadLine();
                
                if (input == "1")
                {
                    puntenSpeler1++;
                }
                else if (input == "2")
                {
                    puntenSpeler2++;
                }
                else
                {
                    Console.WriteLine("Ongeldige invoer, probeer het opnieuw.");
                    continue;
                }

                // Check of een speler al genoeg punten heeft voor een game, rekening houdend met het vereiste verschil van 2
                if (puntenSpeler1 >= 4 || puntenSpeler2 >= 4)
                {
                    if (puntenSpeler1 - puntenSpeler2 >= 2)
                    {
                        Console.WriteLine("{0} wint de game!", speler1);
                        return 1;
                    }
                    else if (puntenSpeler2 - puntenSpeler1 >= 2)
                    {
                        Console.WriteLine("{0} wint de game!", speler2);
                        return 2;
                    }
                }
                
                // Bij gelijke punten en minstens 3 punten per speler wordt "Deuce" aangegeven
                if (puntenSpeler1 >= 3 && puntenSpeler2 >= 3 && puntenSpeler1 == puntenSpeler2)
                {
                    Console.WriteLine("Deuce!");
                }
            }
        }

        // Methode om een tie-break te spelen (eerste speler die 7 punten behaalt met 2 punten verschil wint)
        static int SpeelTieBreak(string speler1, string speler2)
        {
            int tieBreakPuntenSpeler1 = 0;
            int tieBreakPuntenSpeler2 = 0;
            
            while (true)
            {
                Console.WriteLine("Tie-break score: {0} {1} - {2} {3}", speler1, tieBreakPuntenSpeler1, tieBreakPuntenSpeler2, speler2);
                Console.WriteLine("Wie wint het tie-break punt? (voer 1 in voor {0}, 2 voor {1})", speler1, speler2);
                string input = Console.ReadLine();
                
                if (input == "1")
                {
                    tieBreakPuntenSpeler1++;
                }
                else if (input == "2")
                {
                    tieBreakPuntenSpeler2++;
                }
                else
                {
                    Console.WriteLine("Ongeldige invoer, probeer het opnieuw.");
                    continue;
                }
                
                // Controleer of een speler het tie-break punt heeft gewonnen met minimaal 2 punten verschil
                if ((tieBreakPuntenSpeler1 >= 7 || tieBreakPuntenSpeler2 >= 7) &&
                    Math.Abs(tieBreakPuntenSpeler1 - tieBreakPuntenSpeler2) >= 2)
                {
                    if (tieBreakPuntenSpeler1 > tieBreakPuntenSpeler2)
                    {
                        Console.WriteLine("{0} wint de tie-break!", speler1);
                        return 1;
                    }
                    else
                    {
                        Console.WriteLine("{0} wint de tie-break!", speler2);
                        return 2;
                    }
                }
            }
        }

        // Converteert het aantal punten naar de gebruikelijke tennis notatie
        static string ConverteerPunten(int punten)
        {
            switch (punten)
            {
                case 0:
                    return "0";
                case 1:
                    return "15";
                case 2:
                    return "30";
                case 3:
                    return "40";
                default:
                    return "Adv";
            }
        }
    }
}
  

Tennis Scoring Notaties

Hieronder vindt u een tabel die de traditionele tennis score notaties weergeeft voor de punten binnen een game:

Numerieke Score Tennis Score Notatie
0 Love / 0
1 15
2 30
3 40
>3 Adv (voordeel bij deuce)

Analyse van de Implementatie

De code is zodanig ontworpen dat de essentie van een tenniswedstrijd volledig wordt nagebootst. Enkele belangrijke aspecten van de implementatie die ervoor zorgen dat de applicatie robuust en gebruiksvriendelijk is:

Interactieve Puntinvoer

Na elk punt wordt de gebruiker gevraagd te specificeren welke speler het punt heeft gewonnen. Dit zorgt ervoor dat de applicatie realtime de evolutie van de wedstrijd kan volgen. Ongeldige invoer wordt opgevangen en de gebruiker wordt vervolgens gevraagd om opnieuw de juiste invoer te geven, wat de robuustheid van de applicatie vergroot.

Regels voor Game en Deuce

De methoden voor het spelen van een game controleren continu of een speler 4 punten heeft behaald met een voorsprong van 2 punten of meer. Dit garandeert dat de game pas beslist wordt als de speler duidelijk een voorsprong heeft. In situaties waarin beide spelers minstens 3 punten hebben, wordt "Deuce" afgedrukt en moet uiteindelijk een speler twee opeenvolgende punten scoren om het spel af te sluiten.

Tie-break Logica

Wanneer een set in een gelijke stand (6-6 in games) terechtkomt, schakelt het systeem moeiteloos over naar de tie-break modus. In deze modus wordt elk punt apart bijgehouden en wordt als winnaar aangewezen zodra een speler minimaal 7 punten haalt met een verschil van 2 punten. Deze aparte logica voor de tie-break modaliteit zorgt ervoor dat de regels van een echte tenniswedstrijd worden nagebootst.

Set en Wedstrijd Beslissing

De applicatie houdt niet alleen bij welke games en sets gewonnen worden, maar berekent ook de uiteindelijke uitslag van de wedstrijd. Zodra een speler 2 sets heeft gewonnen, wordt de wedstrijd afgesloten en wordt de winnaar bekendgemaakt. Dit sluit nauw aan bij de standaard wedstrijdregels in tennis waarbij vaak best-of-three sets wordt gespeeld.

Uitbreidingen en Mogelijke Verbeteringen

Hoewel deze implementatie de basisfunctionaliteiten van een tennis score tracker dekt, zijn er altijd mogelijkheden voor verdere uitbreidingen:

  • GUI Versie: Het kan interessant zijn om een grafische gebruikersinterface (GUI) te ontwikkelen, zodat de score niet alleen in de console maar ook in een applicatievenster wordt weergegeven.
  • Extra Validatie: In een productieomgeving kan het nuttig zijn om meer validatie toe te voegen, zoals het afvangen van uitzonderingen of het loggen van fouten.
  • Uitgebreide Tie-Break Logica: Voor professionele wedstrijden kunnen de tie-break regels uitgebreid worden, bijvoorbeeld door de servicevolgorde automatisch bij te houden en dynamisch de input aan te passen.

Bovendien kan de code verder worden opgesplitst in meerdere klassen, zoals een Player-klasse voor de spelers en een aparte klasse voor de Match en Game, om de modulariteit en onderhoudbaarheid te vergroten. Dit zou het ook gemakkelijker maken om extra functionaliteiten, zoals statistieken en wedstrijdgeschiedenis, toe te voegen.


Conclusie

In deze uitgebreide C# consoletoepassing is een robuust systeem beschreven waarmee een scheidsrechter de score van een tenniswedstrijd op een nauwkeurige manier kan bijhouden. De applicatie beheert puntentelling binnen games, de opbouw naar sets, en houdt rekening met de bijzondere situatie van een tie-break bij een gelijke setscore. Door de interactieve invoer en de duidelijke feedback wordt de voortgang van de wedstrijd op elk moment inzichtelijk. Met verdere uitbreidingen en optimalisaties kan deze basisimplementatie worden omgezet tot een professioneel hulpmiddel voor tenniswedstrijden.


Referenties

Meer Informatie


Last updated February 18, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI
Download Article
Delete Article