• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Naprowadzenie do rozwiązania zadania!

Object Storage Arubacloud
0 głosów
443 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Toszek Nowicjusz (150 p.)

Mam pewien problem. Jestem bardzo początkującą osobą, i niestety nie potrafie rozwiązać tego zadania. Oczywiście nie proszę o zrobienie go całego, tylko o naprowadzenie jakiekolwiek co mogę zrobić, żeby to działało dobrze. Nie potrafie zrobić czegoś takiego, aby wypisało mi, który gracz wygrywa grę. 

#include <iostream>
#include <string.h>
using namespace std;
string pierw, drug;
int x,y,z;
int cukierki=100;
int i=0;
int main()
{   cout <<"Witaj w grze w cukierki! :)"<<endl;
    cout <<"Podaj nazwe pierwszego gracza: ";
    cin >> pierw;
    cout <<"Podaj nazwe drugiego gracza: ";
    cin >>drug;
    do
    {
        cout <<"Liczba cukierkow: "<<cukierki<<endl;
        cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
        cin >>x;
        if (x>=cukierki || x==99)
        {
            cout <<"Blad!"<<endl;
            return 0;
        }

        cukierki-=x;

        cout <<"Liczba cukierkow: "<<cukierki<<endl;
        cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
        cin >>z;

        if (z>=cukierki)
        {
            cout <<"Blad!"<<endl;
            return 0;
        }
        cukierki-=z;

} while (cukierki=1);


return 0;
}

A tutaj polecenie: W grze w 100 cukierków bierze udział dwóch graczy, którzy na zmianę zabierają cukierki ze stołu. W pierwszym ruchu można wziąć nie więcej niż 99 cukierków, a w każdym następnym - nie więcej, niż ostatnio wziął przeciwnik (oraz nie więcej, niż leży na stole). Wygrywa ten, kto weźmie ostatniego cukierka. Napisz program nadzorujący grę, tj. sprawdzający, czy gracze nie oszukują.

Potrzebuję jakiegokolwiek naprowadzenia z czego mogę skorzystać.

2 odpowiedzi

+2 głosów
odpowiedź 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
wybrane 18 kwietnia 2020 przez Toszek
 
Najlepsza

Zacznijmy od przemyślenia jak ma działać program. Moim pomysłem jest wprowadzenie zmiennej int runda = 0. Będzie to licznik odbytych do tej pory rund. Gdy gracz poprawnie zabierze cukierek to zwiększamy ilość odbytych rund ( runda++; ). Dzięki temu nie będziemy musieli  mieć dwóch zmiennych x oraz z. Będziemy mieli jedną : np x która będzie liczbą zabieranych cukierków podczas danej rundy. Używając reszty z dzielenia  będziemy mogli wypisać na konsoli który gracz zabiera cukierki. 

if(round%2==0)
        {
        cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
        }else{
        cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
        }

 

Zastanówmy się nad rozwiązaniem  problemu "w każdym następnym ruchu - nie więcej, niż ostatnio wziął przeciwnik". Moim pomysłem jest wprowadzenie zmiennej pomocniczej na początku ustawionej na wartość 99. Na końcu wykonania rundy zaraz po linii : 


        cukierki-=x;

do naszej zmiennej pomocniczej przypiszemy ilość zabranych cukierków w tej rundzie. Dzięki temu w następnej rundzie możemy sprawdzić czy aktualnie zabierana ilość  nie jest większa od ilości zabranych cukierków w poprzedniej rundzie.

 

W twoim kodzie masz jeszcze jeden podstawowy błąd a mianowicie warunek zakończenia programu. Powinieneś porównywać tą wartość a nie PRZYPISYWAĆ. '=' a '==' to różnica :)

 

Pamiętaj, że pętla do while wykonuje się dopóki warunek jest spełniony ( czyli nie bedzie to cukierki ==1) ;)

 

Jak coś to o wszystko pytaj. Program mam gotowy ale chyba nie o to chodzi zeby zrobic za ciebie zadanie

komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

Za bardzo komplikujesz. Tutaj o co mi chodziło ze sprawdzaniem ostatniego cukierka.


#include <iostream>
#include <string.h>
using namespace std;

