Moi!
Teen yksinkertaista koodia ja olen tosiaan aloittelija.
Mun pitäisi saada bufferi tyhjennettyä tai estää se jotenkin. Eli kysyn käyttäjältä x ja y koordinaatit erikseen välilyönnillä.
cout << "Anna x(1-3) ja y(1-3) piste väilyönnillä erottaen: "; cin >> suserinput; iuserinputx = atoi(suserinput.c_str());
Jos tuohon naputtelee nyt "1 1". Toimii oikein, mutta käyttäjä voi vahingossa tai tahallaan syöttää "1 1 2 2 3 3", eli 3 kertaa noi x ja y arvon ja se tulostaa ne oikein. Mut ky tää koodi kysyy vuorotellen 2 pelaajalta noita lukuja.
Eli miten saan tuon tyhjentymään ensimmäisen 2 merkin jälkeen.
Voit ohittaa syöterivin loppuosan näin:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Tarvitset ohjelmaan limits-otsikkotiedoston, jossa std::numeric_limits sijaitsee.
Minusta ei ole järkevää käyttää atoi-funktiota, kun voi lukea suoraan luvun ja virhetilanteessa sitten tulostaa virheilmoituksen, palauttaa virran lukukelpoiseksi clear-kutsulla ja ohittaa virheellisen syötteen tällä samaisella ignore-kutsulla.
if (!(std::cin >> luku)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Virheellinen syöte!" << std::endl; }
Ei toi toimi.
Edelleen voin syöttää valmiiksi esim. "1 1 2 2", niin se tulostaa noihin 2 pisteeseen arvot
1 2 3 +---+---+---+ 1| | | | +---+---+---+ 2| | | | +---+---+---+ 2| | | | +---+---+---+
Mulla on kuvan mukainen ruudukko 3x3
Jotenka tuo mun syöte tulotaa noihin ensimmäiseen ruutuun x ja keskimmäiseen o ja sit onkin taas 1 pelaajan vuoro. Eli pystyn skippaamaan tuolla sarjalla 2 pelaajan.
Kyllä toimii.
int a, b; std::cin >> a; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin >> b; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "a = " << a << ", b = " << b << std::endl;
1 2 4 5 7 89 0 8 67 5 3 3 a = 1, b = 8
En vaan saa toimimaan... Kaveri on tehnyt loput koodista ja sentakia tarvitaan tuota atoi funkkaria... Ja sentakia tuo ei ota toimiakseen...
Voiko tuossa käyttää jotenkin jotain flush toimintaa joka lopettais kahden ensimmäisen (tai siis 3 "1 1") merkin jälkeen tuon lukemisen...
Kyllä tuo toimii, eikä liity atoi-funktioon mitenkään. Mihin ihmeen väliin olet yrittänyt lisätä tuon? Näytä nyt koko kahden luvun lukeminen.
game.boardreset(3,(rand()%2+1),(3-iplayers)); do { system("cls"); cout << endl; if (game.askturn() == 0) { cout << " GAME OVER" << endl << endl; } else { playersTurn = game.askturn(); if (game.askturn() < 0) { if (iplayers == 2) { cout << " A.I. player turn" << endl << endl; } else { cout << " Player A.I. " << abs(playersTurn) << " turn" << endl << endl; } } else { if (iplayers == 1) { cout << " Human player " << playersTurn << " turn" << endl << endl; } else { cout << " Human player turn" << endl << endl; } } } drawboard(&game,boardsize); if (game.askturn() == 0) { cout << "Game over, player " << game.askwinner() << " is WINNER!" << endl; cout << "1 restart, -1 quit game: "; cin >> suserinput; iuserinputx = atoi(suserinput.c_str()); if (iuserinputx == 1) { iplayers = 0; goto beginnin_of_game; } } else { if (!legaluserinput) { cout << "did'n understand input. " << endl; cout << "enter x ja y separated by space" << endl; } else { cout << endl; cout << endl; } cout << " Player " << abs(playersTurn) << " turn." << endl << " (x y)(-1 to quit): "; cin >> suserinput; iuserinputx = atoi(suserinput.c_str()); if (iuserinputx!=-1) { cout << "gimme y coordinate: "; cin >> suserinput; iuserinputy = atoi(suserinput.c_str()); } if((iuserinputx<1) || (iuserinputy<1) || (iuserinputx>boardsize) || (iuserinputy>boardsize) ){ legaluserinput=false; } else { legaluserinput=true; game.move(iuserinputx, iuserinputy); } } } while ((iuserinputx!=-1) && (iuserinputy!=-1));
No ei varmaan toimi, jos koodissa ei ole koko ignore-riviä. Mihin olet yrittänyt lisätä sen? Minusta näyttää, että sopisi ihan hyvin lisätä se tuossa koodissa jokaisen cin-rivin jälkeen.
do { system("cls"); cout << endl; if (game.askturn() == 0) { cout << " GAME OVER" << endl << endl; } else { playersTurn = game.askturn(); if (game.askturn() < 0) { if (iplayers == 2) { cout << " A.I. player turn" << endl << endl; } else { cout << " Player A.I. " << abs(playersTurn) << " turn" << endl << endl; } } else { if (iplayers == 1) { cout << " Human player " << playersTurn << " turn" << endl << endl; } else { cout << " Human player turn" << endl << endl; } } } drawboard(&game,boardsize); if (game.askturn() == 0) { cout << "Game over, player " << game.askwinner() << " is WINNER!" << endl; cout << "1 restart, -1 quit game: "; cin >> suserinput; iuserinputx = atoi(suserinput.c_str()); if (iuserinputx == 1) { iplayers = 0; goto beginnin_of_game; } } else { if (!legaluserinput) { cout << "did'n understand input. " << endl; cout << "enter x ja y separated by space" << endl; } else { cout << endl; cout << endl; } cout << " Player " << abs(playersTurn) << " turn." << endl << " (x y)(-1 to quit): "; cin >> suserinput; if (!(std::cin)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Virheellinen syöte!" << std::endl; } iuserinputx = atoi(suserinput.c_str()); if (iuserinputx!=-1) { cout << "gimme y coordinate: "; cin >> suserinput; iuserinputy = atoi(suserinput.c_str()); } if((iuserinputx<1) || (iuserinputy<1) || (iuserinputx>boardsize) || (iuserinputy>boardsize) ){ legaluserinput=false; } else { legaluserinput=true; game.move(iuserinputx, iuserinputy); } } } while ((iuserinputx!=-1) && (iuserinputy!=-1));
Kuten jo mainittin olen vasta aloittelija ja meidän pitäis tehdä maanantaiksi kouluun ristinolla peli ja meillä on jo kaikki luokat valmiina, muuta ei tarvita kuin tämä maini valmiiksi. Ja tää homma on jäänyt minun harteille...
Lue sitten vielä kaikki viestini uudestaan ja mieti, oletko nyt varmasti lisännyt koodiin yhden ignore-rivin aina siihen, missä haluat poistaa rivin loppuosan, vai oletko ehkä sittenkin lisännyt kokonaisen viiden rivin koodin, joka liittyi ihan toiseen asiaan, atoi-viritelmän poistamiseen.
cin.clear(); cin >> suserinput; cin.ignore(numeric_limits<streamsize>::max(), '\n');
Eli muokkasin nyt tuon pätkän noin ja sain sen toimiin sillein että vaikka syöttäisin 2 tai enemmän merkkejä se lukee vain ensimmäisen...
Eli nyt se toimii jotenkin, saisko sen mitenkään toimimaan sillein että siihen voisi syöttää 2 numeroa ja niiden väliin yhden tyhjän.
esim
1 1
tai esim
2 1
Laita siinä tapaukessa rivi vasta toisen luvun lukemisen jälkeen – eli siihen, missä haluat poistaa rivin loppuosan, kuten jo sanoin.
Kiitti avusta Metabolix...
Laitoin
// cin.clear(); cin >> suserinput; // cin.ignore(numeric_limits<streamsize>::max(), '\n'); iuserinputx = atoi(suserinput.c_str()); if (iuserinputx!=-1) { cout << " X-coordinate is: " << suserinput << endl; cout << " Give y-coordinate: "; cin.clear(); cin >> suserinput; cin.ignore(numeric_limits<streamsize>::max(), '\n'); iuserinputy = atoi(suserinput.c_str()); }
Niin nyt se tulostaa vain ne 2 ekaa numeroa...
Ja tosiaan tähän voi laittaa ne coordnaatit myös erikseen.
Tämä oli tarkoituskin...
Aihe on jo aika vanha, joten et voi enää vastata siihen.