Debes comprobar antes del "switch(ficha){" que la casilla esté libre...
Para el tablero deben usarse 3 valores, con estos 2 significados:
- Casilla vacía: por ejemplo un espacio en blanco. Es lo que debe haber al comienzo del juego.
- Casilla ocupada: casilla ocupada. Y para ello se usan dos valores '0' y 'x', cada una identifica un jugador distinto.
Por tanto cuando el jugador elija una casila, antes de intentar asignar el valor de casilla ocupada, debe consultarse si está libre. Sólo si está libre se consigna el valor ocupado, correspondiente al jufador que tiene el turno.
Un pseudocódigo del juego... estúdialo a fondo, es simple y trata de implementarlo.
enumeracion FinalesPosibles
FINAL_JUGAR = 0 // quedan casillas or jugar.
FINAL_GANADO =1 // ganó el jugador actual
FINAL_TABLAS=2 // resultado en tablas.
fin enumeracion
arraychars Tablero(3,3)
funcion JugarPartida
caracter jugador, espacio
entero casilla, fila, columna
buleano vacia
finalesposibles finpartida
espacio = " "
// jugador ="X" // empieza el jugador 0, ya que nada más empezar cambia el turno al otro jugador.
finpartida = FINAL_JUGAR
// Dibujar el tablero vacio y vaciar el contenido del tablero actual
bucle para x desde 0 a 2
bucle para Y desde 0 a 2
tablero(x,y) = espacio
dibujar(x,y, espacio)
fin bucle
fin bucle
Hacer // jugar por trnos hasta final de partida.
// cambiar el turno del jugador
si jugador = "0" luego
jugador = "X"
Sino
jugador ="0"
fin si
Hacer // pedir casilla libre al jugador actual
casilla = PedirCasillaAlJugador(entre 0 y 8) //OJO: 0-8, no 1-9
columna = (casilla modulo 3)
fila = (casilla \3) //división entera
vacia = ( Tablero(columna, fila) = espacio)
Repetir mientras vacia = FALSE // casilla = ocupada
Tablero(columna, fila) = jugador // jugador y el valor que se coloca, es lo mismo.
dibujar(columna, fila, jugador) // dibuja en el tablero la apuesta del jugador.
finpartida= TresEnRaya(jugador) // descubrir si hay 3 en raya en alguna posicion (horizontal vertical, diagonal).
Repetir mientras (finpartida = FINAL_JUGAR)
// si alguien se alzó con la victoria se proclama.
Si (finpartida = FINAL_GANADO) luego
mensaje "La partida acabó con victoria del jugador que jugaba con la ficha: " + jugador
Sino
mensaje "La partida acabó en tablas."
Fin si
fin funcion
Dibujar (x, y, valor) es una función que dibuja el valor consuignado en la casilla que se indica.
Pero si te resulta complicado, dibujar una sola casilla, puedes optar por redibujar el tablero entero, no requiriendo al caso ningún parámetro.
finalesposibles = TresEnRaya(valor), es una función que escruta sobre el array si hay tres en raya del valor recibido ("X", ó "0"), si lo hay devuelve un valor 1 (ganado), si no lo hay todavía escruta si queda alguna casilla libre donde jugar, si no lo hay devuelve un valor 2 (tablas), si quedan casillas libres para jugar, devuelve un valor 0 (jugar)... es decir devuelve un valor de la enumeración: finalesPosibles...
Como sabes, 3 en raya puede ser en horizonbtal, vertical o diagonal... comprueba cada línea, horizontal, cada línea vertical y las 2 diagonales, cada una son 3 pares de cordenadas, que puede derivarse a una segunda función...
finalesposibles = Funcion TresEnRaya(valor)
si Correcto3(0,0,1,0,2,0, valor) = TRUE luego
Devolver FINAL_GANADO
fin si
... el resto queda a tu esfuerzo...
fin funcion
Buleano = Correcto3(x1, y1, x2, y2, x3, y3, valor) es una función que recibe 3 pares de cordenadas y devuelve TRUE, si las 3 tienen el mismo valor que el recibido.
dándote la primera de las llamadas, ya te faltan solo completar, 2 líneas horizontales, las 3 verticales y las 2 diagonales... la primera te sirve de guía.
Y aquí lo que sería el pseudocódigo de dicha función:
buleano = Funcion Correcto3(x1, y1, x2, y2, x3, y3, valor)
Si Tablero(x1, y1) = valor
Si Tablero(x2, y2) = valor
Si Tablero(x3, y3) = valor
Devolver TRUE
fin si
fin si
fin si
Devolver FALSE
fin funcion
PedirCasillaAlJugador, es una función que reclama un valor entre 0 y 8, no debe admitir ningún otro.