he mirado el codigo, y a pesar de que no soy partidario de las variables globales (puedes hacer lo mismo pasando las variables como parametros a funciones) creo que el problema esta en el break de la funcion validajugada(). este break hara que salgas del for, pero en tu caso al tener 2 for, el break hara que salgas del primero (el de indice j) pero luego seguiras dentro por el otro for (el de indice i), por lo que pasaran cosas raras que no creo que quieras que pasen (entre otras, que p tome el valor 0 de nuevo).
para arreglar esto sin alterarte mucho el codigo, seria de la siguiente manera:
int validaJugada () {
int i, j;
int suma = 0;
for (i=1; i<10; i++)
{
for (j=1; j<10; j++)
{
if (i != j)
{
suma = Cartas[i] + Cartas[j];
if (suma == Dados) return 1;
}
}
}
return 0;
}
ahora bien, no se por que haces que tu funcion solo pueda devolver un 1 o un 0. y si la tirada de dados es un 8? habria dos posibles soluciones, 2+6 y 3+5, por lo que esta funcion deberia devolver 2 no? si es asi, a la que encuentres 1 posible, deberias hacer esos valores 0, y seguir buscando hasta recorrer todo el array por si acaso hay otra posible. se me ocurre hacerlo asi:
int validaJugada () {
int i, j, p=0; // p inicialmente vale 0, y si se encuentra alguna posibilidad, se cambia el valor
int suma = 0;
for (i=1; i<10; i++)
{
for (j=1; j<10; j++)
{
if (i != j)
{
suma = Cartas[i] + Cartas[j];
if (suma == Dados) {
p++;
Cartas[i]=0;
Cartas[j]=0;
break;
}
}
}
}
return p;
}
espero que alguna de las dos soluciones te sirva, un saludo!