int main()
{
string pierw, drug;
int x;
int cukierki=100;
int maks=99;
int round =0;

    cout <<"Witaj w grze w cukierki! :)"<<endl;
    cout <<"Podaj nazwe pierwszego gracza: ";
    cin >> pierw;
    cout <<"Podaj nazwe drugiego gracza: ";
    cin >>drug;

while (cukierki>=1)
    {

        cout <<"Liczba cukierkow: "<<cukierki<<endl;
        if(round%2==0)
        {
            cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
            cin >>x;
        }
        else
        {
            cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
            cin >>x;
        }

        if(cukierki!=1)
        {
             if (x>=maks || x>=cukierki)
            {
                cout <<"Blad!";
                return 0;
            }
        }

        cukierki-=x;
        maks=x;
        round++;
    }


return 0;
}

Jedyne co Ci zostaje to PO ZAKOŃCZENIU GŁÓWNEGO WHILE wyłonić zwycięzce. To pozostawiam Tobie bez żadnych podpowiedzi. Powodzenia

komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)

Tak wygląda gotowy kod. Niby działa ale jeśli coś jednak jest do poprawy to chętnie się dowiem :P 

#include <iostream>
#include <string.h>
#include <windows.h>
#include <cmath>
using namespace std;
int main()
{   int maks=99;
    int x;
    int cukierki=100;
    int i=0;
    int runda=0;
    string pierw, drug;
    cout <<"Witaj w grze w cukierki! :)"<<endl;
    cout <<"Podaj nazwe pierwszego gracza: ";
    cin >> pierw;
    cout <<"Podaj nazwe drugiego gracza: ";
    cin >>drug;
    do
    {
        cout <<"Liczba cukierkow: "<<cukierki<<endl;

        if(runda%2==0)
        {
            cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
            cin >>x;
        }
        else
        {
            cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
            cin >>x;
        }
        if (x>=maks || x>=cukierki)
        {
            cout <<"Blad!";
            return 0;
        }

        cukierki-=x;
        if (cukierki==1)
        {
            if(runda%2==0) 
        { 
            cout <<"Liczba cukierkow: "<<cukierki<<endl;
            cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
            cin >>x;
            cout <<"Brawo wygrywa "<<drug<<"."<<endl;
        }
        else
        {   cout <<"Liczba cukierkow: "<<cukierki<<endl;
            cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
            cin >>x;
            cout <<"Brawo wygrywa "<<pierw<<"."<<endl;
        }
        }
        runda++;
    } while (cukierki>1);
return 0;
}

 

komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)
Dobra widzę, że napisałeś odpowiedź co do poprawy, niestety nie zaktualizowało się. Dzięki wielkie, jeśli jeszcze będę miał jakiekolwiek pytanie co do tego programu dam znać :)
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)

Po while dodałem takiego if'a i działa wyłanianie zwycięzcy. Czy o to chodziło?

 if (round%2==1)
    {
        cout <<"Brawo wygrywa "<<pierw<<".";
    }
    else
    {
        cout <<"Brawo wygrywa "<<drug<<".";
    }

 

komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Dokładnie. Dobra robota!
+2 głosów
odpowiedź 18 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

1. Dodaj zmienną max=99 oznaczającą ile cukierków można wsiąść. Podczas ruchu gracza sprawdzaj czy wybrana przez niego liczba jest większa od max lub jest większa od pozostałej liczby cukierków. Po prawidłowym ruchu gracza ustaw max na ilość cukierków które zabrał.

2. (opcjonalne)  Napisz funkcję realizującą ruch gracza. I w każdej pętli zmieniaj aktualnego gracza. Jeżeli nie chcesz pisać takiej funkcji to upewnij się że obsługujesz obu graczy takim samym kodem.

3. Warunek pętli (cukierki=1) powoduje przypisanie do zmiennej cukierki wartości 1 (operatorem porównania w C++ jest operator == (dwa znaki równości)). Zmień ten warunek na (cukierki > 0)

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 3 listopada 2023 w Rozwój zawodowy, nauka, praca przez whiteman808 Obywatel (1,820 p.)
0 głosów
1 odpowiedź 154 wizyt
+1 głos
1 odpowiedź 262 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...