🤔 Para Refletir :
"As memórias, os sussurros, tudo vem da floresta, ela faz parte de você. E você faz parte dela."
- Yonori Akari

[tecnologia] (02/11/2015) 200º Aniversário de George Boole

Dr.XGB Masculino

O Cenourão
Administração
Administração
Jogador maluco, problemático, olho parado.
Juntou-se
21 de Julho de 2015
Postagens
570
Soluções
3
Bravecoins
2.833
Área
Programação
Motor de jogo
RPG Maker 2003
200 anos de George Boole



Hoje, dia 2 de Novembro de 2015, faz exatamente 200 anos após o nascimento do pai da Álgebra Booleana, o matemático britânico George Boole. Graças a invenção dos operadores lógicos usados nesta álgebra, você consegue aplicá-la tanto na eletrônica na construção de um bloco de circuito quanto na programação na verificação de condições ou com operações lógicas dos valores. Então pode-se notar que esse foi um dos primeiros passos para a evolução da tecnologia e da criação de diversas espécies de máquinas e, consequentemente, de jogos também.
É considerada uma data importante para quem é programador pois graças a Boole que temos a Álgebra Booleana, que é responsável por trabalhar com as funções lógicas AND, OR e NOT (futuramente também aparece o XOR, NOR, NAND e XNOR). Mais pra frente apareceram as variáveis true e false, que foram nomeadas como valores booleanos (bool), justamente para facilitar o entendimento da lógica e das funções da Álgebra Booleana.​

Antes de começar a ler este tópico, acesse os links abaixo e leiam os artigos pois são muito interessantes.
CCM.net
Brasil Escola
Scientific American
WhatIs.com

George_Boole_color.jpg

George Boole (1815 - 1864)


Para comemorar esta data, vamos relembrar como funciona a Álgebra Booleana dentro da programação? Não! ¬¬
Bem... a linguagem que eu vou usar aqui é a GML (Game Maker Language) por ela ser bem parecida com as outras linguagens de programação e vai ser mais fácil de compreender aqui no tópico. Para quem não manja nada de programação, é uma boa oportunidade pra conhecer alguma coisa nova caso queira se aderir a esta área.

Primeiro vamos recapitular um pouco sobre variáveis.
Variável é um espaço posicionado na memória que usamos para guardar valores e aplicá-los em alguma equação, alguma função ou em um objeto.

mGAVwi8.png


Podemos armazenar as variáveis na memória com vários tipos de dados. Confira na tabela abaixo:
sYXjoDe.png

É lógico que há outros tipos de dados como Int, Short, Long, Handle, Qword, Unit, Char, etc. porém esses são os mais comuns em engines de criação de jogos. Muitas das vezes de formas mais resumidas ainda.
O RPG Maker, por exemplo, usam Int e Bool apenas. O Game Maker usa Int, Byte, Word, Double e Bool. Tudo isso varia de uma engine para a outra. O Int (ou Integer) é mais comum pelo limite do valor ser bem maior e por trabalhar com números negativos também, que são convertidos para valores binários e mandar para a máquina. Lembrando que, independente dos valores que usamos, o computador só lê valores binários, ou seja, 0 e 1; esses valores são convertidos para binário para a máquina operar todos os cálculos e alocar na memória aquela variável.
O valor que vamos abordar nesse tópico são os Bools (ou Booleanos), que são true e false. Para quem usa o RPG Maker, esses valores são meio que obscuros para eles, portanto se você pensar nas switches vão pegar a ideia dos bools sem nenhum problema. Pense true como ON e false como OFF.

Beleza, agora vamos aplicar tudo isso na Álgebra Booleana. Para ficar algo mais compreensível, vou trabalhar com 0 e 1 ao invés de true e false. Voltando para a ideia de George Boole, vamos implementar as 3 formas mais comuns de lógica que ele fez: AND, OR e NOT; trazendo essa ideia para a programação porque na matemática é diferente a aplicação da lógica caso tenham lido nos links que deixei acima.


» Função AND (&&)

Quando queremos verificar se temos 2 valores 1 iguais ou duas ou mais condições são verdadeiras, usamos AND para determinar o valor de acordo com a lógica. Se os valores estiverem iguais, ele retorna para 1, se não estiverem iguais, retorna 0.
0 and 0 = 0
1 and 0 = 0
0 and 1 = 0
1 and 1 = 1


Aplicando a lógica com condições:
Código:
// Se objeto estiver entre as coordenadas X 24 e 48, gerar pegadas no chão
if x >= 24 and x =< 48 then instance_create(obj_footprint,x,y)

Também podemos usar essas funções para calcular números binários, no exemplo abaixo, pegamos os valores 10110101 e 11000100 aplicando à lógica com a função AND. Veja que para fazer isso mentalmente, colocamos os dois valores um em cima do outro e damos o valor embaixo dos dois, comparando-os respectivamente até formar o resultado final, que nem quando vamos somar, subtrair ou multiplicar dois valores no papel. Os números que estão em azul é porque os valores confirmam, ou seja, retorna para 1 (true); e os que estão de vermelho são os que não confirmam, retornando para 0 (false).
Confira:
Ln98Bth.png

