Posts Profissionais

Implementando Gamification com PHP

Em maio de 2015, o Átila Braga, organizer do Google Developers Group de Juiz de Fora foi ao Google I/O em San Francisco e também ao GDG Global Summit, uma conferência onde os organizadores de GDG do mundo inteiro discutem seus problemas, sucessos, etc. Um ponto que foi apresentando como maior dificuldade foi o engajamento dos participantes dos grupos. A solução proposta foi a utilização de um modelo de gamification nos grupos, de forma que as pessoas ganhassem pontos, badges (medalhas) e reconhecimento ao participar mais ativamente.

Resolvi então buscar uma solução, implementando algo em PHP que pudesse se integrar ao meu banco de dados atual de usuários. Das soluções que encontrei, optei pela mais simples e objetiva, fiz um fork da GenGamification.

Melhorei o código do projeto, deixando mais desacoplado e mais fácil de adaptar a qualquer banco de dados existente. Criei então o PHPGamification como “Framework genérico para Gamification em PHP simples e objetivo“. Com ele fica fácil criar níveis, badges e dar pontos aos usuários, de acordo com suas ações.

O resultado final (o ranking) você pode acessar em no Gamification do GDGJF.

Como criar um projeto PHP com Gamification

Aqui vão os quatro passos para implementar o PHPGamification no seu projeto:

1 – Baixe o código e crie as tabelas

Acesse o repositório no GitHub e faça o clone, ou apenas o download mesmo. Abra o arquivo database.sql e execute o script em seu banco de dados. Ele irá criar tabelas prefixadas com gm_, para não ficarem espalhadas entre as suas. Abra o exemplo contido na pasta /sample/ e leia com atenção, tudo o que você precisa saber está ali.

2 – Faça o setup das regras

Agora você precisará criar os Níveis, Badges e Eventos:

 


/** Definir Badges */
$gamification->addBadge('newbee', 'Newbee', 'You logged in, congratulations!');
$gamification->addBadge('addict', 'Addict', 'You have logged in 10 times');
$gamification->addBadge('professional_writer', 'Professional Writer', 'You must write a book! 50 posts!!');

/** Definir Níveis */
$gamification->addLevel(0, 'No Star');
$gamification->addLevel(1000, 'Five stars', 'grant_five_stars_badge');// Execute event: grant_five_stars_badge
$gamification->addLevel(2000, '2K points!');

/** Definir Eventos */

// Welcome to our network! (disallow reachRequiredRepetitions)
$event = new Event();
$event->setAlias('join_network')
->setEachPointsGranted(10)
->setAllowRepetitions(false); // Just one time
$gamification->addEvent($event);

// Each Login/Logged in 10 times (25 points each time, 50 points when reach 10 times)
$event = new Event();
$event->setAlias('login')
->setEachPointsGranted(25)
->setEachBadgeGranted($gamification->getBadgeByAlias('newbee'))
->setReachRequiredRepetitions(10)
->setReachPointsGranted(50)
->setReachBadgeGranted($gamification->getBadgeByAlias('addict'));
$gamification->addEvent($event);

// Each post to blog/You wrote 5 post to your blog (100 points each + badge, 1000 points reach)
$event = new Event();
$event->setAlias('post_to_blog')
->setEachPointsGranted(150)
->setEachCallback("MyOtherClass::myPostToBlogCallBackFunction")
->setReachRequiredRepetitions(50)
->setReachBadgeGranted($gamification->getBadgeByAlias('professional_writer'));
$gamification->addEvent($event);

 

Pronto. Com as configurações acima posso dizer que com os eventos “join_network”, “login” e “post_to_blog” darei alguns pontos e medalhas para os usuários.

3 – Informe o usuário e execute os eventos

Por fim, é a hora de fazer o jogo acontecer. Para dizer que o PHPGamification irá trabalhar com os dados de um usuário qualquer, faça a chamada abaixo informando o ID do seu usuário, seja ele qual for.

 

$gamification->setUserId(1);

 

Dai em diante, as chamadas $gamification->executeEvent('seu_evento') é quem fazem a gamification engine funcionar, dando pontos, medalhas, trocando de níveis. Espalhe estas chamadas em seu código, nos locais onde achar necessário, para responder as ações dos usuários, tais como; comentar posts, incluir informações, atualizar o perfil, etc. No código abaixo chamarei os eventos criados anteriormente, para fins de exemplo, sendo que o login é executado ao todo 10 vezes.

 

$gamification->executeEvent('join_network');
for ($i=0; $i<10; $i++)
    $gamification->executeEvent('login');
$gamification->executeEvent('post_to_blog', array('YourPostId'=>11));

 

 4 – Exibir a pontuação e ranking no Gamification

Agora é hora de mostrar quantos pontos o usuário tem, quais eventos executou, suas medalhas, etc. Para isso existem vários métodos; getUserScores(), getUserBadges(), showUserLog() e getUserEvents(). Cada um deles trará uma porção das informações referentes ao usuário. Se preferir obtenha um array com todos estes dados juntos:

 

var_dump($gamification->getUserAllData());

 

Finalmente, para exibir seu ranking de usuários chame:

 

 var_dump($gamification->getUserScores());

 

Game over

Espero que estas classes te ajudem a implementar seu Gamification com sucesso! Em caso de duvidas, comente aqui, no repositório ou entre em contato! Boa sorte!

GDGJF – Ranking com perfis de usuários na página do Google Developers Group de Juiz de Fora
PHPGamification
– Repositório no GitHub onde você pode encontrar mais informações sobre como utilizar a biblioteca.