Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 16 Pseudolosowe liczby całkowite

Ostatnio zmodyfikowano 2012-01-16 17:29
Autor Wiadomość
darvd29
Temat założony przez niniejszego użytkownika
Lekcja 16 Pseudolosowe liczby całkowite
» 2012-01-15 20:37:29
Siema. Mam problem z tą lekcją. Otóż zadaniem w tej lekcji jest zrobienie gry liczbowej (autor czyta mi w myśli, już 2 raz każe zrobić to co ja chciałem bez jego zadania :D). Zrobiłem coś takiego, ale po wprowadzeniu 1 liczby program się wyłącza... Tzn. zapętlenie się zepsuło :) Nie wiem też jak "Zabezpieczyć grę przed wprowadzaniem nieprawidłowych informacji".
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int proba;
    srand( time( NULL ) );
    int wylosowana =( rand() % 10 );
    std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 1 do 10." << std::endl;
    do
    {
        std::cout << "Podaj liczbe: \t";
        std::cin >> proba;
        if( proba > wylosowana )
        {
            std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl;
        }
        if( proba < wylosowana )
        {
            std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl;
        }
        if( proba == wylosowana )
        {
            std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl;
        }
    } while( proba == wylosowana );
   
    system( "PAUSE" );
    return 0;
}

Próbowałem też "na logikę", bo nie było o tym mowy, zrobić ograniczoną liczbę szans, powiedzmy 5. Zrobiłem to tak:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int szansa = 6; to od ilosci szans
    int proba;
    srand( time( NULL ) );
    int wylosowana =( rand() % 10 );
    std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 0 do 10. Masz 5 szans." << std::endl;
    do
    {
        std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t"; tu powinno mowic ile szans zostalo i wyliczac to: )
        std::cin >> proba;
        if( proba > wylosowana )
        {
            std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; warunek 1
        }
        if( proba < wylosowana )
        {
            std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; warunek 2
        }
        if( proba == wylosowana )
        {
            std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; warunek 3
        }
        if( szansa == 0 )
        {
            std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl; warunek 4
        }
    } while( szansa == 0, proba == wylosowana ); tutaj dalem 2 rzeczy do nawiasu bo chcialem zrobic ze jesli jeden z tych warunkow jest spelniony to koniec zapetlenia.Ale pewnie przekombinowalem: P
   
    system( "PAUSE" );
    return 0;
}

W tym drugim kodzie jest wiele rzeczy jak mówiłem "na logikę", gdyż ich nie było jeszcze w kursie. Moje pytanie - Jestem blisko rozwiązania czy to już całkiem trudniejszy poziom i będzie to za 15 lekcji :)? Ogólnie program jest chyba ok, ale po 1 ilość szans jest ciągle taka sama (chyba wiem czemu), po 2 zapętlenie także nie działa bo wpisałem 2 warunki czy co to tam jest :), a po 3 nawet jak się wygra to zapętlenie jest dalej.  (Tak dokładniej to pkt.3 był a pkt.2 nie było zanim zacząłem kombinować z while i wpisywać 2 argumenty, bo przedtem było chyba while (szansa==0) ale jak pisałem ilość szans jest ciągle taka sama i program się nie kończy, tak samo jak jest while (proba==wylosowana))


Na koniec: wiem że trochę skomplikowałem sprawę, ale jeśli jacyś pomocni userzy są cierpliwi do takich noobów jak ja to proszę o pomoc :D
P-48332
Dark
» 2012-01-15 21:23:12
nie powinieneś czasem używać w warunkach znaków logicznych na przykład
C/C++
while( zmienna1 == x && zmienna2 == y ) // znak logiczny musi być spełniony warunek 1 i 2 [/cpp]

@down mały błędzik
P-48335
SeaMonster131
» 2012-01-15 21:29:59
@up:
= to operator przypisania, == to operator porównania :p
P-48338
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-16 07:45:29
Czyli jak? Ma być:
while (szansa = 0, proba = wylosowana )
Czy jak?

PS. Wracam do kursu bo nie wiem co to operator przypisania xD

EDIT.
Ok już wiem jaki błąd popełniłem :D Znowu napisałem:

while (coś==coś) a powinno być
while (coś!=coś) :D

