En keksinyt kunnon aihetta eli Antti saa vaihtaa jos keksii osuvamman nimen.
Eli ongelmaan, ole tehnyt numeronarvauspelin ja haluaisin tietää onko mahdollista estää toisia laittamasta kirjaimia syotteeksi, koska syöte pitäisi olla numero?
Jos siihen laittaa kirjaimen se heittää ohjelman loputtomaan silmukkaan...
Taas oli vähän epäselvää...
Syötteen jälkeen tarkistat, oliko se numero vai ei. Jos ei ollut, niin ohjelma kysyy sitä uudestaan, eh?
no miten se onnistuu? jos käytän whileä niin minun pitäisi luetella kaikki luvut tai kirjaimet...
if ((numero>max) || (numero<0)) { return 0; }
Ainakin C:n standardikirjastosta löytyy valmiit funktiot testailuun. Ne saat käyttöösi sisällyttämällä mukaan otsikkotiedoston ctype.h. http://www.cplusplus.com/reference/clibrary/
C: Onko varmasti luku?
C:n scanf-funktio palauttaa luettujen kenttien määrän, siis esimerkiksi 1, jos saatiin luettua yksi luku.
while (scanf("%d", &i) != 1) { printf("Viallinen syöte!\n"); scanf("%*s"); /* Hypätään sanan yli */ }
C++:llakin tämä onnistuu, nimittäin cin-olio (istream-luokka) säilöö tiedon tapahtuneesta virheestä. Olion muuttaminen totuusarvoksi kertoo, onko kaikki kunnossa.
if (!(cin >> i)) { cout << "Viallinen syöte!" << endl; cin.clear(); /* Poistetaan virheilmoitus */ cin >> *(auto_ptr<string>(new string())); /* Hypätään sanan yli */ }
Jos joku osaa kertoa, miten istreamista saa yhden sanan pois tallentamatta sitä minnekään mutta silti tutkimatta itse saatuja merkkejä, saa toki kertoa. Ainakaan ignore ei tähän pysty, koska rajoittimia saa asetettua vain yhden.
Edit: en huommannut,että metabolix oli laittanut vinkin, tsekkaan sen vielä...
EDIT2: Sain toimiin metabolixin vinkillä. Kiitos taas avusta.
En kyllä tiedä miten tuo auttaa minun tapauksessani...
Itse ongelma on peli() funktiossa.
Tässä on "pelin" lähdekoodi: (Voi antaa neuvvoja mistä tahansa viasta)
#include <time.h> #include <iostream> #include <string> using namespace std; ////PROTOTYYPIT int satunaisLukuGeneraattori(int maxrand); int peli(); int mainMenu(); void piirraViiva(char merkki); ////MAIN int main(int argc, char *argv[]) { mainMenu(); cin.get(); return EXIT_SUCCESS; } ////FUNKTIOT int satunaisLukuGeneraattori(int maxrand) { long int luku; srand(time(0)); luku=rand() % maxrand; //satunaisluku 0-100 return luku; } int peli() { unsigned int luku; unsigned int syote; //pelaajan syöte char merkki; //valikko... unsigned int maxrand; bool apu=true; int life=10; //10 elämää cout<<endl<<"e --> easy (0 - 25)"<<endl; cout<<"m --> medium (0 - 50)"<<endl; cout<<"h --> hard (0 - 100)"<<endl; cout<<endl<<"q --> quit"<<endl; cout<<endl; cout<<"--> "; cin>>merkki; piirraViiva('*'); switch(merkki) { case 'e': maxrand=26; break; case 'm': maxrand=51; break; case 'h': maxrand=101; break; case 'q': return 0; break; default: { cout<<"Vaara syote: "<<merkki<<" !!!"<<endl; cin.get(); return EXIT_SUCCESS; } }//Switch(merkki) luku=satunaisLukuGeneraattori(maxrand); bool pois=false; while(pois==false) { if(life<=0) { cout<<endl; cout<<"Yritykset loppuivat!"<<endl; pois=true; continue; } else if(life>0 && apu==true) { cout<<endl; cout<<"Anna luku : "; cin>>syote; cout<<endl; } apu=true; if(syote<0 || syote>maxrand-1) { cout<<endl<<"Luku on alle 0 tai yli "<<maxrand-1<<endl; cout<<"Anna uusi luku: "; cin>>syote; apu=false; piirraViiva('*'); cout<<endl; continue; } else if(syote==luku) { cout<<syote<<" on oikein"<<endl; piirraViiva('*'); cin.get(); pois=true; } else if(syote<luku) { cout<<syote<<" On liian pieni luku!"<<endl<<endl; life--; cout<<life<<" yritysta jaljella!"<<endl; cout<<endl; piirraViiva('*'); continue; } else if(syote>luku) { cout<<syote<<" On liian iso luku!"<<endl<<endl; life--; cout<<life<<" yritysta jaljella!"<<endl; cout<<endl; piirraViiva('*'); continue; } }//loppu looppi cin.get(); mainMenu(); return EXIT_SUCCESS; } int mainMenu() { char syote; piirraViiva('*'); cout<<endl<<"MAIN MENU"<<endl<<endl; cout<<"s --> start game"<<endl; cout<<"q --> quit"<<endl; cout<<endl; cout<<"--> "; cin>>syote; piirraViiva('*'); switch(syote) { case 's': peli(); break; case 'q': return EXIT_SUCCESS;break; default: { cout<<"Vaara syote!!"<<endl; cin.get(); return EXIT_SUCCESS; } } } void piirraViiva(char merkki) { cout<<endl; for(int i=0;i<80;i++) cout<<merkki; }
Nyt tuli taas ongelma. Jostain syystä pitää antaa aina arvo kahdesti...
pistän kommentit siihen kohtaan missä vika ilmenee..
int peli() { string syote; unsigned short int numSyote=0; unsigned short int maxrand=0; unsigned short int luku=0; unsigned short int lifes=10; bool pois=false; bool apu=false; cout<<endl; cout<<"e --> easy (0 - 25)"<<endl; cout<<"m --> medium (0 - 50)"<<endl; cout<<"h --> hard (0 - 100)"<<endl; cout<<endl; cout<<"q --> quit"<<endl; cout<<endl; cout<<"--> "; cin>>syote; piirraViiva('*'); switch(syote[0]) { case 'e': maxrand=26; break; case 'm': maxrand=51; break; case 'h': maxrand=101; break; case 'q': return 0; break; default: { cout<<"Vaara syote !!"<<endl; cin.get(); return EXIT_SUCCESS; } }//switch(syote[0]) luku=satunaisLukuGeneraattori(maxrand); while(!pois) //päälooppi { if(lifes<=0) { cout<<"You losed!"<<endl; pois=true; continue; } else { cout<<endl; cout<<"Type a number: "; cin>>numSyote; ///TÄSSÄ ON VIKA!!!!!!!!!!!!!!! if (!(cin >> numSyote)) { cout<<endl; cout<<"Vaara syote!!"<<endl; cin.clear(); //Poistetaan virheilmoitus cin >> *(auto_ptr<string>(new string())); //Hypätään sanan yli continue; }//if(!numSyote) if(numSyote>maxrand-1) { cout<<"Syotteesi pitaa olla valilta 0 - "<<maxrand-1<<endl; continue; } else if(numSyote==luku) { cout<<"You're Winner!"<<endl; pois=true; continue; } else if(numSyote>luku) { cout<<endl; cout<<"Too BIG!!"<<endl; lifes--; cout<<lifes<<" Tries left!"<<endl; continue; } else if(numSyote<luku) { cout<<endl; cout<<"Too SMALL!!"<<endl; lifes--; cout<<lifes<<" Tries left!"<<endl; continue; } else { cout<<"Unknown problem!!!"<<endl; pois=true; } }//else lifes<=0 }//Looppi cin.get(); mainMenu(); }
vehkis91 kirjoitti:
Nyt tuli taas ongelma. Jostain syystä pitää antaa aina arvo kahdesti...
cin>>numSyote; ///TÄSSÄ ON VIKA!!!!!!!!!!!!!!! if (!(cin >> numSyote)) { ... }
Luet syötteen kahteen kertaan, etkä tee välissä sillä mitään?
oho. Olipas huolimatonta...
Aihe on jo aika vanha, joten et voi enää vastata siihen.