Logo  10110101 & 11000100 = 10000100.
Se convertermos esses valores binários para Int, teremos 181&196 = 132
Você pode conferir estes valores normalmente na calculadora do Windows usando o Modo Programador.


» Função OR (||)

No caso desta função, ele retorna o valor para 1 se um daqueles valores estiver com 1. Se os dois valores estiverem igual a 0, ele retorna para 0.
0 or 0 = 0
1 or 0 = 1
0 or 1 = 1
1 or 1 = 1


Nas condições não é diferente. Ele vai verificar se qualquer uma daquelas condições estão verdadeiras para que possa acontecer uma ação naquele código.
Código:
// Se possuir uma espada ou um machado, o herói vai poder atacar
if arma == "Espada" or arma == "Machado" then state_attack = true

Calculando os mesmos valores, agora com a função OR:
BB6YfQM.png

Logo 10110101 | 11000100 = 11110101.
Convertendo para Int: 181 | 196 = 245.


» Função NOT (!)

Esse aqui é um pouco diferente. Conhecido também como Inverted Logic Ele não serve para comparar dois valores, no caso ele vai transformar tudo aquilo que é 1 em 0 e tudo que é 0 vira 1.
0 = 1
1 = 0


Aplicando na programação já fica mais compreensível. Ele entra tanto na condição quanto para alguma função.
No caso de uma função, usamos a símbolo ! (ponto de exclamação) para inverter a lógica daquela função.
Código:
if keyboard_check(vk_return) {
  // Tecla Enter pressionada
}

if !keyboard_check(vk_return) {
  // Tecla Enter NÃO está pressionada
}

Pegando o valor 10110101 e vamos invertê-lo para ver o que acontece:
8U57JAV.png

Logo !10110101 = 1001010 (desconsiderando todos os zeros que aparecem primeiro normalmente como nos números decimais, octais e hexadecimais).
Passando para Int: !181 = -182


» Função XOR (^)

Conhecido também como Exclusive OR. Ele é um pouco parecido com a função OR, a única diferença é que o XOR só vai retornar para 1 se os dois valores forem diferentes. Se os dois valores estiverem igual a 1 ou os dois igual a 0, ele vai retornar para 0.
0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0


Mesma situação na programação:
Código:
// Se possuir uma espada ou um machado, o herói vai poder atacar, mas se tiver os dois ele não poderá atacar
if arma == "Espada" xor arma == "Machado" then state_attack = true

Calculando os mesmos valores, agora com a função XOR:
OdtrrLL.png

Logo 10110101 ^ 11000100 = 01110001.
Convertendo para Int: 181 ^ 196 = 113.



Mais pra frente, surgiram outras funções lógicas, como NOR, NAND e XNOR; que na verdade são as funções OR, AND e XOR com a lógica invertida. É como se estivesse misturando uma delas com a função NOT. Então nem tem necessidade de dar muitos detalhes, já que é só pensar o oposto das outras funções.
Vou deixar uma relação comparando-os respectivamente:


AND
1 & 1 = 1
0 & 1 = 0
1 & 0 = 0
0 & 0 = 0

NAND
1 !& 1 = 0
0 !& 1 = 1
1 !& 0 = 1
0 !& 0 = 1

OR
1 | 1 = 1
0 | 1 = 1
1 | 0 = 1
0 | 0 = 0

NOR
1 !| 1 = 0
0 !| 1 = 0
1 !| 0 = 0
0 !| 0 = 1

XOR
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
0 ^ 0 = 0

XNOR
1 !^ 1 = 1
0 !^ 1 = 0
1 !^ 0 = 0
0 !^ 0 = 1

Conclusão:
Tudo o que nós, criadores de jogos, temos que fazer, é agradecer o matemático inglês por ter dado a iniciativa a uma nova perspectiva de criação e um salto muito grande na tecnologia.
Imagina isso lá no início do século XIX... onde a tecnologia começou a andar mais rápido. Engenharia, energia elétrica, fotografia eram tudo novidades... Com certeza não só Boole, porém outros matemáticos e físicos foram um dos principais responsáveis do mundo alcançar o patamar que estamos vivendo agora. Imagino o que seria da tecnologia sem essas simples equações, já que a Álgebra Booleana foi a responsável para a criação de circuitos e mais tarde para a programação... Acho que se não fosse por ele, a tecnologia não estaria a esse ponto, talvez nem existiriam ainda jogos eletrônicos, Facebook, Whatsapp e outras coisas que as pessoas do século XXI fazem no dia-a-dia.

Espero que tenham gostado desse tópico, que ele tenha sido útil e que tenha deixado uma reflexão para todos nós que estamos sempre nos divertindo com jogos e tendo sempre ideias para produzir outros jogos com o único objetivo: proporcionar diversão àqueles que estão jogando.

Obrigado, George Boole, por tornar a nossa tecnologia como ela é agora e que estamos sempre em busca da evolução. Com certeza você deu o primeiro passo para tudo isso.​


Até mais, pessoal o/
 
XGB, achei demais toda essa preparação que você fez!
Meus parabéns!
Li a introdução e já to deixando a minha ward aqui para ler tudo com paciência depois!
:Okay_fix:
 
Muito obrigado por compartilhar conosco está linda data(que posso comemorar, pelo nascimento do querido boolean)
Valeu mesmo!
 
Voltar
Topo Inferior