Here’s an idea which seems complex for tabletop but for the purposes of a computer game could be programmed pretty easily.
If you roll less than 10 on your attack roll, you miss – at high levels you’ll never “miss” unless you roll a 1
If you roll between ten and their base AC from armor (say, 11 to 14) the attack is deflected
If you roll between their base armor AC and their Dex mod (say 15-16) the attack is dodged
If the enemy is using a shield and you roll within 1-2 of their AC the attack is blocked
This could be built on for other scenarios (eg. Mage Armor, rings of protection etc but you get the idea). You could even have a tactical mode (which would be truer to D&D) in which the player doesn’t know the enemy’s AC and needs to use these clues to assess how well they’re doing. If their attacks are being deflected a lot and they’re rolling reasonably well, they could deduce the enemy has a strong natural armor (as an example).
Food for thought anyway.
+1
This is a really good approach IMO. It telegraphs how close the roll actually came to hitting without having to check the combat logs, and it would help create variance in animations.