Wisielec C++
: 30 sty 2014, 22:40
Witam. Nie jestem jakimś orłem w programowaniu, więc różnie mi to idzie. Ostatnio w szkole zadano nam napisanie gry w C++. Do wyboru było kilka między innymi poczciwy wisielec
Jednak pojawiło się kilka problemów. Otóż nie wiem z jakiego powodu program się zapętla, w jednym miejscu (prawdopodobnie złe zliczanie zmiennych bądź zły warunek w pętli), oraz nie wiem z jakiego powodu dodaje dodatkowy znak '_'. Jeśli znalazłby się na forum ktoś kto potrafiłby to naprawić, i wytłumaczyć mi gdzie zrobiłem błąd, byłbym bardzo wdzięczny. W kodzie zamieściłem komentarze, aby był chociaż trochę bardziej czytelny
Poza tym pozostaje zrobienie menu ale to już łatwo da się zrobić na switchu.
P.S
Ma ktoś jakiś pomysł rysowania szubienicy?


Kod: Zaznacz cały
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <string.h>
using namespace std;
string slowo, podawane; // 1. słowo z pliku 2. to które będziemy podawać
void kategoria()
{
int help=0, ktore=1; // 2 zmienne pomocnicze
char a; // zmienna do menu
cout<<"Wybierz kategorie:"<<endl<<"1 - INFORMATYKA"<<endl<<"2 - ZWIERZETA"<<endl<<"3 - ROSLINY"<<endl<<"4 - ZIMA"<<endl<<"5 - LATO"<<endl<<"6 - INNE"<<endl<<"(Jesli nie otrzymasz potwierdzenia wybierz jeszcze raz)"<<endl<<"Wybieram kategorie: "<<endl;
switch(a=getchar())
{
case '1':
cout<<"Wybrales kategorie: INFORMATYKA"<<endl;
ktore=1;
break;
case '2':
cout<<"Wybrales kategorie: ZWIERZETA"<<endl;
ktore=2;
break;
case '3':
cout<<"Wybrales kategorie: ROSLINY"<<endl;
ktore=3;
break;
case '4':
cout<<"Wybrales kategorie: ZIMA"<<endl;
ktore=4;
break;
case '5':
cout<<"Wybrales kategorie: LATO"<<endl;
ktore=5;
break;
case '6':
cout<<"Wybrałes kategorie: INNE"<<endl;
ktore=6;
break;
default:
help++;
break;
}
if(help==1) {
system("clear");
kategoria();
}
int p; // potem do przerywania czytania wyrazu z pliku losowana przez komputer
if(ktore==1) { ifstream wej("informatyka"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
}
}
if(ktore==2) { ifstream wej("zwierzeta"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
}}
if(ktore==3) { ifstream wej("rosliny"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
} }
if(ktore==4) { ifstream wej("zima"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
}}
if(ktore==5) { ifstream wej("lato"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
} }
if(ktore==6) { ifstream wej("inne"); {while(!wej.eof())
{
wej>>slowo;
p=(int)rand()%3;
if(p==1) break;
}
}}
cout<<slowo<<endl; // dla sprawdzenia poprawnosci przeczytania przez program
}
void pregame()
{
int b=slowo.size();
podawane.clear(); // czyszczenie zawsze bezpieczniej i pewniej
for(int i=0; i<b; i++) podawane=podawane+'_'; // podstawienie pod nieznane litery znaku '_'
}
void game()
{
int kri; // zmienna zliczająca chybienia
char znak; // znak podawany
int b=slowo.size(); // długość słowa juz raz wystąpila ale nie chce zmieniac zeby sie nie pomylic
while(kri!=6) // warunek dalszej gry
{
cout<<podawane<<endl; // nasz wyraz zastapiony znakami '_'
cout<<"Podaj znak"<<endl;
znak=getchar();
if(slowo.find(znak)==0) { kri++; continue; } // jesli znak nie wystepuje zwiększamy zmienną porażki
for(int i=0; i<b; i++) // petla podstawiajaca trafione litery do naszego stringa
{
if(slowo[i]==znak) podawane[i]=znak;
}
system("clear");
}
if(kri==6) cout<<"PRZEGRALES"<<endl;
}
int main()
{
srand(time(NULL));
// tu bedzie while - menu glowne
kategoria();
pregame();
game();
return 0;
}
P.S
Ma ktoś jakiś pomysł rysowania szubienicy?