Universidade de são paulo instituto de arquitetura e urbanismo de são carlos


Anexo 2 - Códigos para a confecção do quebra-cabeça



Baixar 1.49 Mb.
Página46/67
Encontro30.06.2021
Tamanho1.49 Mb.
1   ...   42   43   44   45   46   47   48   49   ...   67
Anexo 2 - Códigos para a confecção do quebra-cabeça

A linguagem Processing é baseada na linguagem de programação Java, porém possui funcionalidades próprias e especificas tais como funções para códigos predeterminados. Java se estrutura através do método de orientação ao objeto. A linguagem possui uma unidade mínima que seria o objeto. No caso do quebra-cabeça essa unidade mínima é a peça. Para que o objeto exista é necessário defini-lo primeiro, através de sua classe. A classe é a estrutura do objeto, sua essência, o que permite a sua existência. Dentro da classe vão as informações necessárias ao funcionamento do objeto, suas propriedades, tais como tamanho, cor, posição. A modificação das propriedades ocorre através do método, ou seja, das funções criadas pela linguagem. Linguagens de programação são baseadas em princípios matemáticos, funcionando muitas vezes através da lógica. Neste caso, são comuns funções e variáveis lógicas que permitam o funcionamento do código.

class Peca { // cria uma nova classe (representa o objeto peça) - Definição da estrutura peça

PImage peca_estampa; //PImage - tipo da classe; peça_estampa - objeto que agrega uma imagem (Propriedades da peça)

int xpos, ypos, numero; // indica variáveis inteiras, posição (coordenadas) e número da peça

boolean e_quadrado; // variavel lógica condicionante / verdadeiro ou falso

Peca(int xp,int yp,int num, String estampa){ // Argumento, método definido dentro da classe, condição inicial da figura carregada

this.xpos = xp; //posição na coordenada x

this.ypos = yp; // posição na coordenada y

this.numero = num; // número da peça

this.peca_estampa = loadImage(estampa); // carrega a imagem da peça

this.e_quadrado = false; // ocupado, se e_quadrado for falso a imagem da peça será carregada (indicação)

}

Peca(int xp,int yp,int num){ //argumento condição inicial sem carregar a figura



this.xpos = xp; //posição na coordenada x

this.ypos = yp; // posição na coordenada y

this.numero = num; // numero

this.e_quadrado = true; // se e_quadrado for verdadeiro a peça não será carregada - imagem sem estampa (indicação)

}

void mostrar(){ // se o quadrado estiver ocupado mostra a imagem



if (this.e_quadrado == false){ //se não for quadrado preto, mostra a peça em sua posição

print("mostra");

image(this.peca_estampa,this.xpos,this.ypos);} // mostrar a imagem na posição adequada (coordenadas)

else{ // de outra forma:

fill(0); //cor preta

rect(this.xpos,this.ypos,150,150); // posição e tamanho do quadrado

}

}

void modificarPos(int x,int y){ // função que modifica a coordenada da peça



this.xpos = x; // posição na coordenada x

this.ypos = y; // posição na coordenada y

}

}
class QuebraCabeca { //nova classe - Definição de quebra cabeça



int numero_de_pecas, tamanho_pecax, tamanho_pecay, pos_preta; // parâmetros do quebra cabeça

int tamanhoqc = 4; //sqrt(numero_de_pecas); tamanho linear do quebra cabeca

Peca[] pecas; //caixa [] com vários objetos do tipo peça

int[][] posicao = new int[tamanhoqc][tamanhoqc]; // cria uma matrix [] [] de posições

QuebraCabeca(int x, int y, int numero){ // arqumento f(x) método definido dentro da classe quebra-cabeça

int i = 0,j = 0,positx,posity,tmp,num; // i, positx são números inteiros (variáveis inteiras)

int[] sorteados = new int[16]; // sorteados - é uma caixa [] com 16 objetos: números inteiros

boolean encontrado = false; // variável lógica

for(int w = 0; w < 16; w++){ // looping - repete 16 vezes; w=0 condição de começo, w<16 condição para encerrar a repetição, w++ (w=w+1) adiciona 1 ao w

sorteados[w] = 0; // cada elemento da caixa igualado a zero

}

for (int w = 0; w < 16; w++){ // looping repete 16 vezes; w=0 condição de começo, w<16 condição para encerrar a repetição, w++ adiciona 1 ao w



num = sorteio(1,16); // sorteio é uma função que retorna um número inteiro, sorteia os números da peça

for(int s=0; s < 16; s++){ // pega os números sorteados

if(num == sorteados[s])encontrado = true;// se número sorteado dentro da caixa ja foi sorteado, esse número foi encontrado

}

while( encontrado == true){ // quando o número for encontrado roda o código até garantir que o número não sera repetido



num = sorteio(1,16); // sorteia de novo

encontrado = false; // não se sabe se esse número foi ou não encontrado

for(int q=0; q < w+1; q++){ // q tem que ser menor que w+1

if(num == sorteados[q])encontrado = true; // se o número foi sorteado será encontrado

}

}

sorteados[w] = num; // adquire um número se encontrado



}

this.numero_de_pecas = numero; // atribuição de um número

this.tamanho_pecax = x; // atribuição de um valor x ao tamanho da peça

this.tamanho_pecay = y; // atribuição de um valor y ao tamanho da peça

this.pecas = new Peca[numero];// especificando uma nova caixa de peças

positx = 0; // posição x

posity = 0; // posição y

while(i < numero - 1){ // argumento, quando 1 for menor que n-1

tmp = this.tamanhoqc; // Tamanho do quebra-cabeça = tmp, criação de uma variável temporária

positx = 0; // posição

while (tmp > 0 && i < numero ){ // quando tmp for maior que O e i for menor que número

if (sorteados [i] == 16 ){ // se sorteado i (especifica posição da caixa) for igual a 16

this.pos_preta = i; // posição preta será igual i

this.pecas[i] = new Peca(positx ,posity ,-1); // especifica nova posição para peça, cria a peça

this.pecas[i].mostrar(); // função que mostra a peça

this.posicao[j][this.tamanhoqc-tmp] = -1; // especifica para essa posição o -1, se for a última

}

else{ // enquanto



this.pecas[i] = new Peca(positx,posity,i,"qc"+sorteados[i]+".png"); // cria a peça

this.pecas[i].mostrar(); // mostra a peça

this.posicao[j][this.tamanhoqc - tmp] = i; // se não for a última

print("p["+j+"]["+(tamanhoqc - tmp)+"] = "+i+"\n"); //imprime a posição da peça

}

positx += this.tamanho_pecax;



tmp--; // decresce 1

i++;


}

j++;


posity += this.tamanho_pecay;

}

}



void movimento(int posx,int posy){ // argumento, modifica a posição da peça

if ( (posx < this.tamanhoqc - 1) && (posx > 0) && (posy < this.tamanhoqc - 1) && (posy > 0) ){

if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}else


if ( posx == 0 && posy == 0 ){

if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) ) this.troca(posx,posy);

}else

