» »

c++ krizec krozec

c++ krizec krozec

worxer ::

Torej, naredil sem igro krizec krozec, imam pa ne problem, med igro ce vtipkam 12 ali drugo vec mestno število mi program naredi dve potezi in ne samo eno ali pa da mi bi izpisal, da je ukaz neveljaven.
Spodaj je koda cele igre. Prosil bi, če mi samo namignete lahko mi pa tudi vpišete v kodo, kaj sem naredil narobe.

/*
  Name: Krizec-krozec
  Copyright: WorXer`s CoRporaTion
  Author: Worxer a.k.a. Marko Cerjak
  Date: 13.12.11 12:43
  Description: Igra"Tri v vrsto, Križec-krožec"
*/
#include <iostream>
#include <string>
using namespace std;
char cZ[0];
char cP1, cP2, cP3, cP4, cP5, cP6, cP7, cP8, cP9;
int izpis() {
    cout << "1 | 2 | 3    ==   " << cP1 << " | " << cP2 << " | " << cP3 << endl;
    cout << "--|---|-- ======  " << "--|---|--" << endl;
    cout << "4 | 5 | 6 ======= " << cP4 << " | " << cP5 << " | " << cP6 << endl;
    cout << "--|---|-- ======  " << "--|---|--" << endl;
    cout << "7 | 8 | 9    ==   " << cP7 << " | " << cP8 << " | " << cP9 << endl;
}
int izbira() { 
    cout << "####################################" << endl << "# Igra: Tri v vrsto(krizec-krozec) #" << endl << "#   Avtor: Marko Cerjak (WorXer)   #" << endl << "####################################" << endl << endl << "Izberite opcijo: - Zacetek igre (S)" << endl << "                 - Navodila/pomoc (N)" << endl << "                 - zapri igro (X)." << endl;
    do {
        cin >> cZ;
        if(( cZ[0] != 's' ) && ( cZ[0] != 'S' ) && ( cZ[0] != 'n' ) && ( cZ[0] != 'N' ) && ( cZ[0] != 'x' ) && ( cZ[0] != 'X' ) ) {
             cout << "Izdan je bil napacen ukaz '" << cZ << "'." << endl << "Prosim da izdate ukaz se enkrat." << endl;
             }
        }while(( cZ[0] != 's' )&&( cZ[0] != 'S' )&&( cZ[0] != 'n' )&&( cZ[0] != 'N' )&&( cZ[0] != 'x' )&&( cZ[0] != 'X' ));
}
int main() {
    string sIgralec1, sIgralec2;
    char poz[0];
    int iIgralec, iZ, iK;
    do {
        system("cls");
        izbira();
        if( ( cZ[0] == 'n' ) || ( cZ[0] == 'N' ) ){
            cout << endl << "*******************************************************************************"<< endl << "*                         NAVODILA, POMOC IN NASVETI                          *" << endl << "* Igra zahteva, da izbirate taksne poz[0]icije svojih znakcov, da lahko zmagate, *" << endl << "*    to pomeni da morate tri svoje znakce postaviti zaporedno. poz[0]icije ki    *" << endl << "*           stejejo zaporedno so vodoravne, navpicne in zaporedne.            *" << endl << "*     Vsak igralec bo imel cez vse igre isti znak, prvi igralec bo imel X     *" << endl << "*                             in drugi igralec O.                             *" << endl << "*******************************************************************************" << endl;
            system("pause");
            }
    if( ( cZ[0] == 's' ) || ( cZ[0] == 'S' ) ){
        cout << "Prvi igralec, vtipkajte svoje ime ali vzdevek: " << endl;
        cin >> sIgralec1;
        cout << "Drugi igralec, vtipkajte svoje ime ali vzdevek: " << endl;
        cin >> sIgralec2;
        iIgralec = 1;
        do {
        iK = 0;
        iZ = 1;
        cP1 = '*';
        cP2 = '*';
        cP3 = '*';
        cP4 = '*';
        cP5 = '*';
        cP6 = '*';
        cP7 = '*';
        cP8 = '*';
        cP9 = '*';
        do {
        system("cls");
        if ( iIgralec == 1) {
           cout << sIgralec1 << " na potezi!" << endl;
        }
        if ( iIgralec == 2) {
            cout << sIgralec2 << " na potezi!" << endl;
        }
        izpis();
        if ((iK != 1)&&(cP1 != '*')&&(cP2 != '*')&&(cP3 != '*')&&(cP4 != '*')&&(cP5 != '*')&&(cP6 != '*')&&(cP7 != '*')&&(cP8 != '*')&&(cP9 != '*')) {
                cout << "Konec igre, zapolnila sta celi pomnilnik." << endl;
                iK = 1;
                }
        if (iK != 1) {
        cout << "Izberi pozicijo, kjer zelis postaviti svoj znak(1, 2, 3, ...)." << endl;
        do {
            cin >> poz[0];
            if((( poz[0] < '1' )||(poz[0] > '9'))||((poz[0] == '1')&&(cP1 != '*'))||((poz[0] == '2')&&(cP2 != '*'))||((poz[0] == '3')&&(cP3 != '*'))||((poz[0] == '4')&&(cP4 != '*'))||((poz[0] == '5')&&(cP5 != '*'))||((poz[0] == '6')&&(cP6 != '*'))||((poz[0] == '7')&&(cP7 != '*'))||((poz[0] == '8')&&(cP8 != '*'))||((poz[0] == '9')&&(cP9 != '*'))) { 
                 cout << "Izbrali ste neveljavno pozicijo!" << endl;
                 }
            }while((( poz[0] < '1' )||(poz[0] > '9'))||((poz[0] == '1')&&(cP1 != '*'))||((poz[0] == '2')&&(cP2 != '*'))||((poz[0] == '3')&&(cP3 != '*'))||((poz[0] == '4')&&(cP4 != '*'))||((poz[0] == '5')&&(cP5 != '*'))||((poz[0] == '6')&&(cP6 != '*'))||((poz[0] == '7')&&(cP7 != '*'))||((poz[0] == '8')&&(cP8 != '*'))||((poz[0] == '9')&&(cP9 != '*')));
        if (( poz[0] >= '1' )&&(poz[0] <= '9')) {
              if((iIgralec == 1)&&(iZ == 1)) {
                          if (poz[0] == '1') { cP1 = 'X'; }
                          if (poz[0] == '2') { cP2 = 'X'; }
                          if (poz[0] == '3') { cP3 = 'X'; }
                          if (poz[0] == '4') { cP4 = 'X'; }
                          if (poz[0] == '5') { cP5 = 'X'; }
                          if (poz[0] == '6') { cP6 = 'X'; }
                          if (poz[0] == '7') { cP7 = 'X'; }
                          if (poz[0] == '8') { cP8 = 'X'; }
                          if (poz[0] == '9') { cP9 = 'X'; }
                          iIgralec = 2;
                          iZ = 0;
                          }
              if((iIgralec == 2)&&(iZ == 1)) {
                          if (poz[0] == '1') { cP1 = 'O'; }
                          if (poz[0] == '2') { cP2 = 'O'; }
                          if (poz[0] == '3') { cP3 = 'O'; }
                          if (poz[0] == '4') { cP4 = 'O'; }
                          if (poz[0] == '5') { cP5 = 'O'; }
                          if (poz[0] == '6') { cP6 = 'O'; }
                          if (poz[0] == '7') { cP7 = 'O'; }
                          if (poz[0] == '8') { cP8 = 'O'; }
                          if (poz[0] == '9') { cP9 = 'O'; }
                          iIgralec = 1;
                          iZ = 0;
                          }
              if(((cP1 == 'X')&&(cP2 == 'X')&&(cP3 == 'X'))||((cP4 == 'X')&&(cP5 == 'X')&&(cP6 == 'X'))||((cP7 == 'X')&&(cP8 == 'X')&&(cP9 == 'X'))||((cP1 == 'X')&&(cP4 == 'X')&&(cP7 == 'X'))||((cP2 == 'X')&&(cP5 == 'X')&&(cP8 == 'X'))||((cP3 == 'X')&&(cP6 == 'X')&&(cP9 == 'X'))||((cP1 == 'X')&&(cP5 == 'X')&&(cP9 == 'X'))||((cP3 == 'X')&&(cP5 == 'X')&&(cP7 == 'X'))) {
                        system("cls");
                        izpis();
                        cout << "## " << sIgralec1 << " je zmagal/a!!! ##" << endl;
                        iK = 1;
              }
              if(((cP1 == 'O')&&(cP2 == 'O')&&(cP3 == 'O'))||((cP4 == 'O')&&(cP5 == 'O')&&(cP6 == 'O'))||((cP7 == 'O')&&(cP8 == 'O')&&(cP9 == 'O'))||((cP1 == 'O')&&(cP4 == 'O')&&(cP7 == 'O'))||((cP2 == 'O')&&(cP5 == 'O')&&(cP8 == 'O'))||((cP3 == 'O')&&(cP6 == 'O')&&(cP9 == 'O'))||((cP1 == 'O')&&(cP5 == 'O')&&(cP9 == 'O'))||((cP3 == 'O')&&(cP5 == 'O')&&(cP7 == 'O'))) {
                        system("cls");
                        izpis();
                        cout << "## " << sIgralec2 << " je zmagal/a!!! ##" << endl;
                        iK = 1;
              }
              iZ = 1;
              if (iK == 0) {
                        cout << "Postavljam ..." << endl;
              }
              }
              }
        }while(iK == 0);
        do {
            cout << endl << "Izberite opcijo: - ponovi igro (P)" << endl << "                 - resetiraj igro (R)" << endl << "                 - zapri igro (X)." << endl;
            cin >> cZ;
            if ((cZ[0] != 'p' ) && ( cZ[0] != 'P' ) && ( cZ[0] != 'r' ) && ( cZ[0] != 'R' ) && ( cZ[0] != 'x' ) && ( cZ[0] != 'X' )){
                         cout << "Napacen ukaz!" << endl << "Uporabite lahko samo P/R/X." << endl;
                         }
            }while(( cZ[0] != 'p' ) && ( cZ[0] != 'P' ) && ( cZ[0] != 'r' ) && ( cZ[0] != 'R' ) && ( cZ[0] != 'x' ) && ( cZ[0] != 'X' ));
        }while((cZ[0] == 'p')||(cZ[0] == 'P'));
        }
    }while((cZ[0] != 'x')&&(cZ[0] != 'X'));
}

