Ocena kodu systemu do liczenia punktów w tenisa

0

Witam, napisałem swój pierwszy kod i chciałbym żebyście na niego spojrzeli, przypuszczam że można to zrobić o wiele prościej niż u mnie, dlatego chciałbym żeby ktoś spojrzał na to okiem fachowca. Potrzebuję także pomocy w jednej rzeczy mianowicie jest to losowanie wyniku meczu tenisowego i nie wiem jak zrobić, by możliwe było wylosowanie również wyniku 7-6 lub 7-5 (czy możliwe jest by przypisało zmiennej liczbę a lub liczbę b losowo? i na tej podstawie jeśli przypisywałoby "7" to dla tej drugiej wtedy musiałoby przypisać również losowo 5 lub 6?) a drugie pytanie brzmi czy korzystając z Random może być tak, że wylosują się dla obu zmiennych te same wartości? Jak to wtedy działa w moim kodzie przy tym warunku że większą liczbę sprowadza do 6?
E: W ostatnim secie ma być super TB dlatego losowanie do 10 :)

{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Wprowadź pierwszego zawodnika:");
            String zawodnik1 = Console.ReadLine();
            Console.WriteLine("Wprowadź drugiego zawodnika:");
            String zawodnik2 = Console.ReadLine();
            Console.WriteLine(zawodnik1 + " vs " + zawodnik2);
            Random losowanie = new Random();
            int set1zawodnik1 = losowanie.Next(0, 5);
            int set1zawodnik2 = losowanie.Next(0, 5);
            int set2zawodnik1 = losowanie.Next(0, 5);
            int set2zawodnik2 = losowanie.Next(0, 5);
            int set3zawodnik1 = losowanie.Next(0, 5);
            int set3zawodnik2 = losowanie.Next(0, 9);

            if (set1zawodnik1 > set1zawodnik2)
            {
                set1zawodnik1 = 6;

            }
            else
            {
                set1zawodnik2 = 6;

            }



            if (set2zawodnik1 > set2zawodnik2)
            {
                set2zawodnik1 = 6;

            }
            else
            {
                set2zawodnik2 = 6;

            }

            Console.WriteLine("Wynik 1 seta:" + set1zawodnik1 + " - " + set1zawodnik2);

            Console.WriteLine("Wynik 2 seta:" + set2zawodnik1 + " - " + set2zawodnik2);

            if (set3zawodnik1 > set3zawodnik2)
            {
                set3zawodnik1 = 10;

            }
            else
            {

                set3zawodnik2 = 10;

            if (set1zawodnik1 == 6 && set2zawodnik1 == 6)
                {

                    Console.WriteLine("Koniec meczu");

                }

            else if (set1zawodnik2 == 6 && set2zawodnik2 == 6)
                {
                    Console.WriteLine("Koniec meczu");
                }
            else
                {
                    Console.WriteLine("Wynik 3 seta:" + set3zawodnik1 + " - " + set3zawodnik2);
                }


            }
        }
    }
}

3

Nazwy zmiennych powinny być po angielsku.

0
mamrzeczy.pl napisał(a):

Nazwy zmiennych powinny być po angielsku.

Okej, dzięki za feedback, będę miał na uwadze, a oprócz tego co jeszcze.

3

Moze duzo kodu nie ma, Ale troche duplikacji jest. Jakby gralo sie do 30 setow to powtarzalbys ten kod 29 razy?

if (set1zawodnik1 > set1zawodnik2)
            {
                set1zawodnik1 = 6;

            }
            else
            {
                set1zawodnik2 = 6;

            }



            if (set2zawodnik1 > set2zawodnik2)
            {
                set2zawodnik1 = 6;

            }
            else
            {
                set2zawodnik2 = 6;

            }

Jakas tablica by sie przydala czy cos

0

Co jest celem projektu, co jest zamiarem?
Ten blok tekstu bez akapitów nie mówi tego jasno.
W świetle celu można oceniać rozwiązania

0
byte[] setZawodnik1 = new byte[3]; 
byte[] setZawodnik2 = new byte[3];


for (int i = 0; i < 3; i++)
{
    setZawodnik1[i] = (byte)losowanie.Next(0, 7);
    setZawodnik2[i] = (byte)losowanie.Next(0, 7);
}
1

