Advertisement
AntonioVillanueva

TicTacToe / 3 en raya

Dec 18th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.76 KB | None | 0 0
  1. // compilacion ---- >   g++ -std=c++11 -o tictactoe tictactoe.cpp
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. enum valor {X=1,O=2,nulo=0};//valores que toma cada celda X,O o nulo
  8. typedef vector <vector<valor>> Tablero;//vector 2D de valor X,O o nulo
  9. typedef vector<valor> Elemento;
  10. struct coordenada{int x;int y;};//estructura x,y posicion en el tablero
  11.  
  12. //----------------------------------------------------------------------
  13. //---------------------CLASE y DECLARACIONES----------------------------
  14. class tictac{
  15.     //interface de la clase se reduce la constructor y al metodo juego()
  16.     //el resto encapsulado , es inaccesible para el usuario como private
  17.     public:
  18.     tictac();
  19.     void juego ();//Motor del juego , todo transcurre aqui ....
  20.    
  21.     private:
  22.     Tablero tablero;//Vector 2D de type valor X,O,nulo , tablero    
  23.     bool jugador;//X=true O=false
  24.    
  25.     bool libre(size_t linea,size_t col)const;//Esta libre la casilla y dentro del rango ?
  26.     coordenada char_to_coordenada (char letra);//Traduce a,b,c,....a coordenadas en el juego
  27.     coordenada lectura();//lee jugada
  28.     bool juega(size_t linea,size_t col);//juega pieza X o O si se puede
  29.     void pantalla();//muestra el estado del , tablero en pantalla
  30.     int gana()const;//mira si la ultima jugada jugador ha ganado 1=X ,2=O ,0=NULO
  31.     bool lleno() const;//Se han jugado todas las casillas 3x3 ? , estan ocupadas con X o O ?
  32.  
  33. };
  34. //---------------------    DEFINICIONES     ----------------------------
  35. //----------------------------------------------------------------------
  36.     tictac::tictac():tablero(3,std::vector<valor>(3,nulo)){jugador=true;};//Constructor de clase
  37. //----------------------------------------------------------------------   
  38.    
  39.     void tictac::juego (){//Motor del juego , todo transcurre aqui ....
  40.         coordenada coord;
  41.         while (gana() ==0 && lleno()){//Hay ganador o se han jugado todas las casillas ?
  42.             pantalla();//muestra , tablero en pantalla
  43.             coord=lectura();//lee datos ,teclado coordenada
  44.             juega(coord.x,coord.y);//juega la casilla seleccionada
  45.         }
  46.    
  47.         //Mira quien ha ganado
  48.         if (gana() !=0 ){
  49.             cout <<" Ha ganado jugador ";
  50.             (gana() ==1 ) ? cout<<" 1 - X" : cout <<"2 - O";
  51.             cout<<endl;    
  52.         }else {cout <<endl<<"No hay ganador !!!"<<endl;}
  53.        
  54.         pantalla();//Muestra por consola ,estado tablero
  55.        
  56.     }  
  57. //----------------------------------------------------------------------   
  58.     bool tictac::libre(size_t linea,size_t col)const{//Esta libre la casilla y dentro del rango ?
  59.         if (tablero[linea][col]==nulo && linea<3 && col<3){return true;}
  60.         return false;}
  61. //----------------------------------------------------------------------       
  62.     bool tictac::juega(size_t linea,size_t col){//juega pieza si se puede
  63.         valor pieza;
  64.         if (jugador){pieza=X;}else {pieza=O;} //jugador X o O
  65.         if (libre (linea,col)){
  66.             tablero[linea][col]=pieza;//X o O
  67.             jugador =!jugador;//conmuta Jugador 1 o 2 , para la proxima jugada
  68.             return true;}
  69.         return false;
  70.     }  
  71. //----------------------------------------------------------------------       
  72.     void tictac::pantalla(){//muestra tablero 3x3 del juego
  73.         char patron ('a'-1);//para evitar poner coordenadas utiliza letras ;)
  74.         Tablero::iterator it;
  75.         Elemento::iterator elemento;
  76.        
  77.         for (it =tablero.begin();it<tablero.end();it++){
  78.             for (elemento=it->begin();elemento!=it->end();elemento++){
  79.                 ++patron;
  80.                 switch (*elemento){
  81.                     case X: cout<<" X ";break;
  82.                     case O: cout<<" O ";break;
  83.                     //case nulo: cout<<" - ";break; //version A
  84.                     case nulo: cout<<" "<<patron<<" ";break;//version B
  85.                 }
  86.             }
  87.             cout<<endl;//fin de linea
  88.         }
  89.             cout<<endl;//fin de tablero
  90.     }
  91. //----------------------------------------------------------------------   
  92.     int tictac::gana()const{//mira si hay ganador y quien es  1=X ,2=O ,0=NULO
  93.         int ha_ganado(0);
  94.         //lineas
  95.         ha_ganado |= (tablero[0][0] & tablero[0][1] & tablero[0][2]);
  96.         ha_ganado |= (tablero[1][0] & tablero[1][1] & tablero[1][2]);
  97.         ha_ganado |=  (tablero[2][0] & tablero[2][1] & tablero[2][2]);
  98.        
  99.         //Columnas     
  100.         ha_ganado |=  (tablero[0][0] & tablero[1][0] & tablero[2][0]);
  101.         ha_ganado |= (tablero[0][1] & tablero[1][1] & tablero[2][1]);      
  102.         ha_ganado |=  (tablero[0][2] & tablero[1][2] & tablero[0][2]);
  103.  
  104.         //Diagonal
  105.         ha_ganado |=  (tablero[0][0] & tablero[1][1] &  tablero[2][2]);
  106.         ha_ganado |=  (tablero[2][0] & tablero[1][1] &  tablero[0][2]);
  107.        
  108.         return ha_ganado;//ha ganado 1=X ,2=O ,0=NULO
  109.         }
  110. //----------------------------------------------------------------------       
  111.     coordenada tictac::lectura(){
  112.         string lectura;
  113.  
  114.         while (lectura.size()!=1 || (lectura[0] >'i')){
  115.             cout <<endl<<" JUGADOR ";
  116.             jugador ? cout<<" 1 ":cout <<" 2 ";
  117.             cout <<"Cual es su jugada  ?, introduzca su coordenada a,b,c,d,e,f,g,h,i si esta libre ";          
  118.             cin >>lectura;//lee string , jugada
  119.         }
  120.         return {char_to_coordenada(lectura[0])};//ascii -> num
  121.     };
  122.  
  123. //----------------------------------------------------------------------
  124.     bool tictac::lleno() const{//todas las celdas estan ocupadas con X o O?
  125.         for (auto lin:tablero){
  126.             for (auto elem:lin){
  127.                 if (elem==nulo){return true;}//quedan casillas por jugar ,
  128.             }
  129.         }      
  130.         return false ;//Tablero lleno todas las casillas jugadas
  131.     }
  132. //----------------------------------------------------------------------   
  133.     coordenada tictac::char_to_coordenada (char letra){//Traduce a,b,c,....a coordenadas en el juego   
  134.         coordenada coord;
  135.         char c='a';
  136.  
  137.         for (size_t x=0;x<3;x++){
  138.             for (size_t y=0;y<3;y++){
  139.                 if(letra == c){coord.x=x;coord.y=y;}
  140.                 c++;
  141.             }
  142.         }              
  143.         return coord;
  144.     }
  145. //----------------------------------------------------------------------
  146. //----------------------------------------------------------------------
  147. int main(){
  148.  
  149.     tictac t;//instancia clase tictac en t
  150.     t.juego();//juega
  151.  
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement