Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++]Zgadywanka, Mały Zgrzyt :/


Rekomendowane odpowiedzi

Opublikowano

Mam problem

Oto oryginalny kod zgadywanki:

// While - druga pętla warunkowa



#include <iostream>

#include <ctime>

#include <conio.h>



void main()

{

  // wylosowanie liczby

  srand ((int) time(NULL));

  int nWylosowana = rand() % 100 + 1;

  std::cout << "Wylosowano liczbe z przedzialu 1-100." << std::endl;



  // pierwsza próba odgadnięcia liczby

  int nWprowadzona;

  std::cout << "Sprobuj ja odgadnac: ";

  std::cin >> nWprowadzona;



  // kolejne próby, aż do skutku - przy użyciu pętli while

  while (nWprowadzona != nWylosowana)

  {

        if (nWprowadzona < nWylosowana)

              std::cout << "Liczba jest zbyt mala.";

        else

              std::cout << "Za duza liczba.";



        std::cout << " Sprobuj jeszcze raz: ";

        std::cin >> nWprowadzona;

  }



  std::cout << "Celny strzal  Brawo!" << std::endl;

  getch();

}

 

No i po przeczytaniu 3 lekcji sam z siebie chcę jeszcze na samym początku dodać takie zapytanie czy ktoś w ogóle chce grać

Oto co mi wyszło:

// Zgadywanka v2 by czapla112



#include <string>

#include <iostream>

#include <ctime>

#include <conio.h>



void main()

{
std::string Odpowiedz;



  std::cout << "Czy chcesz zagrac? (TAK/NIE): ";

  std::cin >> Odpowiedz;

  const std::string TAK = "TAK";
  const std::string NIE = "NIE";



  if (Odpowiedz != TAK)
  {

  // wylosowanie liczby

  srand ((int) time(NULL));

  int nWylosowana = rand() % 10 + 1;

  std::cout << "Wylosowano liczbe z przedzialu 1-10." << std::endl;



  // pierwsza próba odgadnięcia liczby

  int nWprowadzona;

  std::cout << "Sprobuj ja odgadnac: ";

  std::cin >> nWprowadzona;



  // kolejne próby, aż do skutku - przy użyciu pętli while

  while (nWprowadzona != nWylosowana)

  {

        if (nWprowadzona < nWylosowana)

              std::cout << "Liczba jest zbyt mala.";

        else

              std::cout << "Za duza liczba.";



        std::cout << " Sprobuj jeszcze raz: ";

        std::cin >> nWprowadzona;

  }



  std::cout << "Celny strzal  Brawo!" << std::endl;
  getch();
  }
  if (Odpowiedz != NIE)
  {
      std::cout << "Nie to nie!" << std::endl;
	  getch();
  }
  else
  {
   std::cout << "Coś poszlo nie tak." << std::endl;
   std::cout << "Nie pisz malymi lub naucz sie pisac TAK i NIE!" << std::endl;
   std::cout << "Aplikacja zostanie Zamknieta." << std::endl;
  }
  getch();
}

 

Pewnie dla was wygląda to tragicznie ale ja się jeszcze uczę

 

 

Więc problem jest taki, że gdy wpiszę TAK to traktuje mnie jak NIE, jak wpiszę NIE to traktuje mnie jak TAK i jak wpiszę co bądź to traktuje mnie jako TAK

Nie mam zielonego pojęcia co robię nie tak, Chyba jeszcze nie załapałem tutaj tego if

 

Proszę o odpowiedzi dopiero po 20.00 ponieważ czuję, że jestem blisko i może jakoś to rozgryzę.

 

 

Atak właściwie to ile tego co tam na bazgroliłem nadaje się do kosza? I w ogóle czy ja tam coś dobrze zrobiłem???

 

Pozdrawia :)

Opublikowano

udało się, zrobiłem to tak:

// Zgadywanka v2 by czapla112



#include <string>

#include <iostream>

#include <ctime>

#include <conio.h>



void main()

