Array, recursividade, oo preciso de ajuda!

4 respostas
dheyfesson

ola pessoal!!!

há horas estou batendo cabeça aqui mas num sai mais nada então resolvi compartilhar isso com vocês, porque em JAVA tudo se compartilha!!!rsrsrsrs... :D

pois bem eo seguinte:

estou tentando implementar um algoritmo que que simule a falha bizantina, acho que a maioria ja deve ter ouvido falar ou estudado isso !!!

porem estou tentando fazer com matrizes, e estou apanhando muito porque sou totalmente"virgem" em java, o codigo abaixo foi tudo o que consegui fazer ate agora, mas ainda tem uns erros que não tá dando para implementar.
por isso peço humildemente a ajuda de vocês para resolução desse algoritmo!!!!

public class Generais {

    int msgComandante;
    int[][] m = new int[4][4];

    public Generais() {

        Scanner sc = new Scanner(System.in);

        if (msgComandante == 1 || msgComandante == 0) {
            System.out.print("Informe a mensagem do comandante: 1 para ATACAR ou 0 para RECUAR:\t");
           msgComandante = sc.nextInt();
            System.out.println("A mensagem do comandante é: " + (msgComandante == 1 ? "ATACAR" : "RECUAR"));// essa mensagem aqui vai para todos!!!

        }

        if (m[0][0] == 1 || m[0][0] == 0) {
            System.out.print("Informe o carater do comandante: 1 para LEAL ou 0 para TRAIDOR:\t");
            m[0][0] = sc.nextInt();
            System.out.println("O carater do comandante é: " + (m[0][0] == 1 ? "LEAL" : "TRAIDOR"));
            
        }

        for (int i = 1; i <= 4; i++) {

            do {
                System.out.print("Informe o carater do general " + i + ": 1 para FIEL ou 0 para TRAIDOR\t");
                m[i][0] = sc.nextInt();
            } while (m[i][0] != 0 && m[i][0] != 1); 

            System.out.println("O general " + i + " é: " + (m[i][0] == 1 ? "FIEL" : "TRAIDOR"));
               //? aqui esta o problema da recursividade como faço para que o general receba a mensagem e                            //transfira para os outros sem enviar para ele mesmo e para que envio-lhe a mensagem??? 
        }
    }

    

    public void enviarMsgComandante() {
        if (m[0][0] == 1) { //se o comandante for fiel 

            for (int i = m[1][0]; i < 5; i++) {
                m[i][1] = msgComandante; //envia a mensagem do comandante para todos os generais
          
            }
        } else {// se nao for fiel
            for (int i = 1; i < 5; i++) {
                m[i][1] = Math.random(); //envia a mensagem do comandante para todos os generais randomizada para todos os nodos mas nao ta dando certo!!!

            }

        }

    }

complicado não é!!!
a logica e assim:

A envia mensagem p/ B,C,D
B envia mensagem p/ C,D
C envia mensagem p/ B,D
D envia mensagem p/ B,C

depois mostra a quantidade de msg e execulta a ação!!!"atacar" ou "recuar"

4 Respostas

gpd38

Como que vc quer isso em uma matriz [4] [4] ?

Seria deste jeito? X são as mensagens.

A - B - C - D
A-----x—x---x
B---------x—x
C-----x-------x
D-----x—x

coloca o seu main, pois nao entendi o que seu programa quer fazer

dheyfesson

exato!

obs: no metodo enviarMsgComandante da classe Generais, esqueci de colocar o,

System.out.println("A mensagem do comandante para o General " + i +  " foi " + (m[i][1]));

na classe main, apenas chamo o metodo para mostrar os resultados na tela.

public class Executa extends Generais {
    public static void main(String[] args) {
     
           
        Executa bizantinos = new Executa();
        bizantinos.enviarMsgComandante();
       
         
               
    }
}
douglas_vidotto

fala dheyfesson, blz? Ta um pouco complicado de entender oque voce quer fazer. Hum, para tentar ajudar passa o objetivo do seu programa. Oque voce está tentando construir? Qual é a função do array 4x4? talvez a gente possa te ajudar melhor.

Abraços!

dheyfesson

olha só consegui implementar mais um pouco do codigo porém ainda não consegui randomizar as mensagens!!!

dêem uma olhada e vejam se podem me ajudar ou digam se existe uma maneira mais simples de refazer isso tudo!!!

import java.util.Scanner;

public class Generais {

    int msgComandante;
    int[][] m = new int[4][8];

    public Generais() {

        Scanner sc = new Scanner(System.in);

        if (msgComandante == 1 || msgComandante == 0) {
            System.out.print("Informe a mensagem do comandante: 1 para ATACAR ou 0 para RECUAR:\t");
            msgComandante = sc.nextInt();
            System.out.println("A mensagem do comandante é: " + (msgComandante == 1 ? "ATACAR" : "RECUAR"));

        }

        if (m[0][0] == 1 || m[0][0] == 0) {
            System.out.print("Informe o carater do comandante: 1 para LEAL ou 0 para TRAIDOR:\t");
            m[0][0] = sc.nextInt();
            System.out.println("O carater do comandante é: " + (m[0][0] == 1 ? "LEAL" : "TRAIDOR"));

        }

        for (int i = 1; i <= 4; i++) {

            do {
                System.out.print("Informe o carater do general " + i + ": 1 para FIEL ou 0 para TRAIDOR\t");
                m[i][0] = sc.nextInt();
            } while (m[i][0] != 0 && m[i][0] != 1); //&& é operador lógico E  

            System.out.println("O general " + i + " é: " + (m[i][0] == 1 ? "FIEL" : "TRAIDOR"));

        }
    }

    public int randomico() {
       Math.random();
    }

    public void enviarMsgComandante() {
        if (m[0][0] == 1) { //se o comandante for fiel 

            for (int i = m[1][0]; i < 5; i++) {
                m[i][1] = msgComandante; //envia a mensagem do comandante para todos os generais

            }
        } else {
            for (int i = 1; i < 5; i++) {
                m[i][1] = randomico(); //envia a mensagem do comandante para todos os generais randomizada

            }

        }

    }

    public void envia_msg_1() {

        for (int c = 2; c < 5; c++) { //define as colunas destinadas à mesnagem 1, onde c=numero da coluna

            if (m[c - 1][0] == 1) //se o general for fiel
            {
                for (int i = 1; i < 5; i++) { // variavel i para percorrer as linhas, onde i =  numero da linha/general

                    if (i != (c - 1)) { // evita que um general envie mensagem para si mesmo

                        m[i][c] = m[c - 1][1]; // envia a mensagem 

                    } else {
                        m[i][c] = 3; // na linha/coluna do proprio general será enviado o valor 3 para diferenciar

                    }
                }
            } else {
                for (int i = 1; i < 5; i++) { //se o general nao for fiel o processo se repete, porem com a randomização da mensagem

                    if (i != (c - 1)) {
                        m[i][c] = randomico(); // envia a mensagem randomizada

                    } else {
                        m[i][c] = 3; // na linha/coluna do proprio general será enviado o valor 3 para diferenciar

                    }
                    System.out.println(i);
                }
            }
        }
    }

    public void decisao_1() {
        int a = 0;
        int r = 0;
        for (int i = 1; i < 5; i++) { // variavel i para percorrer as linhas onde i = o numero da linha/general

            for (int f = 2; f < 5; f++) { // variavel f para percorrer as colunas para onde foram enviadas as mensagens 1

                if (m[i][f] == 1) { // se a mensagem foi atacar "1", incrementa em "a"

                    a = a + 1;
                }
                if (m[i][f] == 0) { // se a mensagem foi recuar "0" , incrementa em "r"

                    r = r + 1;
                    System.out.println("a = " + a); 

                    System.out.println("r = " + r); 

                }
            }
            if (a > r) {
                m[i][2] = 1; //verifica se houve mais ATAQUES ou RECUOS 

            } else {
                m[i][2] = 0; //verifica se houve mais ATAQUES ou RECUOS 

            }
        }
    }

    public void envia_msg_2() {

        for (int c = 9; c < 9; c++) { //define as colunas destinadas à mesnagem 1, onde c=numero da coluna

            if (m[c - 4][0] == 1) //se o general for fiel
            {
                for (int i = 1; i < 5; i++) { // variavel i para percorrer as linhas, onde i =  numero da linha/general

                    if (i != (c - 4)) { // evita que um general envie mensagem para si mesmo

                        m[i][c] = m[c - 4][4]; // envia a mensagem 

                        System.out.println("A mens 2 receb pelo G " + i + " do G " + (c - 8) + " foi " + m[i][c]); 

                    } else {
                        m[i][c] = 3; // na linha/coluna do proprio general será enviado o valor 3 para diferenciar

                    }
                }
            } else {
                for (int i = 1; i < 5; i++) {
                    if (i != (c - 5)) { // evita que um general envie mensagem para si mesmo

                        m[i][c] = randomico(); // envia a mensagem randomizada

                        System.out.println("A mens 2 receb pelo G " + i + " do G " + (c - 8) + " foi " + m[i][c]);
                    } else {
                        m[i][c] = 3; // na linha/coluna do proprio general será enviado o valor 3 para diferenciar

                    }
                }
            }
        }
    }

    public void decisao_2() {

        for (int i = 1; i < 5; i++) { // variavel i para percorrer as linhas onde i = numero da linha/general

            int a = 0;
            int r = 0;
            for (int f = 4; f < 9; f++) { // variavel f para percorrer as colunas para onde foram enviadas as mensagens 2

                if (m[i][f] == 1) { // se a mensagem foi atacar "1", incrementa em "a"

                    a = a + 1;
                    System.out.println("a = " + a);//impressao de teste

                    System.out.println("r = " + r);//impressao de teste

                }
                if (m[i][f] == 0) { // se a mensagem foi recuar "0" , incrementa em "r"

                    r = r + 1;
                    System.out.println("a = " + a);//impressao de teste

                    System.out.println("r = " + r);//impressao de teste

                }
            }
            if (a > r) { //verifica se houve mais ATAQUES ou RECUOS 

                m[i][9] = 1;
                System.out.println("A decisão FINAL do G " + i + " foi ATACAR ");

            } else {
                m[i][9] = 0; //verifica se houve mais ATAQUES ou RECUOS 

                System.out.println("A decisão FINAL do G " + i + " foi  RECUAR ");
            }
        }
        //tomada de decisao do comandante baseada nas decisoes finais dos generais
        int a = 0;
        int r = 0;
        for (int i = 1; i < 5; i++) { // variavel i para percorrer as linhas onde i = numero da linha/general

            if (m[i][9] == 1) { // se a mensagem foi atacar "1", incrementa em "a"

                a = a + 1;

                System.out.println("a = " + a);

                System.out.println("r = " + r);

            }
            if (m[i][9] == 0) { // se a mensagem foi recuar "0" , incrementa em "r"

                r = r + 1;

                System.out.println("a = " + a);

                System.out.println("r = " + r);

            }
        }
        if (a > r) {
            System.out.println("A decisão FINAL do Exército foi ATACAR"); 

        } else {
            System.out.println("A decisão FINAL do Exército foi RECUAR"); 

        }
    }
}
Criado 19 de setembro de 2008
Ultima resposta 20 de set. de 2008
Respostas 4
Participantes 3