infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Bratie Fanut din Iulie 05, 2013, 14:53:38



Titlul: While loop problem X&O game
Scris de: Bratie Fanut din Iulie 05, 2013, 14:53:38
Am incercat sa fac un joc de X si O in C++ si este aproape gata, subliniez aproape. Am o problema cu acel ciclu. In mod normal ar trebui sa se opreasca la k=9 dar ceva este gresit si nu se opreste.. in rest totul merge bine deocamdata, daca cineva pune 3 x sau 3 o in linie se opreste, dar cand nu castiga nimeni jocul continua mai mult decat trebuie. Care este problema? Am incercat si cu for() dar tot aia este...  ](*,)

Cod:
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <conio.h>

using namespace std;

int opt, rez[3][3], casuta,casuta1,k=0;
char player1[11], player2[11], a[8][13];

int main()
{
    a[1][1]='-';a[1][2]='-';a[1][3]='-';a[1][4]='-';a[1][5]='-';a[1][6]='-';a[1][7]='-';a[1][8]='-';a[1][9]='-';a[1][10]='-';a[1][11]='-';a[1][12]='-';a[1][13]='-';
    a[2][1]='|';a[2][2]=' ';a[2][3]='x';a[2][4]=' ';a[2][5]='|';a[2][6]=' ';a[2][7]='x';a[2][8]=' ';a[2][9]='|';a[2][10]=' ';a[2][11]='o';a[2][12]=' ';a[2][13]='|';
    a[3][1]='-';a[3][2]='-';a[3][3]='-';a[3][4]='-';a[3][5]='-';a[3][6]='-';a[3][7]='-';a[3][8]='-';a[3][9]='-';a[3][10]='-';a[3][11]='-';a[3][12]='-';a[3][13]='-';
    a[4][1]='|';a[4][2]=' ';a[4][3]='o';a[4][4]=' ';a[4][5]='|';a[4][6]=' ';a[4][7]='x';a[4][8]=' ';a[4][9]='|';a[4][10]=' ';a[4][11]='x';a[4][12]=' ';a[4][13]='|';
    a[5][1]='-';a[5][2]='-';a[5][3]='-';a[5][4]='-';a[5][5]='-';a[5][6]='-';a[5][7]='-';a[5][8]='-';a[5][9]='-';a[5][10]='-';a[5][11]='-';a[5][12]='-';a[5][13]='-';
    a[6][1]='|';a[6][2]=' ';a[6][3]='x';a[6][4]=' ';a[6][5]='|';a[6][6]=' ';a[6][7]='o';a[6][8]=' ';a[6][9]='|';a[6][10]=' ';a[6][11]='o';a[6][12]=' ';a[6][13]='|';
    a[7][1]='-';a[7][2]='-';a[7][3]='-';a[7][4]='-';a[7][5]='-';a[7][6]='-';a[7][7]='-';a[7][8]='-';a[7][9]='-';a[7][10]='-';a[7][11]='-';a[7][12]='-';a[7][13]='-';

    cout<<"== X & O game =="<<endl;
    cout<<"  created by Bratie Fanut"<<endl<<endl;

    for(int i=1;i<=7;i++)
    {
        for(int j=1;j<=13;j++)
        cout<<a[i][j];
        cout<<endl;
    }

    cout<<endl;
    cout<<"1. Joc Nou"<<endl;
    cout<<"2. Instructiuni"<<endl;
    cout<<"3. Scor"<<endl;
    cout<<"4. Iesire"<<endl;

    cout<<endl;

    cout<<"Introduceti optiunea dumneavoastra:";
    cin>>opt;

    if(opt == 1)
    {

        a[2][3]=' ';
        a[2][7]=' ';
        a[2][11]=' ';
        a[4][3]=' ';
        a[4][7]=' ';
        a[4][11]=' ';
        a[6][3]=' ';
        a[6][7]=' ';
        a[6][11]=' ';

        cout<<"Jocul va incepe dupa ce ambii jucatori si-au introdus numele"<<endl;
        cout<<"Introduceti numele, Player1:"<<endl;
        cin>>player1;
        cout<<"Introduceti numele, Player2:"<<endl;
        cin>>player2;

        cout<<endl<<"LOADING...............";
        system("cls");
        cout<<"Jocul a inceput!"<<endl<<endl;

        for(int i=1;i<=7;i++)
        {
            for(int j=1;j<=13;j++)
            cout<<a[i][j];
            cout<<endl;
        }

        while(k<=9)
        {
            cout<<player1<<" sunteti cu ,,X''. Introduceti numarul casutei dorite.";
            cin>>casuta;
            switch(casuta)
            {
                case 1:
                a[2][3]='X',rez[1][1]=1,k++;
                break;

                case 2:
                a[2][7]='X',rez[1][2]=1,k++;
                break;

                case 3:
                a[2][11]='X',rez[1][3]=1,k++;
                break;

                case 4:
                a[4][3]='X',rez[2][1]=1,k++;
                break;

                case 5:
                a[4][7]='X',rez[2][2]=1,k++;
                break;

                case 6:
                a[4][11]='X',rez[2][3]=1,k++;
                break;

                case 7:
                a[6][3]='X',rez[3][1]=1,k++;
                break;

                case 8:
                a[6][7]='X',rez[3][2]=1,k++;
                break;

                case 9:
                a[6][11]='X',rez[3][3]=1,k++;
                break;
            }

            system("cls");
            for(int i=1;i<=7;i++)
            {
                for(int j=1;j<=13;j++)
                cout<<a[i][j];
                cout<<endl;
            }

            if((rez[1][1]==1 && rez[1][2]==1 && rez[1][3]==1) ||
               (rez[2][1]==1 && rez[2][2]==1 && rez[2][3]==1) ||
               (rez[3][1]==1 && rez[3][2]==1 && rez[3][3]==1) ||
               (rez[1][3]==1 && rez[2][2]==1 && rez[3][1]==1))
               {
                   cout<<player1<<" A CASTIGAT!!!"<<endl<<endl;
                   exit(1);getch();
               }

            cout<<player2<<" sunteti cu ,,O''. Introduceti numarul casutei dorite.";
            cin>>casuta1;
            switch(casuta1)
            {
                case 1:
                a[2][3]='O',rez[1][1]=2,k++;
                break;

                case 2:
                a[2][7]='O',rez[1][2]=2,k++;
                break;

                case 3:
                a[2][11]='O',rez[1][3]=2,k++;
                break;

                case 4:
                a[4][3]='O',rez[2][1]=2,k++;
                break;

                case 5:
                a[4][7]='O',rez[2][2]=2,k++;
                break;

                case 6:
                a[4][11]='O',rez[2][3]=2,k++;
                break;

                case 7:
                a[6][3]='O',rez[3][1]=2,k++;
                break;

                case 8:
                a[6][7]='O',rez[3][2]=2,k++;
                break;

                case 9:
                a[6][11]='O',rez[3][3]=2,k++;
                break;
            }
            system("cls");
            for(int i=1;i<=7;i++)
            {
                for(int j=1;j<=13;j++)
                cout<<a[i][j];
                cout<<endl;
            }
            if((rez[1][1]==2 && rez[1][2]==2 && rez[1][3]==2) ||
               (rez[2][1]==2 && rez[2][2]==2 && rez[2][3]==2) ||
               (rez[3][1]==2 && rez[3][2]==2 && rez[3][3]==2) ||
               (rez[1][3]==2 && rez[2][2]==2 && rez[3][1]==2))
               {
                   cout<<player2<<" A CASTIGAT!!!"<<endl<<endl;
                   exit(1); getch();
               }


        }

        cout<<"EGALITATE!!"<<endl;


    }

    if(opt==4)
    exit(0);


    cout<<endl<<endl;
    return 0;
}