{
std::string Odpowiedz;



  std::cout << "Czy chcesz zagrac? (TAK/NIE): ";

  std::cin >> Odpowiedz;

  const std::string TAK = "TAK";
  const std::string NIE = "NIE";



  if (Odpowiedz == TAK)
  {

  // wylosowanie liczby

  srand ((int) time(NULL));

  int nWylosowana = rand() % 10 + 1;

  std::cout << "Wylosowano liczbe z przedzialu 1-10." << std::endl;



  // pierwsza próba odgadnięcia liczby

  int nWprowadzona;

  std::cout << "Sprobuj ja odgadnac: ";

  std::cin >> nWprowadzona;



  // kolejne próby, aż do skutku - przy użyciu pętli while

  while (nWprowadzona != nWylosowana)

  {

        if (nWprowadzona < nWylosowana)

              std::cout << "Liczba jest zbyt mala.";

        else

              std::cout << "Za duza liczba.";



        std::cout << " Sprobuj jeszcze raz: ";

        std::cin >> nWprowadzona;

  }



  std::cout << "Celny strzal  Brawo!" << std::endl;
  getch();
  }
  else
  {
  if (Odpowiedz == NIE)
  {
      std::cout << "Nie to nie!" << std::endl;
	  getch();
  }
  else
  {
   std::cout << "Cos poszlo nie tak." << std::endl;
   std::cout << "Nie pisz malymi lub naucz sie pisac TAK i NIE!" << std::endl;
   std::cout << "Aplikacja zostanie Zamknieta." << std::endl;
  }
  }
  getch();
}

 

 

A teraz powiedzcie mi jak uchronić się przed tym gdy ktoś już przy podawaniu tej cyfry - nie podał litery? Nie wiem zablokować czy zwrócić jakiś komunikat bo chyba jest jakiś miliard razy krótszy sposób niż blokowanie if-em i else każdego znaku z klawiatury - bo aktualnie tylko to mi do tej pustej mózgownicy przyszło :(

Opublikowano

Funkcją isdigit możesz zbadać, czy podany znak jest cyfrą. W zakresie, który obsługuje Twój program jest dwucyfrowa liczba, więc musisz pamiętać, że to już dwa znaki do sprawdzenia. Może też lepiej gdybyś wczytywał te wprowadzane liczby od razu do stringa, sprawdzał czy faktycznie nimi są, a potem konwertował do int i porównywał.

Opublikowano

Możesz to również tak zrobić:

unsigned short int numerek;

    std::cout << "\nWpisz numerek danej osoby z klasy:\n";

while (!(std::cin >> numerek)) {

          //Błąd! Wyczyść cin i spróbuj ponownie
          std::cin.clear();
          std::cin.ignore(100, '\n');
          std::cout << "\nProsze podac prawidlowy numer:"
          "\n";
    }

 

Co sprawi że program nie odpuści dopóki nie podasz na wejściu danych typu unsigned int.

Dodatkowo polecam dodanie na początku programu kod:

using namespace std;

 

Co sprawi że nie będziesz musiał wpisywać std::cout, zamiast tego wystarczy wpisywać po prostu cout, cin, string etc.

Chcesz zarobić na własnym cheacie/bocie? Pisz na PM

Cracking, analiza programu/strony, boty (także web), cheaty

kwoh2cmd.png

Opublikowano

na razie spróbuję tego "isdigit" i w ogóle napiszę wszystko jeszcze raz ale i wprowadzę parę zmian bo wykułem kolejną lekcję i jak wszystko ładnie pójdzie to ... właśnie, gdzie znajduje się ten mój plik .exe i co zrobić, żeby ktoś inny mógł przetestować - wystarczy spakować do .rar lub .zip tylko ten .exe czy jak to tam jest powiedzcie mi. Ja używam Microsoft Visual Studio 2010 Express

Opublikowano

twój plik exe znajduje się tam gdzie go zapisałeś tzn.: Gdy tworzysz nowy projekt to pod tym gdzie wpisujesz nazwe pliku wybierasz folder gdzie zapisać dany projekt... w folderze z projektem poszukaj i znajdziesz plik exe:)

żeby ktoś inny mógł go przetestować wystarczy wysłać sam plik exe:)

eh...

Opublikowano

Tylko nie zapomnij we właściwościach projektu zmienić z "Debug" na "Release" bo inaczej nikt tego nie odpali o.O

