Witam.
Co prawda jest już na tym forum to zadanie rozwiązane, ale jest ono zrobione błędnie, więc tworzę swój artykuł.
Mam do napisania owy program:
Zasady gry 301 dla 1 gracza:
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.
Napisz program, który zlicza punkty w grę 301 dla jednego gracza, według zasad podanych powyżej. Program może mieć dowolną liczbę rund. W każdej rundzie zawodnik ma do wykorzystania 3 lotki. Każda lotka może punktować w zakresie 0 – 60 punktów. Jeśli punktacja podana przez gracza będzie mieściła się w tym zakresie, nie będziemy sprawdzali poprawności punktów (w prawdziwej grze zawodnik nie ma szans zdobyć np. 59 punktów w jednym rzucie, a w naszej grze może). Jeśli jednak wartość jednego rzutu nie mieści się w zakresie 0 - 60, program wyświetli komunikat: "Niepoprawna ilosc punktow".
Gra kończy się, gdy zawodnik osiągnie 0 punktów - nawet, jeśli będzie to po pierwszej lub drugiej lotce, a więc w środku rundy!
W każdej rundzie program wyświetli następują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, a nie ilością punktów zdobytych w rundzie. Przykładowo jeżeli w pierwszej rundzie rzuciłem 20 pkt, to x = 301 – 20 = 281.
Jeżeli gracz w rundzie rzuci więcej punktów niż mu pozostało, zobaczymy komunikat:
Runda X, BUST!
Liczba twoich punktów: x
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ę.
Na zakończenie gry (w momencie, gdy użytkownik uzyska 0 pkt) program wypisze komunikat:
Gra zakonczona w rundzie X
Nie działa mi komunikat "BUST!". Tzn. działa, aczkolwiek jeżeli zostanie np. 30 punktów, a wpisane zostanie 60, wyświetla się BUST, ale i tak te punkty się odejmują i kończy się program.
Próbowałem to zrobić dwa razy, ale w obydwu przypadkach jest źle. Dodam jeszcze, że rozpisałem, czyli punkty1, punkty2, punkty3 i nie jestem pewien czy nie wystarczyłoby samo np. punkty i wstawianie wszędzie, zamiast rozpisywania 3 przypadków.
Pierwszy kod:
#include <iostream>
using namespace std;
int main()
{
int punkty1=0;
int punkty2=0;
int punkty3=0;
int poczatkowepunkty=301;
int sumapunktow=0;
int runda=0;
int pozostalepunkty;
while (sumapunktow<301 && sumapunktow>=0)
{
runda=runda+1;
{
cout << "Runda " << runda << " , rzut 1: " << endl;
cin >> punkty1;
if (punkty1>=0 && punkty1<=60)
{
sumapunktow=sumapunktow+punkty1;
pozostalepunkty=poczatkowepunkty-sumapunktow;
if (pozostalepunkty==0)
break;
if (punkty1>pozostalepunkty)
{
cout << "BUST" << endl;
continue;
}
}
else
cout << "Niepoprawna ilosc punktow." << endl;
cout << "Runda " << runda << " , rzut 2: " <<endl;
cin >> punkty2;
if (punkty2>=0 && punkty2<=60)
{
sumapunktow=sumapunktow+punkty2;
pozostalepunkty=poczatkowepunkty-sumapunktow;
if (pozostalepunkty==0)
break;
if (punkty2>pozostalepunkty)
{
cout << "BUST!" << endl;
continue;
}
}
else
cout << "Niepoprawna ilosc punktow." << endl;
cout << "Runda " << runda << " , rzut 3: " << endl;
cin >> punkty3;
if (punkty3>=0 && punkty3<=60)
{
sumapunktow=sumapunktow+punkty3;
pozostalepunkty=poczatkowepunkty-sumapunktow;
if (pozostalepunkty==0)
break;
if (punkty3>pozostalepunkty)
{
cout << "BUST!" << endl;
continue;
}
}
else
cout << "Niepoprawna ilosc punktow." << endl;
}
cout << "Runda " << runda << " , liczba twoich punktow: " << poczatkowepunkty-sumapunktow<<endl;
}
cout << "Gra zakonczona w rundzie: " << runda;
return 0;
}
Pozdrawiam!