Potrzebuję pomocy w dokończeniu banalnego programu

0

Witam, jestem świeżakiem jeśli chodzi o jakiekolwiek programowanie. Zupełnie zielony, gdyż zabawę z tym zacząłem dopiero wczoraj.

Moim zadaniem jest stworzenie programu, który zabawi się w zgadywanie liczb od 1 do 100, przy 10 możliwych próbach.
Samemu udało mi się tylko stworzyć namiastkę tego dzieła, a mianowicie moje dotychczasowe prace umożliwiają jedynie zabawę z liczbami całkowitymi (prób wdrożyć nie potrafię). W przypadku litery, program wariuje.

Mógłby ktoś mi w prosty sposób podsunąć pomysł na:
-stworzenie ilości prób (w razie wygranej napisanie po ilu próbach udało się wygrać, w razie przegranej napisanie, iż po 10 próbach nie udało się odgadnąć liczby)
-zablokowanie możliwości wpisywania liter
-zablokowanie możliwości wpisywania liczb innych niż z przedziału <1,...,100>

Mój dotychczasowy kod:

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

int main (){
	
	int szukana = 42;
	int proba;
	int proby = 0;
	proby <= 10;
	
	cout << "Wpisz liczbe od 1 do 100: ";
	

	
	while (proba = 42){
		
	cin >> proba;

	
	if (proba < 42){
		cout << "Liczba " << proba<< " to za malo, sprobuj ponownie"<< endl;
		cout << "Wpisz liczbe: ";
		continue;
	}
	
	
	if (proba > 42){
		cout << "Liczba " << proba<< " to za duzo, sprobuj ponownie" << endl;
		cout << "Wpisz liczbe: ";
		continue;
	}

	if (proba = 42){
		cout<< "Zgadles, gratuluje";
		break;
	}


}

getch ();

} 
0

stworzenie ilości prób (w razie wygranej napisanie po ilu próbach udało się wygrać, w razie przegranej napisanie, iż po 10 próbach nie udało się odgadnąć liczby)

Najpierw podziel ten kod sensownie na funkcje i sformatuj go (pętla).

zablokowanie możliwości wpisywania liter

Setki artykułów w internecie, wystarczy dosłownie to wpisać i już masz, a i tak nawet nie spróbowałeś.

zablokowanie możliwości wpisywania liczb innych niż z przedziału <1,...,100>

No przecież potrafisz korzystać z ifów.

Btw, = to jest operator przypisania, a == to operator porównania.
Btw2, proby <= 10; a to co ma robić?

0
Patryk27 napisał(a):

Najpierw podziel ten kod sensownie na funkcje.

To znaczy?

Setki artykułów w internecie, wystarczy dosłownie to wpisać i już masz, a i tak nawet nie spróbowałeś.

Dzięki, zajmę się tym na samym końcu

No przecież potrafisz korzystać z ifów.

To takie proste? Obojętne w której linijce to wstawię?

Btw, = to jest operator przypisania, a == to operator porównania.
Btw2, proby <= 10; a to co ma robić?

Ale wstyd, zupełnie o tym zapomniałem...

0

Robisz to bardzo źle.

int szukana = 42;
    int proba;
    int proby = 0;
    proby <= 10;

Ostatnia linijka z zacytowanego kodu powyżej nie ma zupełnie sensu. Jeżeli chcesz przypisać do zmiennej proby wartość 10 to użyj operatora przypisania (=).
Jeśli chcesz napisać "dopóki proby <= 10" napisz while (proby <= 10).

Dalej jest już tylko gorzej. Mylisz przypisanie = z porównaniem ==. Z tego co rozumiem chcesz wykonać algorytm, który można po krótce opisać w następujący sposób:

  1. Dopóki liczba wykonanych prób jest mniejsza od 10 idź do kroku 2, w przeciwnym razie przerwij i wypisz podsumowanie gry.
  2. Wczytaj od użytkownika liczbę do zmiennej powiedzmy x.
  3. Jeśli x < szukana wypisz co tam chcesz, analogicznie gdy x > szukana;
  4. Jeśli x == szukana przerwij pętlę wczytującą liczby i wypisz podsumowanie gry.