Opublikowano

napotkałem kolejną łamigłówkę a mianowicie co zastosować żeby za każdym razem gdy się pomylimy to losowało inną liczbę oraz żeby gra się nie kończyła na podaniu poprawnej odpowiedzi tylko przenosiło nas do menu, które zrobiłem ze switch ewentualnie, żeby resetowało gierkę do punktu wyjścia. Potem planuję jeszcze jakoś wykombinować -1ptk za złą ii +1ptk za dobrą odpowiedź więc taki całkowity restart czyszczący wszystko nie wchodzi w grę raczej ale o tym potem.

 

to jak by na razie było na tyle.

 

a i pod żadnym pozorem nie chcę gotowych kodów!

napiszcie w miarę czytelnie jak byście to zrobili a ja już chcę sam się męczyć w przelewanie tego na kod.

 

rozumiemy się? ;P

 

pozdrawiam i dziękuję wszystkim za dotychczasową pomoc i jednocześnie liczę na dalszą :)

Opublikowano

zawrzyj to w funkcje a potem się do niej odwołaj

 

main

dada

 

 

dada

twoj kod

koniec gry zgadles

dada

 

 

 

uzywaj spoilerów

Opublikowano

Żeby resetowało gierke, wystarczy dodać na końcu programu wywołanie funkcji main();

Polecam wszystkie definicje zmiennych i stałych postawić przed funkcją main a nie w niej, program nie potrzebnie będzie za każdym restartem je od nowa ładował, a tak załaduje tylko raz przy inicjacji.

Na Twoim miejscu również bym zrobił jedną zmienną np. WyborOdp zamiast dwóch TAK i NIE, bo to też zbędnie zajmuje RAM :)

Również używanie endl; jest zbędne, zamiast tego można po prostu używać \n

A żeby ponownie wylosowało liczbe wystarczy wywołać nWylosowana = rand() % 10 + 1;

Chcesz zarobić na własnym cheacie/bocie? Pisz na PM

Cracking, analiza programu/strony, boty (także web), cheaty

kwoh2cmd.png

Opublikowano

Z twojej wypowiedzi nie dowiedziałem się niczego czego bym jeszcze nie wiedział a poza tym już pisałem, ze zamiast tego tak i nie zrobiłem menu z 3 opcjami stosując switch

Opublikowano

po 1 to gdzie się podziała opcja edytowania posta???

 

 

po 2 mam takie teoretyczne pytanko, że gdy do "int nWprowadzona;" wprowadzę a to ten "isdigit" pomoże? czy tak jak już ktoś wspomniał najpierw do stringa potem sprawdzić i konwertować?

jeżeli jednak wciągać najpierw do stringa to mi jakoś to nie wychodzi, mam "using namespace std;" więc "string nWprowadzona;" nie wystarczy czy jak bo mi errora wywala jak tak dam z resztą "std::string nWprowadzona;" też takiego samego.

 

może chcecie zobaczyć to co tam natworzyłem to może będzie wam lepiej mi pomóc?

Opublikowano

Jeśli nWprowadzona to liczba 1 cyfrowa to nie musisz konwertować na string. Kod możesz zawsze pokazać, ale daj na spoiler ;)

 

...

if( isdigit(nWprowadzona) )
{ 
  //tutaj wiemy że na pewno nWprowadzona to cyfra 
}

 

Trochę tam zagmatwałeś w tłumaczniu.. o.O

Opublikowano

na chwilę obecną kod wygląda tak:

 

// Zgadywanka v3 by czapla112

// 28.08.2010

 

#include <string>

#include <iostream>

#include <ctime>

#include <conio.h>

 

using namespace std;

 

int menu;

int nWprowadzona;

int nWylosowana;

 

void LosujLiczbe()

{

srand ((int) time(NULL));

nWylosowana = rand() % 10 + 1;

cout << "Wylosowano liczbe z przedzialu 1-10.\n";

}

 

void Zgadywanie()

