Como crio IDs de jogos únicos e amigáveis?

11

Como crio IDs de jogos exclusivos, que também são amigáveis ​​ao usuário - para que um usuário possa facilmente fornecer esse ID de jogo a alguém por ingressar no jogo.

Estou criando meu jogo no Silverlight com c #.

Zain Shaikh
fonte
3
Isso é menos resposta, portanto, comentário ruim. Eu usei um sistema de 2 chaves. Eu gerei uma chave exclusiva (UUID) que eu armazeno internamente. Muito parecido com isto: 39d7e998-e654-4f8b-9e4b-0e61fe9eaf65. Depois de criar um ID único, os amigos do jogador podem encontrar seu perfil pesquisando seu apelido e usando as 4 primeiras letras. Se eu vejo colisões, posso fazer os primeiros 5 ou 6. Fazendo sua chave exclusiva 39d7e. Obviamente, isso é público (os personagens), para que seus amigos possam adicioná-lo diretamente e ajuda a especificar quando você faz jogos por mensagem instantânea ou bate-papo.
Underscorediscovery
Por quanto tempo as chaves precisam permanecer válidas? Isso influenciaria o quão único eles precisam ser e se você pode reutilizar chaves antigas ou não.
Tim Holt
@ Tim as chaves podem ser válidas por no máximo 2 horas.
Zain Shaikh

Respostas:

6

Se você tem uma fonte autorizada, esse problema é fácil (que eu suponho que se o usuário estiver colocando um ID para se conectar a um jogo, isso será redirecionado usando um servidor central). Basta usar um algoritmo como http://www.safepasswd.com/ para criar UIDs que são basicamente palavras do dicionário + números pequenos. Se o número de servidores for relativamente pequeno, você poderá executar um algoritmo ingênuo que seleciona algo aleatório até que não esteja em uso no momento.

Se você deseja que seus clientes sejam a fonte dos UIDs, terá que jogar fora a parte amigável desses IDs. Mas é mais fácil fazer isso no lado da codificação, já que você usaria System.Guid.NewGuid (). ToString (). Isso é para todos os efeitos e com garantia de ser exclusivo 100% do tempo. fonte

Por outro lado, os GUIDs são um pouco exagerados. Seria mais fácil lembrar IPs ou nomes de usuários b

Tetrad
fonte
bom, acho que devo usar nomes de usuário, pelo menos eles não serão duplicados e são fáceis de usar. Obrigado :)
Zain Shaikh
3

Uma abordagem seria usar um dicionário e selecionar palavras com base em um esquema de numeração. Talvez use um número inteiro de 32 bits exclusivo para identificar cada usuário e, para cada uma das palavras de 16 bits, indexar um dicionário (matriz de palavras). Dessa forma, você pode representar seu ID usando palavras reais e cada identificador seria único.

Outra abordagem seria implementar algo semelhante ao que o Steam usa: permitir que os usuários efetuem login com um ID que eles mesmos escolheram e, posteriormente, especifique qualquer ID de exibição que eles desejem. Por exemplo, o ID de login pode ser o email e o nome de exibição pode ser o primeiro nome. Dessa forma, o usuário pode compartilhar seu identificador exclusivo, mas também ser identificado por um nome de sua escolha.

reverbb
fonte
obrigado por sua sugestão, agora usarei nomes de usuário como chave exclusiva, conforme sugerido pelo @Tetrad.
Zain Shaikh
3

A resposta de FuzzYspo0N nos comentários é muito boa. Basicamente, esse problema se resume a tornar os códigos de jogo exclusivos o suficiente para evitar colisões, sem torná-los arbitrariamente complexos. Os GUIDs padrão de 128 bits obtêm sua exclusividade usando informações locais (como o MAC e outros fatores) para reduzir muito a probabilidade de uma colisão entre máquinas e, em seguida, adicionar um fator aleatório e baseado no tempo para aumentar a probabilidade de colisão dentro dessa máquina. muito pequeno.

Você pode seguir a mesma estratégia para gerar seus próprios IDs. Comece com algo memorável para o usuário, mas relativamente exclusivo (se o usuário tiver um nome de usuário global que seja um bom começo ou o nome da máquina / IP) e adicione outros fatores até gerar algo único. Ao escolher algo local como o nome da máquina, você restringe o conjunto de possíveis colisões o suficiente para poder começar a consultar se há alguma. Por exemplo, depois de restringi-lo apenas a esse usuário ou a essa máquina, você sabe exatamente onde precisa ir para verificar se esse UID já está em uso.

Por exemplo, se eu souber que meu nome de usuário é único em todo o sistema, MrCranky: 1 é um UID válido. Se eu puder verificar se MrCranky: 1 já está em uso (por algum outro método), continuarei tentando números até encontrar um único.

Usando algum outro fator (como aleatoriedade ou tempo), posso aumentar a probabilidade de escolher um ID não utilizado pela primeira vez. Por exemplo, se você sabe que não é possível criar mais de uma sessão por segundo, usar MrCranky: 122730 (o horário atual, o segundo) me proporcionará um ID exclusivo que é relativamente memorável para o usuário.

Desde que você tenha alguma informação relativamente única (não precisa ser perfeita, apenas a maioria exclusiva), você pode usá-la como um bloco de partida, e isso significa que a parte verdadeiramente exclusiva (um código inteiro de algum tipo) pode muito mais curto e, portanto, o UID é mais memorável.

MrCranky
fonte
obrigado por sua sugestão, agora usarei nomes de usuário como chave exclusiva, conforme sugerido pelo @Tetrad.
Zain Shaikh
0

Você pode usar o endereço de e-mail de um jogador como um identificador exclusivo. Tenho certeza que eles podem se lembrar disso :)

adamk
fonte
obrigado por sua sugestão, agora usarei nomes de usuário como chave exclusiva, conforme sugerido pelo @Tetrad.
Zain Shaikh