hola, esto es una primicia, jejejeje xD
resulta que en otro foro estan haciendo un reto, hay que diseñar un tateti, pues bien, yo lo programe, pero la fecha de entrega es el 15 de enero, y hoy es 26 de diciembre xD
aca esta el code, es largo xD:
/********************************************************/
/*ta te ti, 3 en raya o como quieran llamarlo xD
by Ni0
***************************
explico ahora como funciona mi IA, para que tengan una idea
lo que hago es poner en un tateti aparte (llamado calculo)
un numero en cada casilla, la que tenga el mayor numero va
a ser la "elegida", como obtiene ese numero? bueh, al
principio pone todo en 0, despues se fija en cada columna
y fila y diagonales la cantidad de espacios libres y se
lo suma a los espacios vacios, ejemplo:
si en la primera fila esta:
(vacio) | X | (vacio)
a 0; 0 se le va a poner sumar 2, a 1; 0 se deja en 0 y a
2;0 se le suma 2, y lo mismo para cada fila columna, etc.
pero hay un "bonus", este bonus es para que si hay 2 fichas
de la pc juntas la ponga a continuacion para ganar, sino, la
pondria en un espacio libre xD, este bonus tambien es para
cuando hay fichas del jugador, para que no gane, como funciona
el bonus? por cada ficha enemiga que haya a su vez se le suma
(aparte de 1 por cada libre) el valor de USM, asi digamos que
le aumenta el valor para que prefiera ponerla ahi, y por cada
ficha de la PC le suma PCM, que tiene un valor mayor
(asi tiene prioridad de ganar xD)a su vez, si hay una ficha
del jugador y en la misma fila columna o diagonal una de la pc
pone al espacio vacio en 1 (ya que si lo pusiera no podria ganar
ni perder xD), a su vez, para corregir algunas estupideces que
hacia el programa, hice que si hay 2 fichas enemigas, al espacio
vacio le suma USM * USM (osea USM al cuadrado xD) y lo mismo para
la pc, cuando hay 2 de la pc en la misma fila o columna o diagonal
le suma PCM * PCM (osea PCM al cuadrado xD)
otra cosa mas, para que no pase que el usuario haga algo como:
O |1;0|2;0
-----------
0;1| X |2;1
-----------
0;2|1;2| O
y que la pc ponga en 0;2 por lo que el usuario tiene que poner en 2;0
y la pc pierda, puse un contador de jugadas, si se hicieron tres jugadas
y le toca a la PC, se fija si se dio una condicion como la anterior, si
se dio, pone la ficha en 1;0, para obligar al jugador a ponerla en 1;2
y asi la pc no perderia. Lo que acabo de decir, no se como corregirlo en
la IA, ya que si fuera por la IA, la pc pondria la ficha en 2;0...
espero que se haya entendido...*/
#include stdio.h
#define PC 10
#define US 1
#define SCALC 3 /*esto seria "Solo CALCulo, se usa en la
funcion vacia para indicar que solo vacie
calculo y no tateti*/
#define TODO 2 /*igual que el anterior pero para indicar que
vacie TODO*/
#define PCM 6
#define USM 4
int tateti[3][3];/*el tateti*/
int calculo[3][3];/*aca se hacen las cuentas de la pc*/
void mostrar(void)/*muestra el tateti, si es de la PC pone X, si puso el humano O y sino un espacio*/
{
int i, d;
printf("\n\n");
for(d = 0; d < 3; d++){
for(i = 0; i < 3; i++)
printf(" %c |", tateti[i][d] == PC ? 'X' : (tateti[i][d] == US ? 'O' : ' '));
printf("\n-----------\n");
}
}
void vacia(int op)/*por las dudas, para asegurarse de que esta en 0*/
{
int i, d;
for(d = 0; d < 3; d++){
for(i = 0; i < 3; i++){
if(op != SCALC)
tateti[i][d] = 0;
calculo[i][d] = 0;
}
}
}
int fin(void) /*calcula si alguien hiso TA TE TI*/
{
int cant = 0;
int x, y;
for(y = 0; y < 3; y++){
if(tateti[0][y] + tateti[1][y] + tateti[2][y] == (PC * 3))
return PC;
if(tateti[0][y] + tateti[1][y] + tateti[2][y] == (US * 3))
return US;
}
for(x = 0; x < 3; x++){
if(tateti[x][0] + tateti[x][1] + tateti[x][2] == (PC * 3))
return PC;
if(tateti[x][0] + tateti[x][1] + tateti[x][2] == (US * 3))
return US;
}
if(tateti[0][0] + tateti[1][1] + tateti[2][2] == (PC * 3))
return PC;
if(tateti[0][0] + tateti[1][1] + tateti[2][2] == (US * 3))
return US;
if(tateti[2][0] + tateti[1][1] + tateti[0][2] == (PC * 3))
return PC;
if(tateti[2][0] + tateti[1][1] + tateti[0][2] == (US * 3))
return US;
for(y = 0; y < 3; y++){
for(x = 0; x < 3; x++){
if(tateti[x][y] == US || tateti [x][y] == PC)
cant++;
}
}
/*no use ningun else porque cuando sea veradero algun if hay un return
por lo que es inecesario, aparte de que me parece recordar que los
else hace mas lento el codigo...*/
if(cant == 9)
return 5;
return 0;
}
void IA(int *xr, int *yr)/*va a elejir la mejor posicion y va a poner esa
posicion en xr y en yr, que van a ser x e y de
la funcion main*/
{
int co = 0;/*aca va un valor indicando que hay una ficha enemiga
o de la pc */
int max = 0;/*para saber cual es el valor maximo*/
int cant = 0;/*valor a sumarle en la casilla vacia de calculo*/
int x, y;
for(x = 0; x < 3; x++){ /*analiza las columnas*/
co = 0;
cant = 0;
for(y = 0; y < 3; y++){
if(tateti[x][y] == PC){/*si en esa pocicion hay una ficha
de la pc*/
if(co == US)/*si habia una ficha del usuario puesta
en la misma columna*/
cant = 1;/*pone en 1*/
else if(co == PC)/*si ya habia una de la pc*/
cant += PCM * PCM;/*le suma PCM al cuadrado*/
else /*si no habia nada mas puesto antes*/
cant += PCM;/*le suma PCM*/
co = PC;/*indica de que habia una ficha de la PC*/
}
else if(tateti[x][y] == US){/*si habia una del usuario...
lo mismo que el comentario
anterior, solo que con el
usuario*/
if(co == PC)
cant = 1;
else if(co == US)
cant += USM * USM;
else
cant += USM;
co = US;
}
else
cant++;/*si era un espacio vacio, le suma 1 a cant*/
}
for(y = 0; y < 3; y++){/*vuelve a analiza la columna pero esta vez
de tateti*/
if(tateti[x][y] == 0)/*si es un espacio vacio le suma cant*/
calculo[x][y] += cant;
}
}
for(y = 0; y < 3; y++){/*lo mismo que el anterior pero por fila*/
co = 0;
cant = 0;
for(x = 0; x < 3; x++){
if(tateti[x][y] == PC){
if(co == US)
cant = 1;
else if(co == PC)
cant += PCM * PCM;
else
cant += PCM;
co = PC;
}
else if(tateti[x][y] == US){
if(co == PC)
cant = 1;
else if(co == US)
cant += USM * USM;
else
cant += USM;
co = US;
}
else
cant++;
}
for(x = 0; x < 3; x++){
if(tateti[x][y] == 0)
calculo[x][y] += cant;
}
}
cant = 0;
co = 0;
for(x = 0, y = 0; x < 3; x++, y++){/*ahora analizamos la diagonal
que va de 0;0 a 2;2
y hacemos lo mismo que antes*/
if(tateti[x][y] == PC){
if(co == US)
cant = 1;
else if(co == PC)
cant += PCM * PCM;
else
cant += PCM;
co = PC;
}
else if(tateti[x][y] == US){
if(co == PC)
cant = 1;
else if(co == US)
cant += USM * USM;
else
cant += USM;
co = US;
}
else
cant++;
}
for(x = 0, y = 0; x < 3; x++, y++){
if(tateti[x][y] == 0)
calculo[x][y] += cant;
}
cant = 0;
co = 0;
for(x = 2, y = 0; y < 3; x--, y++){/*ahora con la diagonal de 2;0 a 0;2*/
if(tateti[x][y] == PC){
if(co == US)
cant = 1;
else if(co == PC)
cant += PCM * PCM;
else
cant += PCM;
co = PC;
}
else if(tateti[x][y] == US){
if(co == PC)
cant = 1;
else if(co == US)
cant += USM * USM;
else
cant += USM;
co = US;
}
else
cant++;
}
for(x = 2, y = 0; y < 3; x--, y++){
if(tateti[x][y] == 0)
calculo[x][y] += cant;
}
*xr = 0;
*yr = 0;
/*buscamos la posicion de calculo que tiene el mayor valor*/
for(x = 0; x < 3; x++){
for(y = 0; y < 3; y++){
if(calculo[x][y] >= max){/*si es mayor que el valor mayor
que se habia encontrado antes*/
max = calculo[x][y];/*le asigna ese valor a max*/
*xr = x;
*yr = y;
}
}
}
}
main()
{
int res;
char c;/*recive las opciones*/
int x, y;/*recive las coordenadas*/
do{
printf("\t\tTa Te Ti\n"
" By Ni0\n\n"
"1-nueva partida\n"
"2-salir\n");
c = getch();
}while(c != '1' && c != '2');/*para que no se ingresen valores
no deceados*/
if(c == '2')
exit(0);
do{
printf("\n\n1-Seder turno\n"
"2-ingresar coordenada\n"
"3-salir\n");
c = getch();
}while(c != '1' && c != '2' && c != '3');/*para que no se ingresen...*/
switch(c){
case '1':
vacia(TODO);/*solamente si va a jugar la vacia,
sino se estaria perdiendo tiempo...*/
tateti[1][1] = PC;/*para que no haga todas las cuentas
como es el mejor lugar...*/
c = 1;/*c va a pasar a ser un contador de jugadas*/
break;
case '2':
vacia(TODO);
c = 0;/*c va a pasar a ser un contador de jugadas*/
break;
case '3':
exit(0);
}
mostrar();
do{
do{
printf("\ningrese la coordenada(x y)(del 0 al 2): ");
scanf("%d %d", &x, &y);
}while(x > 2 || y > 2 || tateti[x][y] == PC || tateti[x][y] == US);
/*para que n o ponga una coordenada fuera de los limites ni que
ya este en uso*/
c++;
tateti[x][y] = US;
mostrar();
if((res = fin()) != 0)
break;
vacia(SCALC);
/*si se pusieron tres fichas, y...*/
if(c == 3 && ((tateti[1][1] == PC && tateti[0][0] == US && tateti[2][2] == US) || (tateti[1][1] == PC && tateti[2][0] == US && tateti[0][2] == US))){
tateti[1][0] = PC;/*para corregir algo de la IA que no se como
c++; hacer para que dentro de la ia se de cuenta xD*/
}
else{
IA(&x, &y);/*la famosa IA pone en X e Y donde va a jugar la PC*/
c++;
tateti[x][y] = PC;
}
mostrar();
}while((res = fin()) == 0);
if(res == PC)
printf("\n\t\tGAME OVER, PERDISTE");
else if(res == US)
printf("\n\t\tGANASTE, SOY UN PROGRAMADOR MALO :(");
else
printf("\n\t\tEMPATE");
getchar();
getchar();
}
/*************************************/
no se si es lo mejor, pero fue lo que se me ocurrio, y no se si se puede mejorar..
by Ni0
salu2!
26 diciembre 2007
tateti por Ni0
Publicado por
Ni0
en
17:49
Etiquetas: Codigos Fuentes en C
Suscribirse a:
Enviar comentarios (Atom)


2 comentarios:
Esta bien bueno , suerte en el concurso !!!
gracias
Publicar un comentario en la entrada