Titlul: Răspuns: While loop problem X&O game
Scris de: Cretu Bogdan din Iulie 05, 2013, 16:23:24
Nu-ti calculeaza mereu k-ul bine (nu imi dau seama de ce) ... ca sa te convingi pune dupa fiecare switch (la sfarsit desigur) cout<<k; sa vezi.
Incearca sa faci cu if - mi se pare mai in regula.
spre exemplu daca selectez casutele
1 2 3 4 5 6 8 7 9 - pana la 6 numara corect dupa cand dau 8 k-ul devine 2 (chiar nu-mi pot da seama de ce) cand dau 7 devine 3 si cand dau 9 devine 4.
PS: incearca sa folosesti functii...e mai usor de depistat greseala si sunt si mai accesibile.
Daca nu reusesti da-mi un pm si o sa incerc sa ti-l fac eu (nu stiu daca il termin azi - sunt putin ocupat)


Titlul: Răspuns: While loop problem X&O game
Scris de: Bratie Fanut din Iulie 05, 2013, 19:08:09
 :o multumesc. asa am observat si eu ca k-ul ala e cam ciudat.. am incercat cu if-uri dar tot asa se comporta.. trebuie sa reusesc.. daca nu merge rescriu cu functii :? multumesc mult :) daca mai observi ceva te rog posteaza un raspuns :oops:


