Grande Parcelo. Tudo tranquilo?
Eu imagino que você já deve ter usado em algum dos seus códigos o import. Creio que na implementação do seu jogo, você deve ter feito algo do tipo:
import random
Quando você escreve no seu código dessa forma, você está querendo que o seu código pegue o código que está escrito em algum arquivo (módulo) entre os vários arquivos (módulos) instalados com o Python e está fazendo com que esse código que já foi escrito antes, rode no seu código ao invés de ter que escrevê-lo tudo de novo, nesse caso o random.
Bom, o que isso significa? Significa que quando você importou o módulo random, ele deixou de ser um script "independente" e passou a depender do seu código para que ele possa ser executado, ou seja, o seu código passou a ser o principal (main) arquivo de execução do programa para que o módulo random possa ser executado também.
Logo, podemos deduzir que a variável main, no Python, refere-se ao código que é "chamado", seja pelo terminal ou por um IDE, e que pode importar ou não outros módulos.
A variável name refere-se ao nome dado aos arquivos (módulos) que já vem instalados nativamente no Python ou são criados pelo usuário (Isso mesmo! o script que você cria também é considerado um módulo em Python). E ao colocar o trecho da condicional:
if __name__ == "__main__":
Você está dizendo ao Python o seguinte: - "Python, verifica se esse arquivo é o principal, ou seja, o script que contém o código responsável por funcionar o programa e, caso seja, faz esse comando...". O que nesse caso você pede para que seja chamada a função jogar( ).
Espero que tenha entendido até aqui.
Quanto ao fato do porquê esse trecho de código não vem no início do script se deve ao fato de que, por lógica, assim como o Python lê um script linha após linha começando da parte superior esquerda até o último caractere que esteja localizado na parte inferior mais a direita (a forma como a grande maioria das pessoas leem qualquer escrita), é necessário que primeiro se crie a função com todos os seus comandos e depois ela é invocada. Ou seja, chamar por algo que ainda não foi declarado, obviamente, vai dar erro.
Em resumo, o uso é opcional e é mais usado quando se tem mais de um arquivo (módulo) contendo código em Python e que se quer deixar explicito qual é o arquivo principal e qual é o "dependente".
Espero que tenha ajudado a entender e compreender.