Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class View {
- Board board;
- PositionTrace model;
- int clickCounter=0;
- Position primeiroClick = null;
- int black=12;
- int white=12;
- int l=8;
- int c=8;
- boolean fj=false;
- View(PositionTrace model) {
- int x=0;
- int y=0;
- this.board = new Board("", 0, 0, 0);
- // Solicita dimensões e número de peças
- x = board.promptInt("Qual é o nº de linhas/colunas do tabuleiro?");
- y = board.promptInt("Qual é o nº de peças de cada cor no tabuleiro?");
- if (y <= ((x * x) / 4)) {
- l = x;
- c = x;
- black = y;
- white = y;
- }
- if (y>(x*x)/4) {
- l=8;
- c=8;
- black=12;
- white=12;
- }
- // Inicializa o modelo e o tabuleiro com as configurações obtidas
- this.model = new PositionTrace(black, white, l, c);
- this.board = new Board(quemJoga(), l, c, 60);
- board.setBackgroundProvider(this::background);
- board.setIconProvider(this::icon);
- board.addMouseListener(this::click);
- board.addAction("Novo Jogo", this::action);
- board.addAction("Aleatório", this::aleatorio);
- board.addAction("Gravar", this::gravar);
- board.addAction("Carregar", this::carregar);
- board.setTitle(quemJoga());
- }
- void gravar() {
- String z = board.promptText("Qual é o nome do ficheiro a salvar?");
- model.save(z);
- }
- void carregar(){
- String z = board.promptText("Qual é o nome do ficheiro a carregar?");
- if (z == null || z.isEmpty()) {
- return;
- }
- PositionTrace novoModel = new PositionTrace(model.blackCount, model.whiteCount, model.linha, model.coluna);
- Board novoTabuleiro = new Board(quemJoga(), novoModel.linha, novoModel.coluna, 60);
- novoTabuleiro.setBackgroundProvider(this::background);
- novoTabuleiro.setIconProvider(this::icon);
- novoTabuleiro.addMouseListener(this::click);
- novoTabuleiro.addAction("Novo Jogo", this::action);
- novoTabuleiro.addAction("Aleatório", this::aleatorio);
- novoTabuleiro.addAction("Gravar", this::gravar);
- novoTabuleiro.addAction("Carregar", this::carregar);
- novoModel.load(z);
- novoTabuleiro.setTitle(quemJoga());
- novoTabuleiro.open();
- board.refresh();
- }
- void aleatorio() {
- if(!fj) {
- Position[] peçasAtuais = model.jogamBrancas ? model.positionWhities : model.positionBlackies;
- Position[] origens = new Position[100];
- Position[] destinos = new Position[100];
- int contadorMovimentos = 0;
- boolean peçaComDestinosValidos = false;
- Position peçaEscolhida = null;
- Position[] destinosValidos = new Position[100];
- int numeroDestinosValidos = 0;
- while (!peçaComDestinosValidos) {
- // Escolher uma peça aleatória
- int indicePeça = (int) (Math.random() * peçasAtuais.length);
- peçaEscolhida = peçasAtuais[indicePeça];
- numeroDestinosValidos = 0;
- for (int i = 0; i < model.linha; i++) {
- for (int j = 0; j < model.coluna; j++) {
- Position destino = new Position(i, j);
- if (model.éLegal(peçaEscolhida, destino) || model.tekirisse(peçaEscolhida, destino) != 0) {
- // Se o movimento for válido, adiciona ao array de destinos válidos
- destinosValidos[numeroDestinosValidos] = destino;
- numeroDestinosValidos++;
- }
- }
- }
- if (numeroDestinosValidos > 0) {
- peçaComDestinosValidos = true; // Há destinos válidos, podemos prosseguir com esse movimento
- }
- }
- int indiceDestino = (int) (Math.random() * numeroDestinosValidos);
- Position destinoAleatorio = destinosValidos[indiceDestino];
- origens[contadorMovimentos] = new Position(peçaEscolhida.line(), peçaEscolhida.col());
- destinos[contadorMovimentos] = destinoAleatorio;
- contadorMovimentos++;
- model.moveTopeça(peçaEscolhida, destinoAleatorio);
- board.setTitle(quemJoga());
- fimJogo();
- }
- }
- String quemJoga() {
- return model.jogamBrancas ? "Jogam as Brancas" : "Jogam as Pretas";
- }
- void start() {
- fimJogo();
- board.open();
- }
- void action() {
- model = new PositionTrace(black, white, l, c);
- board.setTitle(quemJoga());
- fj=false;
- fimJogo();
- }
- String icon(int i, int j){
- if (model.pretas(i, j))
- return "black.png";
- if (model.brancas(i,j))
- return "white.png";
- return null;
- }
- public static void main(String[] args) {
- View gui = new View(new PositionTrace(12, 12, 8, 8)); // Valores padrão iniciais
- gui.start();
- }
- Color background(int line, int col) {
- Position currentPos = new Position(line, col);
- // Se a casa for a peça clicada, a cor será "LIME"
- if (currentPos.equals(primeiroClick)) {
- return StandardColor.LIME;
- }
- if (primeiroClick != null) {
- if (model.tekirisse(primeiroClick, currentPos) != 0 || model.éLegal(primeiroClick, currentPos)) {
- return StandardColor.YELLOW;
- }
- }
- if ((line + col) % 2 == 0)
- return StandardColor.WHITE;
- return StandardColor.BLACK;
- }
- void click(int line, int col) {
- Position clicked = new Position(line, col);
- // Primeiro clique: Selecionar a peça
- if (clickCounter == 0) {
- if ((model.jogamBrancas && model.brancas(line, col)) || (!model.jogamBrancas && model.pretas(line, col))) {
- primeiroClick = clicked;
- clickCounter++;
- }
- }
- // Segundo clique: Fazer o movimento
- else if (clickCounter == 1) {
- if (model.tekirisse(primeiroClick, clicked) != 0) {
- model.capturamove(model.jogamBrancas ? model.positionWhities : model.positionBlackies, primeiroClick, clicked);
- } else if (model.éLegal(primeiroClick, clicked)) {
- model.moveTopeça(primeiroClick, clicked);
- }
- // Resetar o clique
- clickCounter = 0;
- primeiroClick = null;
- // Atualizar título
- board.setTitle(quemJoga());
- fimJogo();
- }
- }
- void fimJogo() {
- Position[] peçasAtuais = model.jogamBrancas ? model.positionWhities : model.positionBlackies;
- int jogadasPossiveis = 0;
- for (int i = 0; i < peçasAtuais.length; i++) {
- Position peçaAtual = peçasAtuais[i];
- if (model.posiçãoVálida(peçaAtual)) {
- for (int li = -2; li <= 2; li++) {
- for (int ci = -2; ci <= 2; ci++) {
- Position destino = new Position(peçaAtual.line() + li, peçaAtual.col() + ci);
- // Verifica se o movimento é válido ou há captura
- if (model.éLegal(peçaAtual, destino) || model.tekirisse(peçaAtual, destino) != 0) {
- jogadasPossiveis++;
- }
- }
- }
- }
- }
- if (jogadasPossiveis == 0) { // Nenhuma jogada possível
- if (model.whiteCount < model.blackCount) {
- board.setTitle("Vitória das Pretas");
- fj=true;
- } else if (model.whiteCount > model.blackCount) {
- board.setTitle("Vitória das Brancas");
- fj=true;
- } else if (model.whiteCount == model.blackCount){
- board.setTitle("Empate");
- fj=true;
- }
- }
- }
- }
- record Position(int line, int col) {
- }
- class PositionTrace {
- boolean jogamBrancas = true;
- Position[] positionBlackies;
- Position[] positionWhities;
- int blackCount = 12;
- int whiteCount = 12;
- int linha;
- int coluna;
- PositionTrace(int blackCount, int whiteCount, int linhas, int colunas) {
- this.blackCount = blackCount;
- this.whiteCount = whiteCount;
- positionBlackies = new Position[blackCount];
- positionWhities = new Position[whiteCount];
- int peçablack = 0;
- int peçawhite = 0;
- linha=linhas;
- coluna=colunas;
- // Colocar peças pretas no topo
- for (int l = 0; l < linhas / 2 && peçablack < blackCount; l++) {
- for (int c = 0; c < colunas && peçablack < blackCount; c++) {
- if ((l + c) % 2 == 1) { // Casas escuras
- positionBlackies[peçablack++] = new Position(l, c);
- }
- }
- }
- // Colocar peças brancas na base
- for (int l = linhas - 1; l >= linhas / 2 && peçawhite < whiteCount; l--) {
- for (int c = colunas-1; c >=0 && peçawhite < whiteCount; c--) {
- if ((l + c) % 2 == 1) { // Casas escuras
- positionWhities[peçawhite++] = new Position(l, c);
- }
- }
- }
- }
- boolean contém(Position[] positions, Position pos) {
- for (int i = 0; i < positions.length; i++) {
- Position p = positions[i];
- if (p.equals(pos)) {
- return true;
- }
- }
- return false;
- }
- boolean pretas(int line, int col) {
- return contém(positionBlackies, new Position(line, col));
- }
- boolean brancas(int line, int col) {
- return contém(positionWhities, new Position(line, col));
- }
- void remover(Position[] positions, Position alvo) {
- for (int i = 0; i < positions.length; i++) {
- if (positions[i] != null && positions[i].equals(alvo)) {
- positions[i] = new Position(-312,-123);
- if (positions == positionBlackies) blackCount--;
- if (positions == positionWhities) whiteCount--;
- }
- }
- }
- void capturamove(Position[] positions, Position inicial, Position alvo) {
- int tekirisse = tekirisse(inicial, alvo);
- Position meio = new Position((inicial.line() + alvo.line()) / 2, (inicial.col() + alvo.col()) / 2);
- if (tekirisse == 1 || tekirisse == 2) { // Captura pelas brancas
- for (int i = 0; i < positionWhities.length; i++) {
- if (positionWhities[i].equals(inicial)) {
- positionWhities[i] = alvo;
- }
- }
- remover(positionBlackies, meio); // Remove a peça preta capturada
- jogamBrancas = false;// mostra que é a vez das pretas
- } else if (tekirisse == 3 || tekirisse == 4) { // Captura pelas pretas
- for (int i = 0; i < positionBlackies.length; i++) {
- if (positionBlackies[i].equals(inicial)) {
- positionBlackies[i] = alvo;
- }
- }
- remover(positionWhities, meio); // Remove a peça branca capturada
- jogamBrancas = true;// mostra que é a vez das brancas
- }
- }
- boolean estafora(Position a) {
- return (a.line()>=linha||a.col()>=coluna||a.line()<0||a.col()<0);
- }
- boolean existeCapturaDisponivel() {
- if (jogamBrancas) {
- for (int i = 0; i < positionWhities.length; i++) { // Itera sobre as peças brancas
- Position p = positionWhities[i];
- Position destino1 = new Position(p.line() - 2, p.col() - 2);
- Position destino2 = new Position(p.line() - 2, p.col() + 2);
- if (!estafora(destino1) && tekirisse(p, destino1) != 0) {
- return true;
- }
- if (!estafora(destino2) && tekirisse(p, destino2) != 0) {
- return true;
- }
- }
- } else {
- for (int i = 0; i < positionBlackies.length; i++) { // Itera sobre as peças pretas
- Position p = positionBlackies[i];
- Position destino1 = new Position(p.line() + 2, p.col() - 2);
- Position destino2 = new Position(p.line() + 2, p.col() + 2);
- if (!estafora(destino1) && tekirisse(p, destino1) != 0) {
- return true;
- }
- if (!estafora(destino2) && tekirisse(p, destino2) != 0) {
- return true;
- }
- }
- }
- return false;
- }
- boolean éLegal(Position de, Position até) {
- if(existeCapturaDisponivel()) {
- return false;
- }
- int Linha = de.line() - até.line();
- int Coluna = Math.abs(de.col() - até.col());
- if (estafora(até))
- return false;
- if (jogamBrancas) { // Jogada das brancas
- return Linha == 1 && Coluna == 1 && !pretas(até.line(), até.col()) && !brancas(até.line(), até.col());// Jogada simples das brancas
- }
- return Linha == -1 && Coluna == 1 && !pretas(até.line(), até.col()) && !brancas(até.line(), até.col());
- }
- int tekirisse(Position a, Position b) {
- if(!estafora(b)) {
- if(a.line()-2==b.line() && (a.col()-2==b.col()&& jogamBrancas)) {
- if((!brancas(b.line(),b.col())&& (!pretas(b.line(),b.col())&& pretas((a.line()+b.line())/2,(a.col()+b.col())/2) )))
- return 1;
- }
- if (a.line()-2==b.line() && (a.col()+2==b.col() && jogamBrancas)){
- if((!brancas(b.line(),b.col())&& (!pretas(b.line(),b.col())&&pretas((a.line()+b.line())/2,(a.col()+b.col())/2))))
- return 2;
- }
- if (a.line()+2==b.line() && (a.col()-2==b.col() && !jogamBrancas)) {
- if((!brancas(b.line(),b.col())&& (!pretas(b.line(),b.col())&& brancas((a.line()+b.line())/2,(a.col()+b.col())/2))))
- return 3;
- }
- if (a.line()+2==b.line() && (a.col()+2==b.col() && !jogamBrancas)){
- if((!brancas(b.line(),b.col())&& (!pretas(b.line(),b.col())&& brancas((a.line()+b.line())/2,(a.col()+b.col())/2))))
- return 4;
- }
- return 0;
- }
- return 0;
- }
- void moveTopeça(Position de, Position até) {
- if (éLegal(de, até)) { // Verifica se o movimento é legal
- if(jogamBrancas) {
- movevetor(positionWhities, de, até);
- jogamBrancas = false;
- }
- else {
- movevetor(positionBlackies, de, até);
- jogamBrancas = true;
- }
- }
- if(tekirisse(de, até)!=0) {
- if(jogamBrancas) {
- capturamove(positionWhities, de, até);
- jogamBrancas = false;
- }
- else {
- capturamove(positionBlackies, de, até);
- jogamBrancas = true;
- }
- }
- }
- // Método auxiliar para mover a peça nas listas (positionBlackies ou positionWhities)
- void movevetor(Position[] positions, Position from, Position to) {
- for (int i = 0; i < positions.length; i++) {
- if (positions[i] != null && positions[i].equals(from)) {
- positions[i] = to; // Atualiza a posição da peça
- }
- }
- }
- boolean posiçãoVálida(Position pos) {
- return !(pos.line() == -312 && pos.col() == -123);
- }
- void save(String fileName) {
- try {
- File file = new File(fileName);
- PrintWriter writer = new PrintWriter(file);
- // Grava o estado atual do jogo
- writer.println(jogamBrancas); // Quem joga
- writer.println(linha); // Número de linhas do tabuleiro
- writer.println(coluna); // Número de colunas do tabuleiro
- writer.println(blackCount); // Quantidade de peças pretas
- writer.println(whiteCount); // Quantidade de peças brancas
- // Grava as posições das peças brancas
- for (int i = 0; i < whiteCount; i++) {
- writer.println(positionWhities[i].line());
- writer.println(positionWhities[i].col());
- }
- // Grava as posições das peças pretas
- for (int i = 0; i < blackCount; i++) {
- writer.println(positionBlackies[i].line());
- writer.println(positionBlackies[i].col());
- }
- writer.close();
- System.out.println("Jogo gravado com sucesso em " + fileName);
- } catch (FileNotFoundException e) {
- System.out.println("Erro ao gravar o arquivo: " + e.getMessage());
- }
- }
- void load(String fileName) {
- try {
- File file = new File(fileName);
- Scanner scanner = new Scanner(file);
- jogamBrancas = Boolean.parseBoolean(scanner.nextLine());
- linha = Integer.parseInt(scanner.nextLine());
- coluna = Integer.parseInt(scanner.nextLine());
- blackCount = Integer.parseInt(scanner.nextLine());
- whiteCount = Integer.parseInt(scanner.nextLine());
- positionWhities = new Position[whiteCount];
- positionBlackies = new Position[blackCount];
- for (int i = 0; i < whiteCount; i++) {
- int line = Integer.parseInt(scanner.nextLine());
- int col = Integer.parseInt(scanner.nextLine());
- positionWhities[i] = new Position(line, col);
- }
- for (int i = 0; i < blackCount; i++) {
- int line = Integer.parseInt(scanner.nextLine());
- int col = Integer.parseInt(scanner.nextLine());
- positionBlackies[i] = new Position(line, col);
- }
- scanner.close();
- System.out.println("Jogo carregado com sucesso de " + fileName);
- } catch (FileNotFoundException e) {
- System.out.println("Erro: Arquivo não encontrado.");
- } catch (Exception e) {
- System.out.println("Erro ao carregar o arquivo: " + e.getMessage());
- }
- }
- }
Add Comment
Please, Sign In to add comment