ddeben ::

Kolikor sem na hitro pogledal, js vidim tukaj problem v tipu "pozicije" -> se pravi namesto char bi jaz uporabil integer. Za c++ ne morem trdit ker sem bolj v c# vodah, če velja
poz=<'1' in poz>='9', 
da dejansko potem preverja cifre ki jih vneseš oz. s tem mislim predvsem da prepozna vnešeni char kot cifro in gleda območje od 1 do 9. Zdaj da ti za npr. 12 naredi dve potezi, je verjetno zato ker je char ena sama črka in ti jo verjetno razbije na '1' in '2' Drugače pa za moje pojme preveč if stavkov :) praksa dela mojstra. Probaj pa poročaj.

darkkk ::

Nisem šel preveč dobro gledat kode, samo verjetno puščaš znake na vhodnem bufferju. Beri po en znak s tem:
        char znak;
        znak = cin.get();               //preberes en sam znak
        cin.ignore(1000, '\n');        //vrzes stran ostanek bufferja 


Na ta način boš vhod *123 prebral kot *, ostalo pa vrgel stran (ok, vsaj prvih 1000 oz. do '\n', če se prav spomnim definicije). Pol samo sparsaš znak v število. (lahko pa bereš tudi število kot int in vzameš ven 1. števko).

PS. izogibaj se dolgim if-om, za to maš switch: case.

worxer ::

char sem dau notr glih zarad tega, k se včas zgodi, da vtipkaš notr črko, pol pa začne floodat program, da ukaz ni veljaven :D zaradi tega sem pol dau namest double ali intiger char.
@darkkk, tle si mislu tko:
char znak;
znak = cin.get();               //preberes en sam znak
znak = cin.ignore(1000, '\n');        //vrzes stran ostanek bufferja

?

darkkk ::

Prav pošteno, niti nisem dosti mislil, ampak točno tako, kot je bilo napisano.

Vse skupaj stlači v eno funkcijo, kjer maš pač while zanko, ki preverja, dokler ne dobi "veljavnega" vnosa.
Recimo, da rabiš nekaj med 1-9, enostavno boš bral vhod, dokler ne dobiš pravega znaka. Jasno se bo npr. vhod 139 interpretiral kot 1, ampak enostavno ne moreš v konzoli preprečit vseh debilizmov uporabnikov :)
int beri_znak()
{
   char znak;
   while(true){
     znak = cin.get();               //preberes en sam znak
     cin.ignore(1000, '\n');         //ostalo vrzes stran
     if(znak <= '9' && znak >= '1') break;
   }
   return (znak - '0');              //"cast" v int

}

Zgodovina sprememb…

  • spremenil: darkkk ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

mnenje glede hp multi...

Oddelek: Pomoč in nasveti
6929 (779) ST-777
»

Windows 2003 sbs - omejiti dostop do oddaljenega namizja

Oddelek: Operacijski sistemi
8941 (800) gorenjc
»

No EvilKYRO II

Oddelek: Novice / Grafične kartice
61488 (1488) Boeing
»

Cena?

Oddelek: Pomoč in nasveti
191085 (734) SpiDEr8

Več podobnih tem