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

Problem z kodem

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez Specjalny Nowicjusz (230 p.)
edycja 5 lutego 2019 przez Specjalny

To mój kod- gra polegająca na zgadywaniu liczb. Działa spoko i gdy zgadniesz ową liczbę program pyta czy chcesz grać dalej (wykorzystując komendę "do while"). W zamyśle gdy odpowiesz tak program wraca do początku i generuje kolejną losową liczbę. Tak się jednak nie dzieje. Program zadaje pytanie i gdy odpowiadam tak program daje ci możliwość dalszego odpowiadania jednak nie zmienia on liczby do zgadnięcia. Mam nadzieje że ktoś wytłumaczy mi na czym polega błąd i ewentułalnie pokaże jak zoptymalizować kod. Nie chcę jednak by wklejano mi po prostu skrypt podobnie działających programów bo to sam mogę zrobić.  Proszę o wyrozumiałość, dopiero się uczę.   

#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;
int x, y, z;
string odpowiedz;
int main ()
{
    do
    {
    cout << "Zagraj w gre. Program wygeneruje losowom liczbe, z przedzialu 1-100 a ty zgadnij jakom." << endl;

    srand(time(NULL));
    y = rand()%100+1;

              cin >> z;
              if(z==y)
              {
              cout << "Brawo!" << endl;
              cout << "Grasz dalej (wpisz tak lub nie)?" << endl;
              cin >> odpowiedz;
              }

              if(z>y)
              {
              cout << "Liczba jest za duza!" << endl;
              }
              for(x=1; x>=1; x++)
              {
              cin >> z;
              if(z>y)
              {
                    cout << "Liczba jest za duza!" << endl;
              }
              if(z==y)
              {
                    cout << "Brawo!" << endl;
                    cout << "Grasz dalej (wpisz tak lub nie)?" << endl;
                    cin >> odpowiedz;
              }
              if(z<y)
              {
                    cout << "Liczba jest za mala!" << endl;
              }
              }

              if(z<y)
              {
              cout << "Liczba jest za mala!" << endl;
              }
              for(x=1; x>=1; x++)
              {
              cin >> z;
              if(z>y)
              {
                    cout << "Liczba jest za duza!" << endl;
              }
              if(z==y)
              {
                    cout << "Brawo!" << endl;
                    cout << "Grasz dalej (wpisz tak lub nie)?" << endl;
                    cin >> odpowiedz;
              }
              if(z<y)
              {

                    cout << "Liczba jest za mala!" << endl;
              }
              }

}while(odpowiedz == "tak");
return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 21 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
edycja 21 stycznia 2019 przez DragonCoder

1. https://forum.pasja-informatyki.pl/faq#jak-wstawic-kod-zrodlowy

2. Jako taka optymalizacja kodu:

int main ()
{
int randomNumber = 0;
int userAnswer = 0;
int points = 0;
int numberOfTries = 0;

    std::cout << "Zagraj w gre. Program wygeneruje losowa liczbe wieksza od 0, z przedzialu 1-100 a ty zgadnij jaka.\n";
    std::cout << "Zeby zakonczyc gre wystarczy wpisac -1\n";

    do {
    srand(time(NULL));
    randomNumber = rand()%100+1;

        std::cin >> userAnswer;

        numberOfTries ++;

        if (userAnswer == randomNumber) {
            std::cout << "Brawo!\n";
            std::cout << "Ogolna liczba prob: " << numberOfTries << "\n";
            std::cout << "Masz " << points << "punktow";
        } else if (userAnswer < randomNumber) {
            std::cout << "Liczba jest za mala!\n";
        } else if (userAnswer > randomNumber) {
            std::cout << "Liczba jest za duza!\n";
        }

} while(userAnswer != -1);

return 0;
}

Czemu nie powatarza sie losowanie liczby u Ciebie? Bo nie wracasz do poczatku petli, to znaczy robisz to gdy, liczba nie zostala odgadnieta, ale gdy user ja odgadnie prosisz o wpisanie tak lub nie dla dalszej gry, po czym uruchamiasz kolejna petle.

for(x=1; x>=1; x++)
              {
              cin >> z;
              if(z>y)
              {
                    cout << "Liczba jest za duza!" << endl;
              }
              if(z==y)
              {
                    cout << "Brawo!" << endl;
                    cout << "Grasz dalej (wpisz tak lub nie)?" << endl;
                    cin >> odpowiedz;
              }
              if(z<y)
              {
                    cout << "Liczba jest za mala!" << endl;
              }
              }

Po co jest tutaj ta petla? Zrobiles ifa, sprawdziles czy liczba jest wieksza lub mniejszai pozniej urochamiasz petle, to jest bez sensu. Co to za warunek, x wieksze lub rowne 1, a inicjalizujesz x jako jeden odrazu

3. Zacznij nazywac zmienne

4. Slyszales o czyms takim jak TAB lub 4 Spacje? Bo ten kod nie czyta sie fajnie i przyjemnie

5. Do while to petla, wiec przy pomocy petli

1
komentarz 21 stycznia 2019 przez niezalogowany
Kod z punktu 2: Czemu na zgadnięcie wylosowanej liczby jest tylko jedna szansa (następnie losowana jest kolejna)?
komentarz 21 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
@Hipcio,

bo to jest level hard :D, tylko najlepsi potrzebuja jednej proby :P. A serio, to nie wiem, zaimplementowalem to tak, zawsze mozna to zmienic, zeby nastepna liczba byla losowana dopiero gdy user odgadl poprzednia
komentarz 5 lutego 2019 przez Specjalny Nowicjusz (230 p.)

Własnie chodziło mi o to by po odgadnięciu losowana była nastepna liczba. Wariant z losowaniem z kazdym zgadnięciem nowej liczby i wariant gdzie liczba losuje się tylko raz potrafię zrobić. Cały problem tkwi w tym by kolejna liczba losowała się co zgadnięcie. Także średnio mi pomogłeś bo ten mój kod lepiej działał od twojego XD

komentarz 6 lutego 2019 przez DragonCoder Nałogowiec (36,500 p.)
1. Pokaz mi gdzie napisales, ze ma losowac tylko przy zgadnieciu

2. Nie musisz uzywac pogrubonej czcionki

3. Znajac warunek if(), rozwiazesz ten problem w 5 sekund, wiec nie wiem czy to az tak duzy problem
komentarz 13 lutego 2019 przez Specjalny Nowicjusz (230 p.)
1. Jak znasz konkretną dziedzinę to problem z tej konkretnej dziedziny zawsze możesz rozwiązać w 5 sekund ale jak wspomniałem jestem POCZĄTKUJĄCYM i nie wiem czy musze ci to bardziej tłumaczyć.

2.Mogę używać pogrubioną czcionkę choć co prawda użyłem ją przypadkiem ale specialnie dla ciebie ją zostawie.

3. NIE WIEM CZY NAPRAWDĘ MUSZĘ TO TŁUMACZYĆ ALE TAKA GRA DO JAKIEJ TY KOD NAPISAŁEŚ RACZEJ SENSU BY NIE MIAŁA
komentarz 14 lutego 2019 przez DragonCoder Nałogowiec (36,500 p.)
int main ()
{
int randomNumber = 0;
int userAnswer = 0;
int points = 0;
int numberOfTries = 0;

srand(time(NULL));

    std::cout << "Zagraj w gre. Program wygeneruje losowa liczbe wieksza od 0, z przedzialu 1-100 a ty zgadnij jaka.\n";
    std::cout << "Zeby zakonczyc gre wystarczy wpisac -1\n";

    randomNumber = rand()%100+1;
    do {
        std::cin >> userAnswer;

        numberOfTries ++;

        if (userAnswer == randomNumber) {
            std::cout << "Brawo!\n";
            std::cout << "Ogolna liczba prob: " << numberOfTries << "\n";
            std::cout << "Masz " << points << "punktow";
            randomNumber = rand()%100+1;
        } else if (userAnswer < randomNumber) {
            std::cout << "Liczba jest za mala!\n";
        } else if (userAnswer > randomNumber) {
            std::cout << "Liczba jest za duza!\n";
        }

} while(userAnswer != -1);

return 0;
}

Losuje nastepna, tylko gdy poprzednia byla prawidlowa

Podobne pytania

0 głosów
2 odpowiedzi 322 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez seniu92 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 462 wizyt
0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 20 października 2018 w C i C++ przez periedynek Obywatel (1,320 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

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

...