if ( posx == 0 && posy == this.tamanhoqc - 1 ){



if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}else


if ( posx == this.tamanhoqc - 1 && posy == 0 ){

if( (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) ) this.troca(posx,posy);

}else

if ( posx == this.tamanhoqc - 1 && posy == this.tamanhoqc - 1 ){



if( (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}else


if ( posy == 0 ){

if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) ) this.troca(posx,posy);

}else

if ( posy == this.tamanhoqc - 1 ){



if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}else


if ( posx == 0 ){

if( (this.posicao[posx + 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}else

if (posx == this.tamanhoqc - 1){



if( (this.posicao[posx - 1][posy] == -1) || (this.posicao[posx][posy + 1] == -1) || (this.posicao[posx][posy - 1] == -1) ) this.troca(posx,posy);

}

}



int sorteio(int a,int b){

float x = random (a, b+1); //sorteia números racionais

return int(floor(x)); //transforma em números inteiros

}

void troca(int posx,int posy){



int[] preta;

int tmpx = this.pecas[ this.posicao[posx][posy] ].xpos , tmpy = this.pecas[ this.posicao[posx][posy] ].ypos; //

this.pecas[this.posicao[posx][posy]].modificarPos(this.pecas[this.pos_preta].xpos,this.pecas[this.pos_preta].ypos); // troca posicao (x,y) da peca, identificada atraves de sua posicao no quebra cabeca posicao(posx,posy), com posicao (x,y) da peca preta

preta = this.achaPreta();

this.posicao[preta[0]][preta[1]] = this.posicao[posx][posy]; // Fazer troca de posicao da peca na matrix do quebra cabeca atraves de identifição do local onde a peca preta esta

this.posicao[posx][posy] = -1; // preta na posicao da peca trocada

this.pecas[this.pos_preta].modificarPos(tmpx,tmpy); // troca posicao (x,y) de peça preta

this.pecas[this.posicao[preta[0]][preta[1]]].mostrar(); // mostra peca que foi para o lugar anterior da peca preta

this.pecas[this.pos_preta].mostrar(); // mostra peca preta

}

int[] achaPreta(){ // encontrar o quadrado preto



int[] coordenadas = new int[2];

for (int i = 0; i < this.tamanhoqc; i++)

for (int j = 0; j < this.tamanhoqc; j++)

if (this.posicao[i][j] == -1){

coordenadas[0] = i;

coordenadas[1] = j;

return coordenadas;

}

return coordenadas;



}

}
int posix; // posição x

int posiy; // posição y

boolean funcionando, inicio, st = false; // início do jogo

QuebraCabeca historico;

PImage fundo;


void setup(){ // função que prepara a área de trabalho do jogo

size(600,600); // tamanho do quebra-cabeça

inicio = true;

funcionando = false;

fundo = loadImage("1.png");// carrega a imagem inicial

image (fundo ,0,0); // fundo

rect (480,500, 100, 60); // botão, escritos, cor, traço, etc..

stroke(249,209,200);

noFill();

rect (480,500, 100, 60);// tamanho do botão, posição

fill(27,20,100);
text ("Play", 517,535); // textFont (PFont("TimesNewRoman"),40);

}
void draw(){ // executa em looping criando o jogo

if (inicio == true) // primeira tela inicio do jogo

{
if (mousePressed) //se o botão for pressionado

{

if (mouseX < 580 && mouseX > 480 && mouseY < 560 && mouseY>500 )// coordenadas



{

inicio = false; // duas condições

funcionando = true; // se funcionando for igual a verdadeiro

}

}



}

//JOGO


if ( funcionando == true) // se o jogo funciona

{

if(st == false){



historico = new QuebraCabeca(150,150,16); // tamanho do quebra-cabeça, número de peças

st = true;

}

if( mousePressed == true ){ // se o botão for pressionado pelo mouse



posix = int(floor(mouseX/historico.tamanho_pecax)); // posição em que o botão foi pressionado

print("posix "+posix+"\n");

posiy = int(floor(mouseY/historico.tamanho_pecay));

print("posiy "+posiy+"\n");

historico.movimento(posiy,posix);

}

}



}




Compartilhe com seus amigos:
1   ...   42   43   44   45   46   47   48   49   ...   67


©historiapt.info 2019
enviar mensagem

    Página principal