Olá, espero que esteja tudo bem!
Gostaria de deixar uma sugestão, somente a critério de curiosidade ;)) Gostei bastante do conteúdo
De acordo com o conhecimento que eu tenho do tema, vi que foi utilizada a estratégia de criar uma variável nullable para receber o valor posteriormente da instância do jogo, nesse caso, poderia ter sido feito o retorno do valor do jogo ao final da execução do runCatching para evitar complexidade de tratamento de nulos.
fun main() {
    val getGameRunCatching = runCatching{
        println("Enter a game id")
        val scanner = Scanner(System.`in`);
        val gameId = scanner.nextLine();
        val data = CheapSharkDataSource().getGame(gameId)
        val game = Game(data.info.title, data.info.thumb)
        return@runCatching game
    }
    getGameRunCatching.onSuccess {
        game -> print(game)
    }
    getGameRunCatching.onFailure {
        print("It was not possible to retrieve the game with the entered id.")
    }
}
 
            