Nazwy zmiennych mylące. Do tego ifologia, którą można zastąpić mapą co znacząco skróci i uprości kod. No i brakuję tutaj podziału na chociażby metody. Main powinien tylko wywoływać konkretne obiekty a nie definiować całą logikę biznesową.

0

Zrobiłem coś takiego

ZrobieDobrze napisał(a):

Co jest celem projektu, co jest zamiarem?
Ten blok tekstu bez akapitów nie mówi tego jasno.
W świetle celu można oceniać rozwiązania

Zamiar jest taki, żeby generowało losowy wynik meczu tenisowego, w przypadku remisu 1-1 w setach generowało wynik trzeciego. Jest to tylko w celach szkoleniowych i po to żeby zobaczyć czy w ogóle cokolwiek z tego udało mi się zrozumieć.


int[] results = new int[6];

for (int i = 0; i < results.Length; i++)
{
    Random random = new Random();
    results[i] = random.Next(0, 5);

Utworzyłem tablicę na 6 elementów, zamiast wypisywać pojedynczo każdy set każdego zawodnika generuje mi te "wyniki" do tablicy. Teraz powinienem przywołać element tablicy i przyrównać do kolejnego elementu i jeśli jest większy to przypisać mu wartość 6, jeżeli nie to przypisać temu drugiemu, dobrze kombinuję?

0
namespace Losowanie_wyniku_tenisowego
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Start();
            Losowanie();

            
        }

        public static void Start()
        {
            Console.WriteLine("--------------------------------------");
            Console.WriteLine("Program do losowania wyniku tenisowego");
            Console.WriteLine("--------------------------------------");
            Console.WriteLine("Podaj nazwę pierwszego gracza");

            String player1 = Console.ReadLine();
            Console.WriteLine("Podaj nazwę drugiego gracza");

            String player2 = Console.ReadLine();
            Console.WriteLine("Mecz: " + player1 + " vs " + player2);


        }
        public static byte[] Losowanie()
        {
            byte[] results = new byte[6];

            for (byte i = 0; i < results.Length; i++)
            {
                Random random = new Random();
                results[i] = (byte)(random.Next(0, 5));
                Console.WriteLine(results[i]);

            }
            return results;
        }


    }
}

Wziąłem Wasze uwagi do serca, mój kod wygląda teraz w ten sposób. Teraz tak, chciałbym wykorzystać tą tablicę "results" do tego żeby przyrównać wyniki w parach: 1-2, 3-4, 5-6, gdzie 1 to będzie set1zawodnik1, 2 to zawodnik2set1 itd. Jak mogę odwołać się do tej tablicy i w którym miejscu mogę na niej operować? Czy dobrze użyłem i rozumiem 'return,' czyli żeby funkcja 'Losowanie' zwróciła mi zawartość tej tablicy 'results' po losowaniu wyników?

0
/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
using System;

namespace Losowanie_wyniku_tenisowego
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Start();
          

            
        }

      public static void Start()
{
    Console.WriteLine("Wprowadź pierwszego zawodnika:");
    string zawodnik1 = Console.ReadLine();
    Console.WriteLine("Wprowadź drugiego zawodnika:");
    string zawodnik2 = Console.ReadLine();

    Losowanie(zawodnik1, zawodnik2);
}

public static void Losowanie(string zawodnik1, string zawodnik2)
{
    byte[] wyniki_gracza_1 = new byte[3];
    byte[] wyniki_gracza_2 = new byte[3];
    Random random = new Random();

    for (byte i = 0; i < wyniki_gracza_1.Length; i++)
    {
        wyniki_gracza_1[i] = (byte)(random.Next(0, 5));
        wyniki_gracza_2[i] = (byte)(random.Next(0, 5));

        if (wyniki_gracza_1[i] > wyniki_gracza_2[i])
        {
            wyniki_gracza_1[i] = 6;
            wyniki_gracza_2[i] = 0;
        }
        else
        {
            wyniki_gracza_1[i] = 0;
            wyniki_gracza_2[i] = 6;
        }
    }

    byte wynik_1 = (byte)(wyniki_gracza_1[0] + wyniki_gracza_1[1] + wyniki_gracza_1[2]);
    byte wynik_2 = (byte)(wyniki_gracza_2[0] + wyniki_gracza_2[1] + wyniki_gracza_2[2]);
    Console.WriteLine("Wynik :  " + zawodnik1 +" "+ wynik_1 + " -  " +zawodnik2  +" "+ wynik_2);
}



    }
}

