tu digo algo... tu codigo es casi ilegible son 1500 lineas de condicionales... con ciclos y matemática te hubieras ahorrado por lo menos 1000lineas
switch(x)
{
case 'a':
i=0; j=0; k=0;
if(a[i][j][k]=='X' || a[i][j][k]=='O')
{
ocupado++;
printf("Ingrese otro caracter distinto a 'a'!\n"); }
break;
ahí puedes ajustar 'a' como 0 y avanzar desde allí transformando a ternario
base = x-'a';
int i, salida[3];
for(i=2; i>=0; i--){
salida[i] = base%3;
base/=3;
}
si hubieras hecho algo así te ahorras todo el contenido de los los switch... si te fijas, salida contiene tu posición en 3d... los if de comprobación va por los mismos tiros...
sin contar que creo que estas funciones hacen virutalmente lo mismo
void introducir_X_n1();
void introducir_X_nvsPC();
void introducir_O();
void introducir_O_IA();
void introducir_O_IA_n3();
justamente la intención de las funciones es no repetir código en lo posible
no te ayudo con tu solicitud ya que no tengo idea cual es el juego del gato y despues de intentar leer tu codigo, tanpoco pude deducirlo... pero espero que eso te ayude