Gra w kości - Wasze opinie i uwagi

0

Witam!

Chciałbym Wam przedstawić moją kolejną aplikację napisaną w C#. Jest to bardzo dobrze wszystkim znana - gra w kości. Do jej napisania użyłem Windows Forms.

Bardzo bym prosił, abyście pisali wszelkie swoje sugestie co do samej aplikacji jak i do kodu, bo wiem, że daleko mu od ideału. Niektóre rzeczy mogłem inaczej rozwiązać - tym bardziej sprawdzanie poszczególnych układów. Od razu chcę powiedzieć, że jest to projekt na studia (na zaliczenie przedmiotu, 3 rok). Używałem w niej tylko i wyłącznie polskich nazw (tak wiem, angielski tylko i wyłącznie, jednak z racji tego że na uczelnie postanowiłem robić po polsku). Także czekam na Wasze wszelką krytykę, porady i sugestie.

W załączeniu przesyłam projekt.

Pozdrawiam!

0

Całkiem spoko, tylko następnym razem oddziel kod od exe :) zeby nie szukac po folderach.

3

Pominę już fakt, że masz kilkanaście okienek, które różnią się jednym obrazkiem, to jest po prostu nie do opisania...

Trzeci rok studiów, i nie znasz tablic ani pętli?

Przecież tu aż się prosi o to!

class Losowanie
{
    private Random rzut = new Random();
    private Gra gra;


    public Losowanie(Gra gra)
    {
        this.gra = gra;
    }


    public static int Wylosowano1 { get; private set; }
    public static int Wylosowano2 { get; private set; }
    public static int Wylosowano3 { get; private set; }
    public static int Wylosowano4 { get; private set; }
    public static int Wylosowano5 { get; private set; }


    public void Losuj()
    {
        if(gra.Kość1)
            Wylosowano1 = rzut.Next(1, 7);
        if(gra.Kość2)
            Wylosowano2 = rzut.Next(1, 7);
        if(gra.Kość3)
            Wylosowano3 = rzut.Next(1, 7);
        if(gra.Kość4)
            Wylosowano4 = rzut.Next(1, 7);
        if(gra.Kość5)
            Wylosowano5 = rzut.Next(1, 7);
    }
}

A tu tym bardziej:

public int Jedynki()
{
    jedynki = 0;

    if (Losowanie.Wylosowano1 == 1)
        jedynki++;
    if (Losowanie.Wylosowano2 == 1)
        jedynki++;
    if (Losowanie.Wylosowano3 == 1)
        jedynki++;
    if (Losowanie.Wylosowano4 == 1)
        jedynki++;
    if (Losowanie.Wylosowano5 == 1)
        jedynki++;

    return jedynki;
}


public int Dwójki()
{
    dwójki = 0;

    if (Losowanie.Wylosowano1 == 2)
        dwójki += 2;
    if (Losowanie.Wylosowano2 == 2)
        dwójki += 2;
    if (Losowanie.Wylosowano3 == 2)
        dwójki += 2;
    if (Losowanie.Wylosowano4 == 2)
        dwójki += 2;
    if (Losowanie.Wylosowano5 == 2)
        dwójki += 2;

    return dwójki;
}

Policzenie sumy kostek danej wartości można zrobić znacznie prościej, podobnie jak stwierdzenie, jaka kombinacja została wylosowana. Wystarczy użyć tablic, pętli i trochę myśleć.