Titlul: Răspuns: While loop problem X&O game
Scris de: Cretu Bogdan din Iulie 05, 2013, 19:31:03
Am observat ca ai zis ca nu e gata...dar iti zic niste chestii pe care le-am observat asa...succint uitandu-ma:
1.nu ai luat in calcul toate variantele de a castiga - in total sunt 8 pentru fiecare player (linie 1,2,3 coloana 1,2,3 diagonala principala diagonala secundara)
2.dupa un anumit numar de mutari player 2 (parca) devine caracterul cu codul ASCII 2
3.se poate alege o casuta mai mare ca 9
4.daca player 1 a mutat in casuta 2, dupa asta si player 2 poate muta in casuta 2.
5.la inceputul jocului cand alegi 'NEW GAME' si ce mai are nu sunt compelctate cazurile (2 si 3)
        5'.La sfarsit in loc de if (p==4) pune if (p!=1 || p!=2 || p!=3) unde p e varbiabila opt (a ta)


Titlul: Răspuns: While loop problem X&O game
Scris de: George Marcus din Iulie 05, 2013, 20:46:18
Poti initializa matricea a linie cu linie, sa nu te chinui cu fiecare caracter in parte.


Titlul: Răspuns: While loop problem X&O game
Scris de: Bratie Fanut din Iulie 06, 2013, 10:44:31
Am observat ca ai zis ca nu e gata...dar iti zic niste chestii pe care le-am observat asa...succint uitandu-ma:
1.nu ai luat in calcul toate variantele de a castiga - in total sunt 8 pentru fiecare player (linie 1,2,3 coloana 1,2,3 diagonala principala diagonala secundara)
2.dupa un anumit numar de mutari player 2 (parca) devine caracterul cu codul ASCII 2
3.se poate alege o casuta mai mare ca 9
4.daca player 1 a mutat in casuta 2, dupa asta si player 2 poate muta in casuta 2.
5.la inceputul jocului cand alegi 'NEW GAME' si ce mai are nu sunt compelctate cazurile (2 si 3)
        5'.La sfarsit in loc de if (p==4) pune if (p!=1 || p!=2 || p!=3) unde p e varbiabila opt (a ta)
Multumesc
1. Stiu ca nu am luat in calcul toate variantele. Ieri dupa ce am mai testat un pic mi-am dat seama.
2. Am observat ca devine acel smile din ASCII.. De ce se intampla asta? e foarte ciudat...
3. M-am gandit sa rezolv mai intai partea in care se introduc datele corect, ca apoi sa ma ocup de exceptii.
4. Inca ma mai gandesc la asta. Cred ca o sa bifez intr-un vector completat/necompletat. Daca o casuta este completata, respectiv daca nu.
5. Cazurile 2 si 3 le completez acum.
        5'. Asa voi face.
 :) Multumesc. Voi reveni cu update-uri. :peacefingers: peace