Bueno, este es mi proyecto de estructura de datos de la uni, construir un básico 3 en raya sin inteligencia artificial ni nada...
Como en la universidad los profesores son flojos y no explican he tenido que autoenseñarme casi todo y buscando un poco encontré un código bastante sencillo y básico pero que noto un tanto ineficiente.
Código C++:
Ver original/**************************************************\
* Autor: ~ .:: {[*JuaN-ThE-HaCKeR*]} ::. ~ *
* Proyecto: Tres en raya *
* Versión: V1.10 *
* Estado: Terminado *
* Fecha: 09/01/09 *
* Hora: 19:08 *
\**************************************************/
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
// Para Linux:
#define C "+" // Cruce
#define H "-" // Horizontal
#define V "|" // Vertical
// Para Windows:
// #define C "\xCE" // Cruce
// #define H "\xCD" // Horizontal
// #define V "\xBA" // Vertical
char a1=' ',a2=' ',a3=' ',b1=' ',b2=' ',b3=' ',c1=' ',c2=' ',c3=' ',turno,again;
string ficha=" ";
int win=-1,jug,i=0;
void tablero();
void tablero(){
cout << "\t\t\t 1 2 3"<< endl
<< "\t\t\t " << V << " " << V << " " << endl
<< "\t\t\tA " << a1 << " " << V << " " << a2 << " " << V << " " << a3 << " " << endl
<< "\t\t\t " << V << " " << V << " " << endl
<< "\t\t\t " << H << H << H << H << H << C << H << H << H << H << H << H << C << H << H << H << H << H << endl
<< "\t\t\t " << V << " " << V << " " << endl
<< "\t\t\tB " << b1 << " " << V << " " << b2 << " " << V << " " << b3 << " " << endl
<< "\t\t\t " << V << " " << V << " " << endl
<< "\t\t\t " << H << H << H << H << H << C << H << H << H << H << H << H << C << H << H << H << H << H << endl
<< "\t\t\t " << V << " " << V << " " << endl
<< "\t\t\tC " << c1 << " " << V << " " << c2 << " " << V << " " << c3 << " " << endl
<< "\t\t\t " << V << " " << V << " " << endl << endl;
}
int main(){
while (1){
if(i%2==0){ jug=1; turno='X'; }
if(i%2==1){ jug=2; turno='O'; }
tablero();//Llama al tablero para llenarlo con las sentencias? Esto si no lo entiendo mucho.
if ((a1!=' ')&&(a2!=' ')&&(a3!=' ')&&(b1!=' ')&&(b2!=' ')&&(b3!=' ')&&(c1!=' ')&&(c2!=' ')&&(c3!=' ')) win=0;
if ((a1!=' ')&&(a1==a2)&&(a1==a3)) win=1;
if ((a1!=' ')&&(a1==b1)&&(a1==c1)) win=1;
if ((a1!=' ')&&(a1==b2)&&(a1==c3)) win=1;
if ((b1!=' ')&&(b1==b2)&&(b1==b3)) win=1;
if ((c1!=' ')&&(c1==c2)&&(c1==c3)) win=1;
if ((a2!=' ')&&(a2==b2)&&(a2==c2)) win=1;
if ((a3!=' ')&&(a3==b3)&&(a3==c3)) win=1;
if ((c1!=' ')&&(c1==b2)&&(c1==a3)) win=1;
if (win==0) cout << "\t\tEmpate.\n\n";
if (win==1) cout << "\t\tGanó el jugador " << jug << " (" << turno << "), ¡felicidades!\n\n";
if ((win==0)||(win==1)){
cout << "\t\t¿Desea volver a jugar? [S\\N] - ";
cin >> again;
while((again!='s')&&(again!='S')&&(again!='n')&&(again!='N')){
cout << "ERROR: Responda sólo con S(Sí) o N(No)...\n\n"
"\t\t¿Desea volver a jugar? [S\\N]";
cin >> again;
}
switch(again){
case 's':case 'S':
a1=' ',a2=' ',a3=' ',b1=' ',b2=' ',b3=' ',c1=' ',c2=' ',c3=' ',win=-1,i=0;//¿Por qué llama a estas variables? ¿Para reiniciar juego?
tablero();
break;
case 'n':case 'N':
return 0;
break;
}
}
cout << "\t\tTurno del jugador " << jug << " ("<< turno << ") ...\n\n"
"\t\t¿Dónde desea colocar su ficha? - ";
cin >> ficha;
if (ficha==" ");
else if (((ficha=="a1")||(ficha=="A1"))&&(a1==' ')) a1=turno;
else if (((ficha=="a2")||(ficha=="A2"))&&(a2==' ')) a2=turno;
else if (((ficha=="a3")||(ficha=="A3"))&&(a3==' ')) a3=turno;
else if (((ficha=="b1")||(ficha=="B1"))&&(b1==' ')) b1=turno;
else if (((ficha=="b2")||(ficha=="B2"))&&(b2==' ')) b2=turno;
else if (((ficha=="b3")||(ficha=="B3"))&&(b3==' ')) b3=turno;
else if (((ficha=="c1")||(ficha=="C1"))&&(c1==' ')) c1=turno;
else if (((ficha=="c2")||(ficha=="C2"))&&(c2==' ')) c2=turno;
else if (((ficha=="c3")||(ficha=="C3"))&&(c3==' ')) c3=turno;
else {
cout << "\n\t\tERROR: plaza ocupada o inexistente...\n"
"\t\tPulse 'ENTER' y vuelva a colocar su ficha...";
cin.get(); cin.get();
i--;
}
i++;
}
}
Bueno, eso no lo he hecho yo, apenas estoy viendo la lógica de todo esto, pero lo veo bastante ineficiente en el sentido de que usa demasiadas sentencias if para pocas cosas y porque creo que el trabajo podría simplificarse en una matriz, aunque no tengo buen dominio sobre matrices (o arreglos bidimensionales) y no logro darle bien la vuelta al asunto.
Una de las ideas es con la validación para la victoria, que veo bastante extraña ya que está verificando cada posición, si cada una es llenada con el valor de otras en cierto patrón se cumple una condición de victoria, que sería win=1. Yo veo más simple verificar condiciones en distintos turnos, osea el 3cer turno, 6to turno y 9no turno que es donde se puede dar una victoria (en los dos primeros) y/o una victoria/empate en el último ¿O me equivoco?
Y la parte de la matriz si que me confunde como hacerla, realmente no domino casi nada ese asunto.