Jump to content
Sign in to follow this  
tawny_alexa

Não preenche Array

Recommended Posts

tawny_alexa

Boas, estou de volta de um projecto de um jogo, o objectivo é inserir um array de 4 cores que vai ser comparado com outro array, este último pode ser dado por outro jogador, ou gerado aleatoriamente pelo programa. No final devolve-me o numero de cores correctas na posição correcta (nr de pinos pretos) e o numero de cores correctas na posição errada (nr de pinos brancos).

Quando é o utilizador a fornecer o array secreto de cores, funciona tudo muito bem, já quando é o computador a gerar automaticamente esse array, dá-me sempre 0 pinos pretos e zero pinos brancos (e quando tento imprimir o array o resultado é null null null null).

Deixo abaixo trechos do código na esperança de alguém conseguir perceber onde está o erro, porque sinceramente não dou com ele.

Obrigado a todos desde já.

Cumprimentos,

Tânia

public interface JogoMastermind {

public void iniciarJogo(Jogador jogadorAtual);

public void iniciarJogo(Jogador jogadorAtual, Combinacao secreta);

public boolean ganhou();

public boolean perdeu();

public boolean desistiu();

public Resposta fazerTentativa(Combinacao tentativa) throws ExcepcaoDeJogo;

public void desistir() throws ExcepcaoDeJogo;

public Combinacao getCombinacaoSecreta() throws ExcepcaoDeJogo;
}

import java.util.ArrayList;

public class Combinacao {

String cor1;
String cor2;
String cor3;
String cor4;
ArrayList<String> listaCombinacao = new ArrayList<>();
ArrayList<String> tentativaInserida = new ArrayList<>();

String[] cores;

public Combinacao() {
}


public ArrayList<String> CombinacaoFinal() {

return listaCombinacao;
}

/*
* Costrutor para quando e um utilizador a defenir a chave secreta
*/
public Combinacao(String cor1, String cor2, String cor3, String cor4) {
this.cor1 = cor1;
this.cor2 = cor2;
this.cor3 = cor3;
this.cor4 = cor4;

tentativaInserida.add(this.cor1);
tentativaInserida.add(this.cor2);
tentativaInserida.add(this.cor3);
tentativaInserida.add(this.cor4);
}

/*
* Devolve o conteudo de uma posicao do array, caso esta exista
*/
public String getCor(int index) {
if (index >= 0 && index < tentativaInserida.size()) {
return tentativaInserida.get(index);
} else {
return "**Index Invalido**";
}
}

public String getCor1() {
return cor1;
}

public String getCor2() {
return cor2;
}


public String getCor3() {
return cor3;
}

public String getCor4() {
return cor4;
}

@Override
public String toString() {
return getCor1() + " " + getCor2() + " " + getCor3() + " " + getCor4();
}
}


import java.util.ArrayList;
import java.util.Collections;

public class CombinacaoFacil extends Combinacao {

/*Adiciona as 6 cores ao array list criado, e baralha as cores atraves
*da funcao shuffle, depois são escolhidas as primeiras 4 cores desse
*array baralhado para criar a combinacao final
*/
public CombinacaoFacil() {

ArrayList<String> chaveAleatoria = new ArrayList<>();

chaveAleatoria.add("AMARELO");
chaveAleatoria.add("VERMELHO");
chaveAleatoria.add("VERDE");
chaveAleatoria.add("AZUL");
chaveAleatoria.add("LARANJA");
chaveAleatoria.add("ROXO");

Collections.shuffle(chaveAleatoria);

cores = new String[4];
for (int i = 0; i <= 3; i++) {
listaCombinacao.add(chaveAleatoria.get(i));

}
}
}


