Muito além dos boletos: Eu me divirto com PHP.
Uma aura de vergonha paira no ar quando alguém fala que programa em PHP. Alguém sempre solta um comentário como "Eu já paguei muito boleto com PHP". Meu amigo Matheus, manda sempre "O PHP me deu a minha moto". É Como se a linguagem de programação presente em mais de 70% dos websites do globo precisasse de algum endosso ou como se o programador não fosse talentoso e precisasse sacar a carta do "PHP dá dinheiro".
Eu sempre me pergunto se por ventura eu sou o último mortal que ainda se diverte programando em PHP.
Por ser uma linguagem muito fácil, sempre que eu quero testar uma ideia, vou direto pro PHP, simplesmente porque do zero à ter algo funcionando, não preciso fazer muita coisa. Acho que provavelmente este é o mesmo motivo que as pessoas usam Python.
Quando montei minha palestra para o DevPira, "Muito além dos boletos: PHP para quem quer gostar do que faz", trabalhei o conceito de 3 pilares: Propósito, Diversão e Recompensa, que chamei - na brincadeira - de "Framework Além dos Boletos".
Me divertindo com PHP
Pra ilustrar como eu me divirto com PHP, decidi implementar um Machine Learning BEM RUDIMENTAR com base em um vídeo do Matt Parker - top 3 na minha lista de youtubers favoritos - sobre o MANACE, um ML usando caixas de fósforo para jogar jogo da velha.
O conceito é bem simples: Cada caixinha guarda um estado possível e para cada estado existe um número de jogadas válidas. Cada jogada recebe uma quantidade de pedrinhas. Cada movimento da partida é registrado, e ao final do jogo, caso o jogador tenha ganho, as jogadas da partida são recompensadas adicionando mais pedrinhas ao movimento vencedor. Ou punidas removendo-se pedrinhas do movimento perdedor.
O Jogo.
Só eu ganho é um jogo de brincadeira onde, apesar das regras simples, quem sabe jogar tem uma vantagem absurda sobre quem não sabe.
O jogo começa com 3 linhas: uma com 3, outra com 4 e outra com 5 peças (sachês de condimentos, palitos de fósforo, bolinhas de papel, etc).
x x x
x x x x
x x x x x
Você só pode retirar peças de uma única linha por vêz. Quantas peças quiser, desde que seja de uma única linha.
Ganha quem deixar somente uma peça no tabuleiro.
A implementação
Criei a interface que pude pensar mais rapidamente - sou programador backend e não programo ainda em nenhum framework JS moderno.
Confesso que do lado do PHP fiz tudo muito rapido também (acho que não foram 4 horas no total, entre a ideia e a implementação que foi apresentada na palestra. Então tem muita coisa bem estranha por lá, mas tentei mantes o código mais limpo possível. Refatorou? Manda um PR =)
Base do jogo
A classe base do jogo SoEuGanho
(lib/SoEuGanho/SoEuGanho.php
) contem um único método relevante: getPossibleMoves(array $board)
, onde board é um array com o número de pedras em cada linnha. Ex: [3,4,5]
.
O aprendizado
Quem aprende mesmo é o ComputerPlayer
(lib/SoEuGanho/ComputerPlayer.php
).
O computador escolhe a jogada e salva o histórico (estado do board e jogada escolhida).
public function play(array $board): array
{
$move = $this->learnedPlay($board); // Random play considering weight
$this->addHistory($board, $move); // The game history
return $move;
}
Ao final do jogo o computador aprende e limpa o histórico.
public function end(int $winnerPlayerNumber): void
{
$win = $winnerPlayerNumber === $this->playerNumber;
**$this->learn(win: $win);**
$this->saveResult($win); // Stats
$this->clearHistory();
}
O aprendizado varre todas as jogadas da partida e incrementa ou decrementa o rating de acordo com os pontos definidos nas constantes.
public function learn(bool $win): void
{
$history = $this->getHistory() ?? [];
$rating = $win ? self::REWARD_POINTS : self::PENALTY_POINTS;
foreach($history as $move) {
$this->updateMoveRating($move['board'], $move['move'], $rating);
}
$this->saveResult($win);
}
Mais sobre tudo isso
Código-fonte: https://github.com/andreimosman/SoEuGanho/
Vídeo de Inspiração: MENACE: the pile of matchboxes which can learn
Embora tenha feito um treinador para facilitar os testes e acelerar o aprendizado, estou treinando o game só com humanos em https://soeuganho.com.br . Se alguém gerar um gráfico do aprendizado, crie um pool request, por favor. =)
Se alguém puder, jogue um pouco no meu site pro maquinão aprender.
Um pouco da minha história.
Programo desde os 14 anos. Comecei com DBase III Plus e depois Clipper. A primeira vez que alguém acreditou que eu era um programador e me contratou foi neste mesmo longíncuo 1994 (Sou de 80).
Instalei meu primeiro linux em algum momento entre o final de 1996 e o começo de 1997: Slackware. Comecei a programar em Perl e em 1999 comecei a programar no saudoso PHP3.
Assim, segui programando e me divertindo. Em várias linguagens, vários experimentos, mas sempre me divertindo.
Ah, tb sou voluntário na WebForest.