0
mkay napisał(a):

Dalej jest już tylko gorzej. Mylisz przypisanie = z porównaniem ==. Z tego co rozumiem chcesz wykonać algorytm, który można po krótce opisać w następujący sposób:

  1. Dopóki liczba wykonanych prób jest mniejsza od 10 idź do kroku 2, w przeciwnym razie przerwij i wypisz podsumowanie gry.
  2. Wczytaj od użytkownika liczbę do zmiennej powiedzmy x.
  3. Jeśli x < szukana wypisz co tam chcesz, analogicznie gdy x > szukana;
  4. Jeśli x == szukana przerwij pętlę wczytującą liczby i wypisz podsumowanie gry.

Coś w tym guście, ale skoro jest tak fatalnie to może zrezygnuję z samodzielnej nauki i znajdę jakiegoś mentora.

0

Myślę, że po jednym dniu nauki C++ też robiłem takie błędy, albo nawet gorsze. Nie poddawaj się ;-)

2

Gotowce są wszędzie, wystarczy je zmodyfikować do swoich potrzeb;
Źródło: http://4programmers.net/Forum/Newbie/175535-nieoczekiwane_wylaczanie_sie_programu_po_jego_wykonaniu aka http://4programmers.net/Forum/1094411

Za wiele gimnastykowania nie ma - ot, drobna poprawa jakości i podpięcie funkcjonalności:

#include <iostream>
#include <functional>
#include <string>
#include <random>
using namespace std;


template<typename T>
class Attemptor{
public:
    struct Actions{ 
        function<T()> in;
        function<bool(T)> onCheck; 
        function<void(T)> onSuccess;
        function<void(T)> onPartialFailure;
        function<void(T)> onTotalFailure;
        function<void()> onNoMoreAttemptsLeft;
    };
 
    Attemptor(Actions actions, size_t maxFailures)
        : _actions(actions), _maxFailures(maxFailures), _failures(0){}
 
    bool canAttempt() const{
        return !_success && _maxFailures > _failures;
    }
    
    bool isDone() const{
    	return _done;
    }
 
	bool success() const{
		return _success;
	}
 
    bool attempt(){
        if(!canAttempt()){
            _actions.onNoMoreAttemptsLeft();
            return false;
        };
        T in_result = _actions.in();
        if(_actions.onCheck(in_result)){
            _actions.onSuccess(in_result);
            return finishWithSuccessEq(true);
        }
        _failures += 1;
        if(canAttempt()) _actions.onPartialFailure(in_result);
        else {
        	_actions.onTotalFailure(in_result);
        	return finishWithSuccessEq(false);
        }
        	
    }
private:
	bool finishWithSuccessEq(bool val){
		_done = true;
		return _success = val;
	}
	bool _done = false;
	bool _success = false;
    const Actions _actions;
    const size_t _maxFailures;
    size_t _failures;
};

template<typename T>
auto read(istream &in = cin){
	T var;
	in >> var;
	return var;
}
 
int main() {
	size_t min = 1, max = 100, attempts = 10;
	
	default_random_engine gen(0xCafeBabe);
	uniform_int_distribution<> dist(min, max);
	
	auto number = dist(gen);
	
	using attemptor_type = Attemptor<int>;
	using actions_type = typename attemptor_type::Actions;
	
	auto attemptor = attemptor_type(
		actions_type{
			[]{ return read<int>(); },
			[number](int in){ return in == number; },
			[](int res){cout << "Success with " << res << "!" << endl;},
            [number](int res){cout << (res<number? "<":">") << endl;},
            [](int res){cout << "Total failure with " << res << "!" << endl;},
            []{cout << "No more attempts left!" << endl;}
		}, attempts
	);
	
	while(!attemptor.attempt());
	return 0;
}

Przykładowe uruchomienie:
http://ideone.com/sl7f4O
Wejście |

1               
100
10
90
20
80
30
70
40
60
50

Wyjście |

<
>
<
>
Success with 20!

1 użytkowników online, w tym zalogowanych: 0, gości: 1