Bien... no estoy seguro, y que me corrija alguien si me equivoco pero creo que el fallo es el siguiente:
Tu le pides a scanf que te tome algo y lo trate como numero. Si le pasas una letra, scanf la coje y no la coje, es decir , acepta la entrada y la trata como numero, y vuelve a por un numero, pero la letra sigue alli (no ha avanzado en el buffer de entrada por que no tomo un numero), asi que la coje y vuelta a empezar. De ahi que te muestre infinitos mensajes.
La naturaleza del mensaje quizas sea debida a que en cada vuelta redeclaras las variables, y recuerda que C no las inicializa por defecto, asi que valen cualquier cosa (y posiblemente en entero sea mayor que 100). Para comprobar lo que te digo, haz un printf("%d\n", a); despues de cada comprobacion, y asi ves lo que has metido al pulsar la letra (yo lo he hecho y 'w' -> 4008536).
La solucion a este problema es algo complicada : leer los numeros como caracteres. No es complicada en si, aunque si que añade bastante codigo para algo que seria tan facil si el usuario no fuera tan torpe ^__^
Una cosa mas:
donde pone
printf("Volver a jugar(s/n):");
scanf("%d",B);
supongo que es un :
printf("Volver a jugar(s/n):");
scanf("%d",b );
y deberia ser un
printf("Volver a jugar(s/n):");
scanf("%c",&b ); <------- b lo has declarado como char!!
aunque de todos modos no entiendo por que lo haces, si en el switch haces un b = getchar()
Espero haberte ayudado