Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // compilacion ---- > g++ -std=c++11 -o tictactoe tictactoe.cpp
- #include <iostream>
- #include <vector>
- using namespace std;
- enum valor {X=1,O=2,nulo=0};//valores que toma cada celda X,O o nulo
- typedef vector <vector<valor>> Tablero;//vector 2D de valor X,O o nulo
- typedef vector<valor> Elemento;
- struct coordenada{int x;int y;};//estructura x,y posicion en el tablero
- //----------------------------------------------------------------------
- //---------------------CLASE y DECLARACIONES----------------------------
- class tictac{
- //interface de la clase se reduce la constructor y al metodo juego()
- //el resto encapsulado , es inaccesible para el usuario como private
- public:
- tictac();
- void juego ();//Motor del juego , todo transcurre aqui ....
- private:
- Tablero tablero;//Vector 2D de type valor X,O,nulo , tablero
- bool jugador;//X=true O=false
- bool libre(size_t linea,size_t col)const;//Esta libre la casilla y dentro del rango ?
- coordenada char_to_coordenada (char letra);//Traduce a,b,c,....a coordenadas en el juego
- coordenada lectura();//lee jugada
- bool juega(size_t linea,size_t col);//juega pieza X o O si se puede
- void pantalla();//muestra el estado del , tablero en pantalla
- int gana()const;//mira si la ultima jugada jugador ha ganado 1=X ,2=O ,0=NULO
- bool lleno() const;//Se han jugado todas las casillas 3x3 ? , estan ocupadas con X o O ?
- };
- //--------------------- DEFINICIONES ----------------------------
- //----------------------------------------------------------------------
- tictac::tictac():tablero(3,std::vector<valor>(3,nulo)){jugador=true;};//Constructor de clase
- //----------------------------------------------------------------------
- void tictac::juego (){//Motor del juego , todo transcurre aqui ....
- coordenada coord;
- while (gana() ==0 && lleno()){//Hay ganador o se han jugado todas las casillas ?
- pantalla();//muestra , tablero en pantalla
- coord=lectura();//lee datos ,teclado coordenada
- juega(coord.x,coord.y);//juega la casilla seleccionada
- }
- //Mira quien ha ganado
- if (gana() !=0 ){
- cout <<" Ha ganado jugador ";
- (gana() ==1 ) ? cout<<" 1 - X" : cout <<"2 - O";
- cout<<endl;
- }else {cout <<endl<<"No hay ganador !!!"<<endl;}
- pantalla();//Muestra por consola ,estado tablero
- }
- //----------------------------------------------------------------------
- bool tictac::libre(size_t linea,size_t col)const{//Esta libre la casilla y dentro del rango ?
- if (tablero[linea][col]==nulo && linea<3 && col<3){return true;}
- return false;}
- //----------------------------------------------------------------------
- bool tictac::juega(size_t linea,size_t col){//juega pieza si se puede
- valor pieza;
- if (jugador){pieza=X;}else {pieza=O;} //jugador X o O
- if (libre (linea,col)){
- tablero[linea][col]=pieza;//X o O
- jugador =!jugador;//conmuta Jugador 1 o 2 , para la proxima jugada
- return true;}
- return false;
- }
- //----------------------------------------------------------------------
- void tictac::pantalla(){//muestra tablero 3x3 del juego
- char patron ('a'-1);//para evitar poner coordenadas utiliza letras ;)
- Tablero::iterator it;
- Elemento::iterator elemento;
- for (it =tablero.begin();it<tablero.end();it++){
- for (elemento=it->begin();elemento!=it->end();elemento++){
- ++patron;
- switch (*elemento){
- case X: cout<<" X ";break;
- case O: cout<<" O ";break;
- //case nulo: cout<<" - ";break; //version A
- case nulo: cout<<" "<<patron<<" ";break;//version B
- }
- }
- cout<<endl;//fin de linea
- }
- cout<<endl;//fin de tablero
- }
- //----------------------------------------------------------------------
- int tictac::gana()const{//mira si hay ganador y quien es 1=X ,2=O ,0=NULO
- int ha_ganado(0);
- //lineas
- ha_ganado |= (tablero[0][0] & tablero[0][1] & tablero[0][2]);
- ha_ganado |= (tablero[1][0] & tablero[1][1] & tablero[1][2]);
- ha_ganado |= (tablero[2][0] & tablero[2][1] & tablero[2][2]);
- //Columnas
- ha_ganado |= (tablero[0][0] & tablero[1][0] & tablero[2][0]);
- ha_ganado |= (tablero[0][1] & tablero[1][1] & tablero[2][1]);
- ha_ganado |= (tablero[0][2] & tablero[1][2] & tablero[0][2]);
- //Diagonal
- ha_ganado |= (tablero[0][0] & tablero[1][1] & tablero[2][2]);
- ha_ganado |= (tablero[2][0] & tablero[1][1] & tablero[0][2]);
- return ha_ganado;//ha ganado 1=X ,2=O ,0=NULO
- }
- //----------------------------------------------------------------------
- coordenada tictac::lectura(){
- string lectura;
- while (lectura.size()!=1 || (lectura[0] >'i')){
- cout <<endl<<" JUGADOR ";
- jugador ? cout<<" 1 ":cout <<" 2 ";
- cout <<"Cual es su jugada ?, introduzca su coordenada a,b,c,d,e,f,g,h,i si esta libre ";
- cin >>lectura;//lee string , jugada
- }
- return {char_to_coordenada(lectura[0])};//ascii -> num
- };
- //----------------------------------------------------------------------
- bool tictac::lleno() const{//todas las celdas estan ocupadas con X o O?
- for (auto lin:tablero){
- for (auto elem:lin){
- if (elem==nulo){return true;}//quedan casillas por jugar ,
- }
- }
- return false ;//Tablero lleno todas las casillas jugadas
- }
- //----------------------------------------------------------------------
- coordenada tictac::char_to_coordenada (char letra){//Traduce a,b,c,....a coordenadas en el juego
- coordenada coord;
- char c='a';
- for (size_t x=0;x<3;x++){
- for (size_t y=0;y<3;y++){
- if(letra == c){coord.x=x;coord.y=y;}
- c++;
- }
- }
- return coord;
- }
- //----------------------------------------------------------------------
- //----------------------------------------------------------------------
- int main(){
- tictac t;//instancia clase tictac en t
- t.juego();//juega
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement