Prosty program do gry w Dart - 301

0

Witam wszystkich, jest to mój pierwszy post na forum! Od pewnego czasu uczę się programowania w C++ i miałem właśnie do napisania program do gry w Dart - 301. Opis gry jest następujący:

"Jest to najbardziej znana gra w darta. Grana w większości Dart-ligach i wielu turniejach. Zawodnik zaczyna grę od stanu punktowego 301. Na koniec każdej kolejki (po rzuceniu 3 rzutek) odejmuje się sumę zdobytych punktów od poprzedniego stanu punktowego. Zawodnik, musi zredukować ilość punktów dokładnie do zera. Gdy zawodnik w jednej kolejce zdobędzie więcej punktów niż potrzebne jest do osiągnięcia zera - oznacza to "BUST" i nie będą one zapisane. Całkowita punktacja powraca do stanu z poprzedniej kolejki."

Warunki prawidłowego działania programu sa następujące:

  1. Zlicza punkty w grę 301 dla jednego gracza
  2. Może mieć dowolną liczbę rund
  3. W każdej rundzie zawodnik ma do wykorzystania 3 lotki
  4. Każda lotka może punktować w zakresie 0..60, jeśli podana wartość nie mieści się w zakresie wyświetlany zostaje komunikat: "Niepoprawna ilość punktów"
  5. Gra kończy się, gdy zawodnik osiągnie 0 punktów obojętnie, w której rundzie
  6. Jeśli gracz w rundzie rzuci więcej punktów niż mu pozostało, zobaczy komunikat: "Runda X, BUST! Liczba twoich punktów: x"
  7. Komunikat BUST! pojawi się bezpośrednio po rzucie, w którym gracz przekroczył punktację. Oznacza to, że BUST! może być po 1, 2 lub 3 rzucie. Niezależnie od numeru rzutu, BUST! zawsze kończy bieżącą rundę.
  8. Na zakończenie gry (w momencie, gdy użytkownik uzyska 0 pkt) program wypisze komunikat: "Gra zakonczona w rundzie X"
  9. Dodatkowym wymaganiem jest, aby program zakończył się natychmiast po wprowadzeniu przez użytkownika liczby -1. Liczba ta zostanie wykorzystana przez testy automatyczne do zakończenia działania programu po wykonaniu testu.
  10. W każdej rundzie program wyświetla nastepujące komunikaty:
    *Runda 1, rzut 1: Podaj ilość punktów
    *Runda 1, rzut 2: Podaj ilość punktów
    *Runda 1, rzut 3: Podaj ilość punktów
    *Runda 1, liczba twoich punktów: x" (gdzie x jest liczbą punktów posiadanych przez gracza)

Udało mi się napisać program spełniający wszystkie wymogi oraz rozumiem jak działa. Natomiast mam wrażenie, że jest napisany strasznie chaotycznie, nawet jak na kogoś kto dopiero raczkuje w temacie (dodam, że podczas pisania dozwolone było korzystanie jedynie z if'a, for, czy też while. Żadnych funkcji.).

#include <iostream>
using namespace std;

int main ()
{
    int stanPunktowy = 301;
    int runda = 1;
    int punkty;
    
    while (punkty != -1){ //
       
        for (int rzut = 1; rzut <=3; rzut++){ //petla proszaca trzy razy o podanie wyniku, zmienia numer rzutu
                cout << "Runda " << runda << ", rzut " << rzut << ": Podaj ilość punktów ";
                cin >> punkty;
            
                if (punkty >=0 && punkty <= 60){ //jesli punkty mieszcza sie w przedziale 0..60 - jest dobrze
                    stanPunktowy = stanPunktowy - punkty;
                        if (stanPunktowy == 0){ //jesli uda sie zejsc z 301 punktow na 0
                            cout << "Gra zakończona w rundzie " << runda << endl; //wyswietlany jest komunikat o zwyciestwie
                            punkty = -1; //a do zmiennej odpowiedzialnej za punkty przypisuje sie warunek odpowiedzialny za koniec dzialania while
                            break; // przerwanie petli for
                        }
                        else if (stanPunktowy < 0){ //komunikat o przekroczeniu prawidlowego wyniku
                            stanPunktowy = stanPunktowy + punkty; // dodanie punktow, by wynik nie byl na minusie
                            cout << "Runda " << runda << ", BUST!\nLiczba twoich punktów: " << stanPunktowy << endl;
                            break; //koniec petli for, poczatek nowej rundy
                        }
                    }
                else if (punkty > 60){ //komunikat o niepoprawnej licznie punktow za rzut
                    cout << "Niepoprawdna ilosc punktow" << endl;
                    rzut = rzut -1; //cofniecie rzutu, nowa szansa na wpisanie poprawnego wyniku
                    continue; //przerwanie jednego obiegu petli
                    }
                else if (punkty == -1){ //po podaniu -1 nastepuje koniec programu
                    break;
                }
            if (rzut == 3) { //komunikat pojawiajacy sie na koniec rundy
                cout << "Runda " << runda << ", liczba twoich punktów: " << stanPunktowy << endl;
            }
            }
        
            runda ++; //zwiekszanie wartosci rundy
        }
    return 0;
}

Czy jest aż tak, źle jak myślę ?
Liczę na wszelkie cenne uwagi i porady :)
Proszę o wybaczenie tak długiego posta :D
Pozdrawiam wszystkich serdecznie :)

0

Te komentarze dają więcej złego, niż dobrego, jeśli zmienne są sensownie nazwane to myśle że kod i tak będzie w miarę czytelny.
Czyli ogólnie, nie pakuj tyle komentarzy, nie jest to potrzebne.
Zresztą nie ma co tu oceniać zbyt, napisz to samo może, ale tym razem z użyciem funkcji, i sobie porównaj, co wygląda ładniej, potem z klasami, i porównaj znów.
for (int rzut = 1; rzut <=3; rzut++) po co tak? to troche czepnianie się, ale imo lepiej wygląda po prostu
for(int rzut=0;rzut<3;++rzut)
int punkty; inicjalizuj zmienne, nie robienie tego prowadzi prędzej czy później do dziwnych bugów.
cin >> punkty;
fajnie byłoby jescze wczytać poprawne wejscie, ale to szczegół
Zabezpieczenie przed wpisywaniem liter

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