public class Jogo implements JogoMastermind {

int nrTentativas = 0;
boolean resposta = false;
boolean jogoADecorrer = false;
Combinacao segredo;

/*
* Poe o jogo a correr com um jogador e gera uma combinacao secreta aleatoria
*/
@Override
public void iniciarJogo(Jogador jogadorAtual) {
jogoADecorrer = true;
this.nrTentativas = 0;
}

/*
* Poe o jogo a correr com um jogador e uma combinacao secreta dada por um utilizador
*/
@Override
public void iniciarJogo(Jogador jogadorAtual, Combinacao segredoDado) {
nrTentativas = 0;
this.segredo = segredoDado;
jogoADecorrer = true;
}

/*
* Quando o jogo e ganho enterrompe-o
*/
@Override
public boolean ganhou() {
if (jogoADecorrer == true && this.nrTentativas <= 12) {
jogoADecorrer = false;
return true;
}
return false;

}

/*
* Se já fez 12 tentativas e nao acertou na combinacao secreta, interrompe o jogo
*/
@Override
public boolean perdeu() {
if (nrTentativas >= 12 && resposta == false) {
jogoADecorrer = false;
return true;
}
return false;
}

/*
* Se o jogo se encontrar a correr devolve true a possibilidade de desistir
*/
@Override
public boolean desistiu() {
if (jogoADecorrer == true) {
return true;
}
Runtime.getRuntime().exit(0);

return false;
}

/*
* Recebe a tentativa por argumento e envia esta para a classe reposta, que
* recebe igualmente a combinacao secreta e se o numero de tentativas for
* menor que 12 da-nos o numero de pinos brancos e pretos e incrementa o
* numero de tentativas. Caso ja tenha atingido a 12a tentativa da uma
* mensagem de erro em como nao e possivel fazer mais tentativas
*/
@Override
public Resposta fazerTentativa(Combinacao tentativa) throws ExcepcaoDeJogo {
Resposta r1 = new Resposta(segredo, tentativa);

if (nrTentativas < 12) {
r1.getPinosBrancos();
r1.getPinosPretos();
nrTentativas++;
} else {
throw new RuntimeException("**Esgotou as tentativas**");
}
if (r1.ganhouResposta() == true) {
}
return r1;
}

/*
* Permite desistir do jogo desde que o jogo estaja a correr e ainda nao
* tenha sigo ganho
*/
@Override
public void desistir() {
if (!ganhou() && !perdeu() && jogoADecorrer == true) {
desistiu();

throw new ExcepcaoDeJogo("** Desististe - Jogo Terminado**");
} else if (ganhou()) {

throw new ExcepcaoDeJogo("**Nao e possivel desistir se ja ganhaste**");
} else if (perdeu()) {
throw new ExcepcaoDeJogo("**Nao e possivel desistir se ja perdeste**");
}
}

/*
* Devolve a combinacao secreta quando o jogo e perdido, ganho ou o jogador
* tenha desistido. Se o jogo estiver a correr e estas condicoes nao se
* verificarem, informa que nao e possivel ver a combinacao secreta enquanto
* joga
*/
@Override
public Combinacao getCombinacaoSecreta() throws ExcepcaoDeJogo {
if (perdeu() || ganhou() || desistiu()) {
return segredo;
} else {
throw new ExcepcaoDeJogo("Batotice! Não podes ver a combinacao enquanto jogas!");
}

}

@Override
public String toString() {
return "\nTentativas=" + nrTentativas;
}
}


public class JogoFacil extends Jogo {


@Override
public void iniciarJogo(Jogador jogadorActual){
nrTentativas=0;
segredo = new CombinacaoFacil();
jogoADecorrer=true;
}

}

public class Resposta {

int pinosPretos = 0;
int pinosBrancos = 0;
Combinacao tentativaAVerificar;

public Resposta() {
}

/*
* Recebe a combinacao chave e a combinacao tentativa e verifica o nr
* de pinos pretos e brancos
*/
public Resposta(Combinacao segredo, Combinacao tentativa) {
tentativaAVerificar = tentativa;

//Verifica as cores iguais
for (int i = 0; i < 4; i++) {
if (segredo.getCor(i).equalsIgnoreCase(this.tentativaAVerificar.getCor(i))) {
pinosPretos++;
}

}
//Verifica as cores trocadas
for (int i = 0; i < 4; i++) {
if (tentativaAVerificar.getCor(i).equalsIgnoreCase(segredo.getCor(i))) {
this.pinosBrancos++;
}
if (tentativaAVerificar.getCor(1).equalsIgnoreCase(segredo.getCor(i))) {
this.pinosBrancos++;
}
if (tentativaAVerificar.getCor(2).equalsIgnoreCase(segredo.getCor(i))) {
this.pinosBrancos++;
}
if (tentativaAVerificar.getCor(3).equalsIgnoreCase(segredo.getCor(i))) {
this.pinosBrancos++;
}

}
//O numero de pinos brancos vai ser igual ao numero de pinos brancos
//menos o numero de pinos pretos, para que nao haja cores contadas duas
//vezes
if (this.pinosBrancos - pinosPretos > 0) {
pinosBrancos = this.pinosBrancos - pinosPretos;
} else {
pinosBrancos = 0;
}
}

public int getPinosPretos() {
return pinosPretos;
}

public int getPinosBrancos() {
return pinosBrancos;
}

/*
* Caso o numero de pinos pretos seja 4, ou seja as 4 cores certas o jogador
* ganha
*/
public boolean ganhouResposta() {
if (this.getPinosPretos() == 4) {
return true;
}
return false;
}

@Override
public String toString() {
return "\nNr Pinos Pretos=" + getPinosPretos() + "\nNr Pinos Brancos=" + getPinosBrancos();
}
}

Main 1

public static void main(String[] args) {
// TODO code application logic here


//COM COMBINACAO SECRETA INSERIDA POR UM UTILIZADOR
//Inicia o Jogo
Jogo j1 = new Jogo();
//Cria um jogador e é escolhida a combinnacao secreta
j1.iniciarJogo(new Jogador("Tania"),new Combinacao("ROXO", "AMARELO", "LARANJA", "AZUL"));
//E inserida a tentativa
Combinacao c = new Combinacao("ROXO", "Azul", "Verde", "Laranja");
j1.fazerTentativa(c);
//Passa a combinacao secreta e a tentativa pelo metodo resposta que as vai comparar
Resposta r1= new Resposta(j1.getCombinacaoSecreta(), c);
//Imprime o numero de tentativas efectuadas e os pinos
System.out.printf(j1.toString());
System.out.printf(r1.toString());
//Teste se ganhou
System.out.println("\nGanhou? " + r1.ganhouResposta());

OUTPUT 1:

Tentativas=1

Nr Pinos Pretos=1

Nr Pinos Brancos=2

Ganhou? false

Main 2:

//COM COMBINACAO SECRETA GERADA AUTOMATICAMENTE
//Inicia o jogo
Jogo j1 = new JogoFacil();
//Cria um jogador
j1.iniciarJogo(new Jogador("Tania"));
//Cria uma tentativa do jogador
Combinacao tentativa= new Combinacao("ROXO", "AZUL", "VERDE", "VERMELHO");
//Envia a tentativa para o contrutor da resposta
j1.fazerTentativa(tentativa);
//Passa a combinacao secreta e a tentativa pelo construtor da resposta que
//as vai comparar
Resposta r1 = new Resposta(j1.segredo,tentativa);
System.out.println(j1.segredo);
//Imprime o numero de tentativas efectuadas e os pinos
System.out.printf(j1.toString());
System.out.printf(r1.toString());
//Teste se ganhou
System.out.println("\nGanhou? " + r1.ganhouResposta());


OUTPUT 2:

null null null null

Tentativas=1

Nr Pinos Pretos=0

Nr Pinos Brancos=0

Ganhou? false


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

para facilitar quem pretnede te ajudar, evidencia o código relativo ao problema : geração automática da combinação

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Quando meto a correr basicamente crio um objecto do tipo JogoFacil

public class JogoFacil extends Jogo {

@Override
public void iniciarJogo(Jogador jogadorActual){
nrTentativas=0;
segredo = new CombinacaoFacil();
jogoADecorrer=true;
}

}

que apenas me pede o nome do jogador e supostamente devia gerar uma CombinacaoFacil():

public class CombinacaoFacil extends Combinacao {

/*Adiciona as 6 cores ao array list criado, e baralha as cores atraves
*da funcao shuffle, depois são escolhidas as primeiras 4 cores desse
*array baralhado para criar a combinacao final
*/
public CombinacaoFacil() {

ArrayList<String> chaveAleatoria = new ArrayList<>();

chaveAleatoria.add("AMARELO");
chaveAleatoria.add("VERMELHO");
chaveAleatoria.add("VERDE");
chaveAleatoria.add("AZUL");
chaveAleatoria.add("LARANJA");
chaveAleatoria.add("ROXO");

Collections.shuffle(chaveAleatoria);

for (int i = 0; i <= 3; i++) {
listaCombinacao.add(chaveAleatoria.get(i));

}
}

Depois crio um objecto do tipo Resposta

/*
* Recebe a combinacao segredo e a combinacao tentativa e verifica o nr
* de pinos pretos e brancos
*/
public Resposta(Combinacao segredo, Combinacao tentativa) {
tentativaAVerificar = tentativa;

Mas acaba por não comparar nada pois a CombinaçaoFacil() não me está a gerar o segredo, daí quando o mando imprimir e dar como resposta null null nul null.

Espero ter conseguido ser mais clara.

Cumps

Edited by tawny_alexa

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

estás longe de onde está o problema, mas mesmo assim vamos ver se chegas lá sozinha.

para tal, vais responder a estas simples questões:

- como estás a apresentar a solução no ecrã ?

- de onde vem essa informação que estás a apresentar no ecrã ?

- essa informação que está a ser apresentada no ecrã tem alguma relação com a forma como estás a criar a chave aleatória ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Basicamente penso que o problema está em dizer que

segredo=new CombinacaoFacil();

quando na verdade o que a CombinacaoFacil gera está guardado na classe Combinação em forma de array

public ArrayList<String> CombinacaoFinal(){ 
return listaCombinacao;
}

mas não sei como o ir buscar, por muito ignorante que possa parecer a dúvida.


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não estou a dizer nada ... só quero que respondas as questões colocadas de forma directa a suportada com o teu código


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Tentando responder às tuas perguntas, no ecrã estou a querer imprimir o segredo, o que pensando bem não faz muito sentido, visto que digo que o segredo é um objecto do tipo CombinacaoFacil, logo não posso esperar que me imprima um array com as cores que guardei em CombinacaoFinal. Será isto?


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

não respondeste a nenhuma das questões que te foram colocadas.

volta a ler as questões e responde apresentando o código referente à tua resposta


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

- Apresentar a solução no ecrã e de onde esta é proveniente:

Foram criados 2 objectos, um do tipo JogoFacil, outro do tipo Resposta, o primeiro

System.out.printf(j1.toString());

vai buscar o toString da classe Jogo da qual é herdeiro e dá-me o número de tentativas

   public String toString() {
       return "\nTentativas=" + nrTentativas;
   }
}

o segundo

System.out.printf(r1.toString());

vai buscar o toString da classe Resposta e dá-me o número de pinos (a resposta recebe uma combinação segredo e uma combinação tentativa para fazer a comparação).

   public String toString() {
       return "\nNr Pinos Pretos=" + getPinosPretos() + "\nNr Pinos Brancos=" + getPinosBrancos();
   }
}

para testar mandei imprimir o meu segredo (do tipo combinacao)

System.out.println(j1.segredo);

que é

segredo = new CombinacaoFacil();

, sendo que a CombinacaoFacil cria um array com 6 cores, faz o shuffle dessas cores e adiciona as primeiras 4 posições desse array a um novo (o meu segredo).

- Essa informação que está a ser apresentada no ecrã tem alguma relação com a forma como estás a criar a chave aleatória?

Eu estou a criar a chave aleatória e a adiciona-la a um Array, mas eu só posso comprar Combinações e não um array com uma combinação. (Nesta questão é que tenho mais dúvidas)


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

para testar mandei imprimir o meu segredo (do tipo combinacao)

System.out.println(j1.segredo);

isto é a única parte da tua resposta que interessa, e no entanto não é uma resposta correcta.

olha bem para a pergunta :

- como estás a apresentar a solução no ecrã ?

esse código está a enviar alguma coisa para a consola, e como tal, não é uma resposta completa porque o que realmente interessa é o que estás a enviar para a consola


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Exacto, sendo que segredo é uma CombinacaoFacil, ele não me pode imprimir nada, não me ia imprimir uma classe claro. A minha dúvida está exactamente ai, como posso ir buscar a combinaãoo do segredo? Até porque para a Resposta tenho que enviar duas combinações, o segredo e a tentativa.

Resposta r1 = new Resposta(j1.segredo,tentativa);


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

estou a começar a duvidar que tenhas feito todo o código aqui apresentado.

vamos ver o problema na tua ultima entrada:

Exacto, sendo que segredo é uma CombinacaoFacil, ele não me pode imprimir nada, não me ia imprimir uma classe claro

mas quando o segredo é criado pela inserção manual, o segredo é apresentado, e no entanto é uma classe.

visto isto, diz : o que faz que uma classe possa ser apresentada na consola (string ?)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Mas fui eu que fiz, aliás eu fiz o principal e sempre que tinha dúvidas falava com os professores da cadeira em horário de dúvidas que corrigiam certas coisas e acrescentavam trechos de código, e trocava ideias com outros colegas que estão a desenvolver o mesmo. Acontece que neste momento não existe horário de dúvidas e tenho que corrigir este erro no projecto antes de seguir para a parte gráfica em JavaFx que tenho que entregar na próxima segunda-feira. Mas percebo o porquê da tua dúvida, sinceramente até eu me sinto burra neste momento, mas já é o cansaço acumulado da recta final de semestre com as entregas de projectos e exames, juntamente com o trabalho (e espero que entendas que com isto não quero que tenham pena de mim, apenas estava a tentar explicar o porquê de um raciocínio menos coerente). Mas tenho que me concentrar e tentar pensar claramente.

Tens toda a razão, quando o segredo é inserido manualmente é apresentado mesmo sendo uma classe, isto porque criei 4 atributos referentes às cores e no construtor recebo as 4 cores dadas na classe Main, fazendo depois os respectivos métodos selectores que uso para fazer o toString (sendo que é o toString que me permite apresentar a classe na consola). Posso simplesmente fazer um toString na classe CombinacaoFacil? Pensava que por ter o toString na classe pai, não seria necessário fazê-la também na herdeira.

E muito obrigado pela paciência que estás a ter comigo a tentar ajudar-me.

Edited by tawny_alexa

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

fazer o toString (sendo que é o toString que me permite apresentar a classe na consola).

ora finalmente chegaste à resposta da pergunta

- como estás a apresentar a solução no ecrã ?

e igualmente respondeste à segunda questão:

- de onde vem essa informação que estás a apresentar no ecrã ?

criei 4 atributos referentes às cores e no construtor recebo as 4 cores dadas na classe Main, fazendo depois os respectivos métodos selectores que uso para fazer o toString

o que falta responder para chegar à conclusão do problema é mesmo a terceira pergunta:

- essa informação que está a ser apresentada no ecrã tem alguma relação com a forma como estás a criar a chave aleatória ?

(nota que a pergunta é referente à instância da classe CombinacaoFacil)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Boa, já estive mais longe. A ultima pergunta é onde de facto me perco. Eu não tenho nenhuma instância da classe CombinacaoFacil criada no Main, criei apenas uma instância da classe pai para gerar uma combinação tentativa.


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

não desvies a linha de raciocínio apresentado pelas questões ....

olha bem para a questão :

- essa informação ( 4 atributos referentes às cores) que está a ser apresentada no ecrã tem alguma relação com a forma como estás a criar a chave aleatória ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Não não tem. mas já tentei acrescentar este código na CombinacaoFacil e não alterou nada, acho que vai dar exactamente ao mesmo que tinha antes. Tenho que ir buscar 4 cores ao array depois do shuffle e atribui-las aos atributos das cores da classe Combinacão.

public ArrayList<String> CombinacaoFinal(){

//Adiciona-se as cores manualmente ao arraylist
listaCombinacao.add(this.cor1);
listaCombinacao.add(this.cor2);
listaCombinacao.add(this.cor3);
listaCombinacao.add(this.cor4);
return listaCombinacao;
}

E também já tentei fazer isto na classe CombinacaoFacil

cores = new String[4];
for (int i = 0; i <= 3; i++) {
listaCombinacao.add(chaveAleatoria.get(i));

cores[i] = chaveAleatoria.get(i);
}
}

e no construtor da classe Combinacao alterar para:

public Combinacao(String primeiraCor, String segundaCor, String terceiraCor, String quartaCor) {
cores = new String[4];

this.primeiraCor = cores[0] = primeiraCor;
this.segundaCor = cores[1] = segundaCor;
this.terceiraCor = cores[2] = terceiraCor;
this.quartaCor = cores[3] = quartaCor;
}

Edited by tawny_alexa

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de fazer alterações, olha bem para o código da função toString

o que é que essa função necessita para que seja a solução correctamente apresentada ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

desculpa o erro: era suposto estar cor1, cor2, cor 3 e cor 4 em vez de primeira cor e por ai diante


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de fazer alterações, olha bem para o código da função toString

o que é que essa função necessita para que seja a solução correctamente apresentada ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Dos métodos selectores? E antes disso de dizer que o atributo cor1 é igual à posição 1 do array da combinação, e por ai diante.

Edited by tawny_alexa

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que necessitas não são os métodos, mas que a informação que esses métodos retorne seja a correcta.

que informação que esses métodos estão a retornar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

Neste momento nada, estão a retornar null...deviam estar a retornar o valor dos atributos


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites
HappyHippyHippo

exactamente,

então, o que basta fazer, é que essas atributos tenham o valor correcto


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tawny_alexa

crio um construtor com as cores na classe CombinacaoFacil?


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.