?
Te nazwy graczy potrzebujesz chyba ustawić globalnie i przekazać parametrami do funkcji
Ale ja C# to prawie nie dotykałem.
Chyba że chcesz to odzielnie wyświetlać to w pętli możesz. Nie znam się na tenisie.
Tylko pilnuj żeby wynik w byte się zmieścił. Bo przy 40 000 x 1 byte - to już się w byte nie mieści.

1

@adam09:

Na static to się niczego porządnego nie nauczysz

Już, choć to maleństwo, widac nienaturalne wywołania "procedur" (tak, to programowanie proceduralne), coś jest pochodną braku zmiennych instancyjnych (obiektowych), i tak dalej, i tak dalej.

Start jest całością (ma pod-wywołanie zawierające się w nim). Inaczej mówiąc Start sie kończy razem z programem , z czego gramatycznie wynika ze nie jest startem.

Tablica jest zbędna (ona by miała wiodący sens w dobrym zaprojektowaniu: tu inicjowanie <-> tu wykonanie, w dobrym projekcie obiektowym)

0
ZrobieDobrze napisał(a):

@adam09:

Na static to się niczego porządnego nie nauczysz

Już, choć to maleństwo, widac nienaturalne wywołania "procedur" (tak, to programowanie proceduralne), coś jest pochodną braku zmiennych instancyjnych (obiektowych), i tak dalej, i tak dalej.

Start jest całością (ma pod-wywołanie zawierające się w nim). Inaczej mówiąc Start sie kończy razem z programem , z czego gramatycznie wynika ze nie jest startem.

Tablica jest zbędna (ona by miała wiodący sens w dobrym zaprojektowaniu: tu inicjowanie <-> tu wykonanie, w dobrym projekcie obiektowym)

Okej, w takim razie co powinienem zmienić albo czy poleciłbyś mi konkretną literaturę lub tutorial w którym będzie opisane w jaki sposób nauczyć się porządnie? Dobrym sposobem na naukę jest patrzenie na czyjś kod i zrozumienie w jaki sposób autor rozwiązuje problem?

1
class Tennis {
      byte[] wyniki_gracza_1 ;
      byte[] wyniki_gracza_2 ;

     public Tennis(){
      wyniki_gracza_1 = new byte[3];
      wyniki_gracza_2 = new byte[3];
    }
}

class Preogram 
 main() {
    var t = new Tennis();
    t.doSomething(); 
 }

to nie jest gotowy kod

1
adam09 napisał(a):

Dobrym sposobem na naukę jest patrzenie na czyjś kod i zrozumienie w jaki sposób autor rozwiązuje problem?

Czasami tak czasami nie.
Jeśli będziesz tak robić non stop to dojdziesz do momentu, w którym pomyślisz sobie, dobra rozumiem wszystko, umiem napisać każdy kod.
Potem usiądziesz do klawiatury i okaze się, że nie wiesz od czego zacząć.

Dlatego na platformach typu codewars itp najpierw piszesz swoje rozwiązanie, a dopiero potem oglądasz rozwiązania społeczności.

1
KamilAdam napisał(a):

Moze duzo kodu nie ma, Ale troche duplikacji jest. Jakby gralo sie do 30 setow to powtarzalbys ten kod 29 razy?

if (set1zawodnik1 > set1zawodnik2)
            {
                set1zawodnik1 = 6;

            }
            else
            {
                set1zawodnik2 = 6;

            }



            if (set2zawodnik1 > set2zawodnik2)
            {
                set2zawodnik1 = 6;

            }
            else
            {
                set2zawodnik2 = 6;

            }

Jakas tablica by sie przydala czy cos

YAGNI.

Na razie nie gra do 30 setów także ten kod na razie jest dobry taki jaki jest.

1

Losuj tylko wynik pojedynczego starcia, nawet nie gemu. i dopisz do tego całą logikę gry w tenisa zgodnie z zasadami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1