Es un juego en el que 4 jugadores deben recorrer un tablero de 30 casillas con tiradas aleatorias de 0 a 6 casillas por turno, con posibilidad de empate. El programa está hecho de modo que el tablero sea una cadena de 60 caracteres, \0 incluido, que alterna puntos y espacios, empezando por punto en la posición 0 y terminando en espacio en la posición 59 (a pesar de que efectivamente sustituya a \0 ).
Bien, el caso es que la primera vez que se ejecuta el programa, el tablero tiene 30 puntos con espacios entre ellos, y el movimiento de las fichas es perfecto, ya que sustituyen a los puntos como se espera. Todo funciona bien. Sin embargo, al repetir la partida, al final del tablero me aparecen simbolos extraños, en este caso, una 's', a la que le sigue un ';' tras la primera actualización hasta el final del bucle.
Alguno me dirá, "no pongas un espacio en la posición del \0". Si no lo pongo, en lugar de la 's', me aparece una '#'.
Otro me contestará, "aumenta el tamaño de la cadena una posición más". Si lo hago así, me aparece de nuevo la '#' pero más a la derecha.
Por tanto, deduzco que de algún modo debo limpiar mejor la cadena del tablero para que reinicie sin fallos. ¿Alguna idea? Aquí dejo el código:
Código:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
//Librerías
/*Carrera de dados, por Rockmore*/
int main(void){
char pista[60],res;
int i,a,b,c,d,dado1,dado2,dado3,dado4;
//Declaración de variables
srand(time(0));//Reinicio de semilla
do{
for(i=0;i<=58;i+=2){
pista[i]='.';
}
for(i=1;i<=59;i+=2){
pista[i]=' ';
}
i=0;
a=0;
b=0;
c=0;
d=0;//Reinicio del tablero
do{
system("cls");
printf("----------------");
printf("\nCarrera de dados");
printf("\n----------------\n\n");
printf("%s\n",pista);
printf("\n------------------------------------");
printf("\nPulsa una tecla para tirar los dados");
printf("\n------------------------------------");
getche();//Muestra de tablero a mitad de carrera
dado1=rand()%7;
dado2=rand()%7;
dado3=rand()%7;
dado4=rand()%7;//Tiradas de dados
printf("\nJugador 1 (x): %d",dado1);
printf("\nJugador 2 (o): %d",dado2);
printf("\nJugador 3 (*): %d",dado3);
printf("\nJugador 4 (&): %d",dado4);
printf("\n\n\n------------------------------");
printf("\nPulsa una tecla para continuar");
printf("\n------------------------------");//Muestra de tiradas
a=a+dado1*2;
b=b+dado2*2;
c=c+dado3*2;
d=d+dado4*2;//Reajuste para movimiento
if(a>58){
a=58;
}if(b>58){
b=58;
}if(c>58){
c=58;
}if(d>58){
d=58;
}//Reajuste para meta sobrepasada
for(i=0;i<=58;i+=2){
pista[i]='.';
}
for(i=1;i<=57;i+=2){
pista[i]=' ';
}//Limpieza de tirada anterior
pista[a]='x';
pista[b]='o';
pista[c]='*';
pista[d]='&';//Actualización de tablero
getche();
}while(pista[58]=='.');
system("cls");
printf("----------------");
printf("\nCarrera de dados");
printf("\n----------------\n\n");
printf("%s\n\n\n",pista);//Condición final del tablero
if(a==58){
printf("El jugador 1 ha llegado a la meta!\n");
}if(b==58){
printf("El jugador 2 ha llegado a la meta!\n");
}if(c==58){
printf("El jugador 3 ha llegado a la meta!\n");
}if(d==58){
printf("El jugador 4 ha llegado a la meta!\n");
}//Anuncio del ganador
if(a==b||a==c||a==d||b==c||b==d||c==d){
printf("EMPATE");
}//Condición de empate
printf("\nVolver a jugar (s/n)?");
scanf("%s",&res);//Pregunta de repetición
}while(res=='s');//Condición de repetición
}