{

cout << "Sprobuj ja odgadnac: ";

cin >> nWprowadzona;

if( isdigit(nWprowadzona) )

{

while (nWprowadzona != nWylosowana)

{

if (nWprowadzona < nWylosowana)

cout << "Liczba jest zbyt mala.";

else

cout << "Za duza liczba.";

cout << " Sprobuj jeszcze raz: ";

cin >> nWprowadzona;

}

cout << "Celny strzal :) Brawo!\n";

}

getch();

}

 

void main()

{

cout << "Menu: \n";

cout << "1 - Graj \n";

cout << "2 - Pomoc \n";

cout << "3 - Koniec \n";

cout << "Jaka opcje wybierasz?: ";

cin >> menu;

 

switch(menu)

{

case 1 :

cout << "Wybrano " << menu << " wiec zaczynajmy!\n";

LosujLiczbe();

Zgadywanie();

cout << "\n \n \n";

main();

break;

case 2 :

cout << "Wybrano " << menu << " czyli pomoc.\n";

cout << "Zasady mini gry sa bardzo proste. \n";

cout << "Komputer losuje nam liczbe za przedzialu od 1 do 10. \n";

cout << "Naszym zadaniem jest zgadnac jaka to liczba. \n";

cout << "Po kazdej nieudanej probie liczba sie zmienia. \n";

cout << "Powodzenia! \n";

cout << "\n \n Wcisnij dowolny klawisz aby wrocic.\n";

getch();

main();

break;

case 3 :

cout << "Wybrano " << menu << "\n";

cout << "Do zobaczenia! \n";

break;

default :

cout << "Wybrano " << menu << "\n";

cout << "Przykro mi ale nie ma takiej opcji. \n";

cout << "Dozwolone opcje to: \n";

cout << "Graj - cyfra 1, \n";

cout << "Pomoc - cyfra 2, \n";

cout << "Oraz Koniec - cyfra 3. \n";

cout << "\n \n Wcisnij dowolny klawisz aby wrocic.\n";

getch();

main();

break;

}

getch();

}

 

 

i nie działa za rewelacyjnie ponieważ czy wpiszę liczbę czy też nie pomija

 

while (nWprowadzona != nWylosowana)

{

if (nWprowadzona < nWylosowana)

cout << "Liczba jest zbyt mala.";

else

cout << "Za duza liczba.";

cout << " Sprobuj jeszcze raz: ";

cin >> nWprowadzona;

}

cout << "Celny strzal :) Brawo!\n";

 

 

a tak właściwie to ile z tego jest w miarę OK?

 

Niestety ja nie jestem dobry w wyrażaniu o co mi chodzi w jakiś prosty sposób a poza tym bardzo często piszę szybko to co mi na myśl przyjdzie i im moja wypowiedź dłuższa tym jest gorzej. Ale na przyszłość obiecuję spróbować pisać wolniej no bo jakoś jak pisałem w autoit to w zasadzie nigdy nie miałem problemu, że się na czymś zaciąłem (wyjątkiem były sytuacje jak nie znałem kodów na na szukanie pixela itp) a tutaj podaliście mi gotowe a jak widać nawet gotowca nie potrafię wmontować :(

Ale się nie poddam do puki nie zrobię tego co założyłem na początku, że z niej zrobię :D

 

 

a i dręczy mnie jeszcze jak zrobić to żeby za każdym razem losowało inną liczbę i chyba rozbiję Zgadywanie() na mniejsze funkcje lub w całości pokombinuję

Opublikowano

fajniej by było gdyby funkcja LosujLiczbe zwracała liczbę :)

sprawdzanie isdigit powinno być w pętli bo tak to sprawdzasz tylko za pierwszym wprowadzeniem :

 

void Zgadywanie()
{
cout << "Sprobuj ja odgadnac: ";

while (nWprowadzona != nWylosowana)
{
cin >> nWprowadzona;
if( isdigit(nWprowadzona) )
{
if (nWprowadzona < nWylosowana)
cout << "Liczba jest zbyt mala.";
else
cout << "Za duza liczba.";
cout << " Sprobuj jeszcze raz: ";
}
else cout << "prosze wpisac liczbe..\n";

}
cout << "Celny strzal  Brawo!\n";

getch();
}

Opublikowano

fajniej by było gdyby funkcja LosujLiczbe zwracała liczbę :)

