Ola pessoal! Esta e a primeira parte de uma serie de posts sobre Algoritmos Geneticos (GA).Atualmente existe bastante material sobre GA espalhado pela rede, poremboa parte deste material e teorico ou muito especializado, o que acaba frustrando quemdeseja aprender mais sobre o assunto.Tambem vejo muitos iniciantes encontrando dificuldades paraimplementar uma versao do Tetris. Ja vi de tudo: pecas sumindo do nada, blocos sendo abduzidos, etc... Por essas e outras decide juntar os dois assuntos de maneira pratica: implementando umaA.I. que jogue Tetris decentemente. A definicao de decentemente varia, porem vamos tomar como base o seguinte: a A.I. deve jogar de maneira parecida com a humana, aplicando as estrategiasbasicas do game (que logo serao discutidas). Introducao O objetivo e simples: implementar um agente Tetris, que faca o maior numero possivel de linhas.Fatores como tempo e velocidade das pecas serao desprezados, vamos assumir que o agente seja rapido o suficientemover a peca na posicao desejada. Neste post iremos implementar o cliente Tetris: as classes TetrisPiece e TetrisBoard darao conta da logica do game. A classe GamePanel implementa a GUI e aceita input do teclado, assim poderemos testar o game e ter certeza de que tudo funciona perfeitamente.No proximo post iremos implementar a estrutura do agente Tetris, definindo as classes TetrisAgent, TetrisMove, MoveSearcher, BoardEvaluator e AIGame.Maos a obra!Classe TetrisPiece Toda peca possui um tipo, rotacao e posicao. A variavel blockSize, apesar de nao ser necessaria, especifica o tamanho dos blocos que formam a peca, e consequentemente define a unidade de deslocamento. Essa variavel em geral e hard-coded como 1, mas ao definir um valor teremos a flexibilidade de construir a GUI especificando o numero de linhas, colunas, e o blockSize, assim o tamanho do Panel sera calculado automaticamente. A constante de classe PIECE_SIZE = 5 nos permite fazer uso de simetria. Cada peca possui um bloco pivo de rotacao, e ao definir PIECE_SIZE = 5 ao inves de PIECE_SIZE = 4, esse pivo e fixado (o bloco central de um quadrado de 25 blocos), o que facilitara o posicionamento das pecas no inicio do game. A constante de classe BLOCKS_PIECE = 4 nos diz quantos blocos serao efetivamente desenhados por peca, ou seja, Tetris = 4 blocos, Pentris = 5 blocos, etc. A array TRANSLATIONS sera usada no posicionamento inicial, e indica o offset (medido em blockSize) necessario para centralizar a peca. A array PIECES define a estrutura de cada peca, assim como COLORS define a cor. As variaveis TRANSLATIONS e PIECES usarao kind e rotation como indices de acesso. E possivel calcular a rotacao algebricamente, mas devemos lembrar que estes metodos serao chamados milhares de vezes por segundo. Ao usar valores hard-coded a estrutura das pecas e calculada uma unica vez, assim que a classe e carregada. Quais sao os metodos da classe? Alem dos metodos que possibilitem movimento e rotacao, um objeto TetrisPiece deve ser capaz de desenhar a si mesmo, dado um contexto grafico. O metodo mais interessante da classe, boardIndexes, nos diz quais os indices (linha, coluna) ocupados por determinada peca, dado a rotacao e a posicao. Normalmente, esse metodo nao