public int Full()
{
    full = 0;
    a4 = 0;
    b4 = 0;
    c4 = 0;
    d4 = 0;
    e4 = 0;
    f4 = 0;

    if (Losowanie.Wylosowano1 == 1)
        a4++;
    if (Losowanie.Wylosowano1 == 2)
        b4++;
    if (Losowanie.Wylosowano1 == 3)
        c4++;
    if (Losowanie.Wylosowano1 == 4)
        d4++;
    if (Losowanie.Wylosowano1 == 5)
        e4++;
    if (Losowanie.Wylosowano1 == 6)
        f4++;

    if (Losowanie.Wylosowano2 == 1)
        a4++;
    if (Losowanie.Wylosowano2 == 2)
        b4++;
    if (Losowanie.Wylosowano2 == 3)
        c4++;
    if (Losowanie.Wylosowano2 == 4)
        d4++;
    if (Losowanie.Wylosowano2 == 5)
        e4++;
    if (Losowanie.Wylosowano2 == 6)
        f4++;

    if (Losowanie.Wylosowano3 == 1)
        a4++;
    if (Losowanie.Wylosowano3 == 2)
        b4++;
    if (Losowanie.Wylosowano3 == 3)
        c4++;
    if (Losowanie.Wylosowano3 == 4)
        d4++;
    if (Losowanie.Wylosowano3 == 5)
        e4++;
    if (Losowanie.Wylosowano3 == 6)
        f4++;

    if (Losowanie.Wylosowano4 == 1)
        a4++;
    if (Losowanie.Wylosowano4 == 2)
        b4++;
    if (Losowanie.Wylosowano4 == 3)
        c4++;
    if (Losowanie.Wylosowano4 == 4)
        d4++;
    if (Losowanie.Wylosowano4 == 5)
        e4++;
    if (Losowanie.Wylosowano4 == 6)
        f4++;

    if (Losowanie.Wylosowano5 == 1)
        a4++;
    if (Losowanie.Wylosowano5 == 2)
        b4++;
    if (Losowanie.Wylosowano5 == 3)
        c4++;
    if (Losowanie.Wylosowano5 == 4)
        d4++;
    if (Losowanie.Wylosowano5 == 5)
        e4++;
    if (Losowanie.Wylosowano5 == 6)
        f4++;


    if((a4 == 3) && (b4 == 2) ||
        (a4 == 3) && (c4 == 2) ||
        (a4 == 3) && (d4 == 2) ||
        (a4 == 3) && (e4 == 2) ||
        (a4 == 3) && (f4 == 2) ||
                
        (b4 == 3) && (a4 == 2) ||
        (b4 == 3) && (c4 == 2) ||
        (b4 == 3) && (d4 == 2) ||
        (b4 == 3) && (e4 == 2) ||
        (b4 == 3) && (f4 == 2) ||
                
        (c4 == 3) && (a4 == 2) ||
        (c4 == 3) && (b4 == 2) ||
        (c4 == 3) && (d4 == 2) ||
        (c4 == 3) && (e4 == 2) ||
        (c4 == 3) && (f4 == 2) ||
               
        (d4 == 3) && (a4 == 2) ||
        (d4 == 3) && (b4 == 2) ||
        (d4 == 3) && (c4 == 2) ||
        (d4 == 3) && (e4 == 2) ||
        (d4 == 3) && (f4 == 2) ||
               
        (e4 == 3) && (a4 == 2) ||
        (e4 == 3) && (b4 == 2) ||
        (e4 == 3) && (c4 == 2) ||
        (e4 == 3) && (d4 == 2) ||
        (e4 == 3) && (f4 == 2) ||
                
        (f4 == 3) && (a4 == 2) ||
        (f4 == 3) && (b4 == 2) ||
        (f4 == 3) && (c4 == 2) ||
        (f4 == 3) && (d4 == 2) ||
        (f4 == 3) && (e4 == 2))
    {
        full = 25;
    }



    return full;
}

Przecież jak się ma liczby wylosowane w tablicy, to sprawdzenie, czy jest wśród nich grupa kilku takich samych jest banalne, i nie wymaga kilkuset ifów, nie wymaga nawet jednego!

var liczby = new int[] {
    1, 2, 3, 5, 2, 2, 7, 6
};

int[] liczniki = new int[6]; // ta tablica zawiera informacje o tym, ile razy dana liczba została wylosowana

for (int i = 0; i < liczby.Length; i++)
{
    // wylosowana wartość jest indeksem w tablicy liczników, trzeba ją tylko zmniejszyć o 1, bo tablice indeksuje się od 0
    liczniki[liczby[i] - 1]++;

    if (liczniki[liczby[i] - 1] == 3)
    {
        Console.WriteLine("Mamy trójkę kostek: {0}", liczby[i]);
        break;
    }
}
1

Dokonane zmiany:

  • Dodany skrót do tego JAK GRAĆ już podczas grania
  • Wyłączona możliwość maksymalizacji we wszystkich oknach + kursora do rozszerzania
  • Gdy przechodzimy do gry znika nam okno z menu
  • Inne drobne poprawki (typu zablokowanie edycji TextBox'ów)
  • Ogólnie poprawiony sam kod (losowane kości wrzucone w tablice i sprawdzanie czy wystąpił dany układ - wszystko powrzucane w pętle i zrealizowane w jednej przeciążonej metodzie z parametrem)
  • Poprawione obliczenia w małym stricie

Jeszcze do zmiany:

  • Zmiana sposobu wprowadzania imon
  • Poprawienie klikania w liczby, aby było bardziej intuicyjne
  • Oraz inne drobne poprawki

somekind dzięki za krytykę i to jak najbardziej uzasadnioną. Wiem, że fatalnie to rozwiązałem i właście dlatego potrzeba mi takich komentarzy, żeby móc analizować wszystko i w przyszłości, żeby było już tylko lepiej.

PS.
Sam kod prześlę jak jeszcze bardziej bo zoptymalizuję.

0

Rzuciłem trzy razy i gra się zblokowała, nie mogę ani rzucić teraz, ani gracz się nie zmienia...

0

Po trzykrotnym rzucie musisz wybrać z kartki po prawej odpowiadający Ci wynik ;) Sorki za późną odpowiedź, ale nie było mnie tu dosyć dawno już.

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