Объясните почему работает именно так?
Похоже это сделано, чтобы убрать возможные дубли. Нажмите на кнопку клавиатуры и держите, вы увидите, что будет напечатана не одна буква, а серия. И вся эта серия улетит в System.in. 
Вот и получается либо нужно пропустить все что идёт за первой буквой, либо на экране будет несколько сообщений подряд о том что попытка отгадать провалилась. Т.е. тут как бы расчищается дорога для следующей попытки.
Сначала считывается первый введенный символ и сохраняется в пееременную ch:
ch = (char) System.in.read();
Затем в цикле пропускается все что вводится с клавиатуры пока не будет нажата клавиша переноса строки.
Сделано видимо для того чтобы для определения правильный ли был дан ответ использовался только первый введенный символ (то есть переменная ch).