• 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
452 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 Toszek Nowicjusz (150 p.)
Tylko nie za bardzo wiem, w którym miejscu wstawić tego if'a. Bo wstawilem go chyba nie tutaj gdzie trzeba + wyskakuje mi przy nim błąd "error: invalid operands of types 'double(double)' and 'int' to binary 'operators%' ;/
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Podeślij kod który zmieniłeś i wszystko będzie jasne. :)
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)

@LuQ232,

#include <iostream>
#include <string.h>
#include <windows.h>
#include <cmath>
using namespace std;
string pierw, drug;
int x;
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;
    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;
        }
       
          
        }

return 0;
}

Narazie zacząłem od nowa po prostu sprawdzic czy cokolwiek się dzieje

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

Trochę pomieszałeś klamry i stworzyłeś zmienne przed mainem ;)


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


int main()
{
    int x;
    int cukierki=100;
    int i=0;
    int round=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;
    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;
        }

    }



return 0;
}

 

komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Poprawiłem kod i specjalnie zostawiłem Ci następną sprawę -> "Dlaczego nie zmienia się gracz??" ;) Powodzenia
1
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)
Faktycznie nie zmienia się. Pomyślałem ze na końcu dodam round++, zeby zwiększała się ilośc "rund" i zadziałało.
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Otóż to. Kombinuj nad resztą
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)

dodałem takiego if'a i niby to działa tylko problem mam taki jakiego tez nie umialem rozwiazac juz wczesniej, a mianowicie: W tej grze powinno sie dać wpisać 1 jeśli cukierki=1 i ja juz to probowalem ale mi cos nie wychodzilo. Bo w tym co jak narazie mam, gdy cukierki są rowne 1 to po wpisaniu 1 pojawia sie Blad czego nie powinno byc. Zamiast tego potrzebne jest (tak mi sie wydaje) mozliwosc wpisania 1 i zeby ten gracz który ją wpisał wygrał. Mam nadzieję, że cokolwiek zrozumiałeś bo pisze troche chaotycznie.

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 (x>=maks || x>=cukierki)
        {
            cout <<"Blad!";
            return 0;
        }
        cukierki-=x;
        round++;
    }

 

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

To tylko drobna zmiana. Musisz zapisywać do zmiennej pomocniczej ( u ciebie max) wartość zabranych cukierków. Wtedy będziesz mógł sprawdzać czy w następnej rundzie ktos nie probuje wziać więcej cukierków niż w poprzedniej rundzie

/*
PROGRAM
*/        
    maks=x;
    round++;
    }
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)
Mi chodziło bardziej o to, że gra się kończy jak cukierka zabierze ostatnia osoba. Zalozmy ze pierwsza osoba wziela 54 cukierki wiec zostalo 46, nastepna bierze 45 zostaje jeden. Wiec pierwsza osoba bierze tego ostatniego i wygrywa, tyle że mam w programie zapisane ze jesli x=cukierki to błąd. Nie potrafie też zapisać tego, aby wyświetlało mi kto wygrał gre :/
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
edycja 18 kwietnia 2020 przez LuQ232
A odnośnie zabrania ostatniego cukierka to trzeba sprawdzić jako osobny przypadek.Musisz troszkę zmodyfikować sprawdzanie wszystkich  warunków. Najpierw sprawdzasz czy ilość cukierków na stole jest równa 1 Jeżeli nie to dopiero sprawdzasz te warunki które masz. I już. Jak odpowiednio dodasz to co Ci napisałem to masz gotowy program :)
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)
Nie wiem nadal jak wywołać który gracz wygrał :/
komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 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 round=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(round%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(round%2==0) {
            cout <<"Ile cukierkow bierze "<<pierw<<"?"<<endl;
            cin >>x;
            cout <<"Brawo wygrywa "<<pierw<<"."<<endl;
        }
        else
        {
            cout <<"Ile cukierkow bierze "<<drug<<"?"<<endl;
            cin >>x;
             cout <<"Brawo wygrywa "<<drug<<"."<<endl;
        }
        }
        round++;
    } while (cukierki>1);
return 0;
}

 

Coś pokręciłem ewidentnie XD

komentarz 18 kwietnia 2020 przez Toszek Nowicjusz (150 p.)
Dobra sam nie wiem wgl co ja pokręciłem, ale w tym ostatnim ifie zamieniłem po prostu tam gdzie był pierw na drug, a tam gdzie drug na pierw i dziala XD
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ź 112 wizyt
pytanie zadane 3 listopada 2023 w Rozwój zawodowy, nauka, praca przez whiteman808 Obywatel (1,840 p.)
0 głosów
1 odpowiedź 155 wizyt
+1 głos
1 odpowiedź 262 wizyt

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 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!

...