EDIT2.
Ale nadal nie wiem jak naprawić te szanse... jak zrobić żeby określić początkowo tak jak mam:
int szansa = 6
i zrobić żeby po każdym zapętleniu odejmowała się 1, czyli tak jak mam:
std::cout << "Pozostalo prob:" << szansa - 1
Ale wtedy ciągle jest "Pozostało prob: 5" a chcę żeby to się ciągle zmniejszało, tzn. najpierw 5, potem 4, 3, 2, 1 i przegrana. Czyli chcę zrobić żeby "int szansa" cały czas zmieniało swoją wartość. Jak to wykonać?
P-48356
SeaMonster131
» 2012-01-16 15:00:58
Po podaniu liczby, daj szansa--, co jest równoznaczne z
szansa = szansa - 1;
.
P-48371
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-16 16:12:07
OK, dzięki, działa. Niestety, nie wszystko. Po 1 kompilator uważa "Pozostało szans: 0" jako ostatnią szansę i nie wyświetla komunikatu o przegranej, a ostatnią szansą ma być "Pozostało szans: 1". Po 2. nawet kiedy się przegra gra się nie kończy, wyświetla się tylko komunikat, a szansa to -1,-2,-3 itd. Oto kod:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int proba, wybor;
    int szansa = 6;
    int a;
    do
    {
        srand( time( NULL ) );
        int wylosowana =( rand() % 10 );
        std::cout << "Witaj w grze liczbowej. Wybierz opcje:" << std::endl << "[1] Zasady" << std::endl << "[2] Graj" << std::endl << "[3] Wylacz" << std::endl;
        std::cin >> wybor;
        switch( wybor )
        {
        case 1:
            {
                std::cout << "1. Komputer losuje liczbe z zakresu od 0 do 10. Ty musisz ja zgadnac." << std::endl;
                std::cout << "2. Masz 5 szans. Jesli nie zgadniesz - przegrywasz." << std::endl;
                std::cout << "3. Nie wpisuj liczb innych niz z zakresu podanego wyzej, bo gra sie scrashuje." << std::endl;
                std::cout << "Wpisz 1 aby rozpoczac gre: \t";
                std::cin >> a;
                std::cout << std::endl << std::endl;
            }
        case 2:
            {
                do
                {
                    std::cout << std::endl << "Pozostalo szans: " << szansa - 1 << std::endl << "Podaj liczbe: \t";
                    std::cin >> proba;
                    szansa = szansa - 1;
                    if( proba > wylosowana )
                    {
                        std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl << std::endl;
                    }
                    if( proba < wylosowana )
                    {
                        std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl << std::endl;
                    }
                    if( proba == wylosowana )
                    {
                        std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl << std::endl;
                    }
                    if( szansa < 1 )
                    {
                        std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl << std::endl;
                    }
                } while( szansa != 0, proba != wylosowana );
               
            }
        }
    } while( wybor != 3 );
   
    if( wybor == 3 )
    {
        std::cout << "Zapraszam ponownie! Autor: Dawid \"darvd29\" Data" << std::endl << std::endl;
    }
   
   
    system( "PAUSE" );
    return 0;
}

A oto przykładowe działanie programu:

Menu główne itp.
...
Pozostalo szans: 1
Podaj liczbe: 10
Wylosowana liczba jest mniejsza od: 10

(PS. Już tutaj powinien być komunikat informujący o przegranej)

Pozostalo szans: 0
Podaj liczbe: 10
Wylosowana liczba jest mniejsza od: 10

Niestety przegrales. Sprobuj jeszcze raz.

Pozostalo szans: -1
Podaj liczbe: 10
Wylosowana liczba jest mniejsza od 10.

Niestety przegrales. Sprobuj jeszcze raz.

EDIT. OK, problem z ostatnią szansą już naprawiłem. Po prostu musi być
C/C++
if( szansa < 2 )
{
    std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl << std::endl;
}
Przedtem było if (szansa < 2). Teraz jest dobrze z ostatnią szansą, ale nadal mam problem z niezakańczaniem pętli, dalej jest -1, -2, -3 i można zgadywac.
P-48384
BoBeR
» 2012-01-16 16:25:12
Musisz w warunku pętli zamiast przecinka dać &&, czyli koniunkcję.
P-48386
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-16 17:29:08
Dzięki już wszystko działa i mogę pograć w moją super gierkę ^^
P-48396
« 1 »
  Strona 1 z 1