sprawdzanie isdigit powinno być w pętli bo tak to sprawdzasz tylko za pierwszym wprowadzeniem :

 

void Zgadywanie()
{
cout << "Sprobuj ja odgadnac: ";

while (nWprowadzona != nWylosowana)
{
cin >> nWprowadzona;
if( isdigit(nWprowadzona) )
{
if (nWprowadzona < nWylosowana)
cout << "Liczba jest zbyt mala.";
else
cout << "Za duza liczba.";
cout << " Sprobuj jeszcze raz: ";
}
else cout << "prosze wpisac liczbe..\n";

}
cout << "Celny strzal  Brawo!\n";

getch();
}

 

Przykro mi ale to nie działa. Jak wpiszę liczbę to prosie o wpisanie liczby (wyszedł absurd) a gdy wpiszę jakąś literę to się zachowuje logicznie tylko w tym problem, że prosi o wpisanie cyfry (no niby normalne) n razy i w ogóle końca nie widać.

 

próbowałem też to void sprzed LosujLiczbe() wywalić ale oto co mi kompilator wywala

c:\documents and settings\sebastian\moje dokumenty\visual studio 2010\projects\zgadywanka\zgadywanka\main.cpp(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\documents and settings\sebastian\moje dokumenty\visual studio 2010\projects\zgadywanka\zgadywanka\main.cpp(20): warning C4508: 'LosujLiczbe' : function should return a value; 'void' return type assumed

ja się tam za bardzo na tym nie znam więc co zrobić? ( tymczasem powrócę jeszcze do lekcji o funkcjach :D )

Opublikowano

te sprawdzanie czy wprowadzona dana to liczba może na razie zostaw.. Jak bardzo tego potrzebujesz to zaproponuję inny sposób ale nie wiem czy też nie zapętli..

łap trochę ciekawszy kod xD

 

 

http://wklej.org/id/382886/

Opublikowano

Potrzeba tu moda.do tego spamu..

róbowałem też to void sprzed LosujLiczbe() wywalić ale oto co mi kompilator wywala

 

No to na pewno nie jest mądry pomysł..zawsze funkcje muszą mieć zdefiniowany typ i zwracaną wartość chyba że nie zwracają wartości.

 

To co już wcześniej podałem, ten kod nie jest z żadnej zewnętrznej biblioteki i na pewno działa jeśli chcesz wykryć czy wartość jest cyfrą: (w tym przypadku, również może sprawdzać np. czy wartość jest liczbą dziesiętną itp.)

unsigned short int numerek;

    std::cout << "\nWpisz numerek danej osoby z klasy:\n";

while (!(std::cin >> numerek)) {

          //Błąd! Wyczyść cin i spróbuj ponownie
          std::cin.clear();
          std::cin.ignore(100, '\n');
          std::cout << "\nProsze podac prawidlowy numer:"
          "\n";
    }

Chcesz zarobić na własnym cheacie/bocie? Pisz na PM

Cracking, analiza programu/strony, boty (także web), cheaty

kwoh2cmd.png

Opublikowano

t3ix i PsychoBoy11 wszystko ładnie śmiga (nareszcie).

 

 

Bardzo bardzo wam dziękuję za pomoc. Myślę, że na chwilę obecną projekt mogę uznać za zakończony i nie obrazicie się jeżeli dodam jeszcze jedną opcję "Współtwórcy" i was tam umieszczę? (na PW dajcie znać jakbyście mieli coś przeciwko)

 

 

Niniejszym proszę o zamkniecie tematu.

 

I jeszcze raz dziękuję :)

 

 

 

( a i objaśnijcie mi co oznacza

while (!(std::cin >> numerek))

bo jakoś ogarnąć nie mogę

u mnie to wygląda tak

while (!(cin >> nWprowadzona))

i działa to chyba dobrze zrobiłem)

Opublikowano

std jak wsczesniej nie zadeklarujesz przestrzeni nazw "using namspce std"

 

bez std ja to wstawisz "using..."

Opublikowano

while (!(cin >> nWprowadzona))
{
...
}

 

Jeśli nie podasz liczby to zostaną wykonane instrukcje w tej pętli ;)

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...