Логика работы верна. Решил косяк за зависаниями - в методе setClickableButton() необходимо помимо установки листенеров для кликабельных кнопок необходимо также сбрасывать листенеры для некликабельных кнопок. Из-за того, что листенеры не сбрасывались на одной кнопке скапливалось 100500 листенеров и програма подвисала при обработке события несмотря на верную логику самой игры. Осталось прикрутить вынесение решения о победе и отполировать прогу.