Ajuda para programar

6 respostas
M

tou com um problema e gostava qe alguem me pudesse ajudar:s
tenho qe fazer um programa e nao sei como… o problema e este:

"O Jogo da Vida (Game of Life ou Life) é um autómato celular proposto em 1970 pelo matemático britânico John Horton Connway. Na realidade, trata-se de uma simulação e não de um jogo com jogadores. Desenvolve-se numa grelha infinita, na qual cada célula pode estar ocupada por um organismo ou não. Células ocupadas dizem-se que estão vivas e as não ocupadas dizem-se mortas. Em cada geração as células que estão vivas mudam o seu estado em função do número de células vizinhas que estão vivas de acordo com as seguintes regras:

* Os vizinhos de uma célula são as 8 células que a tocam na horizontal, vertical ou diagonal.
* Se uma célula estiver viva e o número de células vizinhas vivas for 0 ou 1, então na geração seguinte a célula morre de solidão.
* Se uma célula está viva e tem 4 ou mais células vizinhas também vivas, então na geração seguinte a célula morre de sobre-povoamento.
* Uma célula viva com 2 ou 3 células vizinhas vivas, continua viva na geração seguinte.
* Se uma célula morta tiver exactamente 3 células vizinhas vivas, muda para o estado de célula viva na geração seguinte.
* Todos os nascimentos e mortes de células têm lugar em simultâneo, isto é as alterações têm por base o estado actual e nunca o estado futuro.

Neste problema vamos considerar que a grelha é finita e que as células que a envolvem estão sempre mortas.
Input

A primeira linha contém três inteiros positivos: o número de linhas L e de colunas C que determinam a dimensão da grelha do jogo e o número de iterações I que devrá realizar.

Seguem-se L linhas de caracteres a representar o estado actual do jogo. As células mortas estão representadas por ‘.’ e as vivas por ‘O’.
Output

Deve imprimir o estado do jogo ao fim de $I$ iterações, isto é, imprimir a matriz que representa a grelha do jogo com as células mortas marcadas com ‘.’ e as células vivas com ‘O’.

Exemplo de input/output

Input	Output

5 5 5
.....
.....
.OOO.
.....
.....

	

.....
..O..
..O..
..O..
.....
""

obrigado a quem puder ajudar…

6 Respostas

T

Lembro que meu professor passou mais ou menos o mesmo problema, há uns 25 anos atrás. Naquela época o problema ainda não era tão velho assim…

M

o output é isto


…O…
…O…
…O…

A

uma pergunta, as células que envolvem (que são todas mortas) já estão consideradas no input ou o input é só a “parte interior” das células?

M

os “.” sao as celulas mortas… assim ja estao a ser consideradas no input, pelo qe entendi

A

Ta aí duas funções pra fazer o que você quer...
considerando que L, C, I e CelViva[][] são variáveis globais.
Acho que é isso... não testei

static int L, C, I;
	static boolean[][] celViva;
	
	public void leArquivo(){
		
		//lê o arquivo todo
		//e salva cada linha em uma String no ArrayList linhas
		FileReader input = null;
		StringBuffer tempStr = new StringBuffer();
		ArrayList<String> linhas = new ArrayList<String>();
		int c;
		try {
			input = new FileReader("ArquivoDeEntrada.txt");
			while((c=input.read())!=-1){
				if(c == '\n')
				{
					linhas.add(tempStr.toString().trim());
					tempStr = new StringBuffer();
				}
				else
					tempStr.append((char)c);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//processa a primeira linha
		int indexEspaco=0;
		L = Integer.parseInt(linhas.get(0).substring(indexEspaco, linhas.get(0).indexOf(" ", indexEspaco)));
		indexEspaco = linhas.get(0).indexOf(" ", indexEspaco)+1;
		C = Integer.parseInt(linhas.get(0).substring(indexEspaco, linhas.get(0).indexOf(" ", indexEspaco)));
		indexEspaco = linhas.get(0).indexOf(" ", indexEspaco)+1;
		I = Integer.parseInt(linhas.get(0).substring(indexEspaco));
		linhas.remove(0);
		
		//processa as linhas restantes
		celViva = new boolean[L][C];
		for(int i=0; i<L; i++){
			String str = linhas.get(i);
			for(int j=0; j<C; j++){
				if(str.charAt(j)=='.')
					celViva[i][j] = true;
				else if(str.charAt(j)=='O')
					celViva[i][j] = false;
				else{
					System.out.println("Temos uma célula mutante em [" + i + "," + j + "]!!");
					System.exit(-1);
				}
			}
		}
	}
	
	public boolean[][] iterar(){
		boolean[][] estadoPos = new boolean[L][C];
		for(int i=0; i<L; i++){
			for(int j=0; j<C; j++){
				
				//verifica a quantidade de células vivas ao redor da celula (i,j) garantindo que não use indices ilegais

				int celVivasAoRedor = 0;
				if(i-1 >= 0 && j-1 >= 0)
					if(celViva[i-1][j-1])
						celVivasAoRedor++;
				if(i-1 >= 0)
					if(celViva[i-1][j])
						celVivasAoRedor++;
				if(i-1 >= 0 && j+1 < C)
					if(celViva[i-1][j+1])
						celVivasAoRedor++;
				if(j-1 >= 0)
					if(celViva[i][j-1])
						celVivasAoRedor++;
				if(j+1 < C)
					if(celViva[i][j+1])
						celVivasAoRedor++;
				if(i+1 < L && j-1 >= 0)
					if(celViva[i+1][j-1])
						celVivasAoRedor++;
				if(i+1 < L)
					if(celViva[i+1][j])
						celVivasAoRedor++;
				if(i+1 < L && j+1 <C )
					if(celViva[i+1][j+1])
						celVivasAoRedor++;
				
				//determina o estado da celula (i,j) na proxima geração
				if(celViva[i][j]){
					if(celVivasAoRedor == 0 || celVivasAoRedor == 1 || celVivasAoRedor >= 4)
						estadoPos[i][j] = false;
					else if(celVivasAoRedor == 2 || celVivasAoRedor == 3)
						estadoPos[i][j] = true;
				}
				else if(!celViva[i][j]){
					if(celVivasAoRedor == 3)
						estadoPos[i][j] = true;
					else
						estadoPos[i][j] = false;
				}
			}
		}
		celViva = estadoPos;
		return estadoPos;
	}
	
	public boolean[][] iterar(int n){
		for(int i=0; i<n; n++){
			celViva = iterar();
		}
		return celViva;
	}
B

Ah, fiz um jogo desses há um tempo atrás, com Swing:

Mapa.java

package jogodavida;

public class Mapa
{
    // true = celula viva
    private boolean[][] matriz;
    private int altura;
    private int largura;

    public Mapa(int largura, int altura)
    {
        this.matriz = new boolean[altura][largura];
        this.altura = altura;
        this.largura = largura;
    }

    /**
     * x = matriz[linha][coluna]
     * 
     * Vizinhos de x na matriz:
     * 
     * 123
     * 4x5
     * 678
     * 
     * @param linha
     * @param coluna
     * @return int quantidade de vizinhos vivos da célula
     */
    private int getQtdVizinhos(int linha, int coluna)
    {
        int qtd = 0;

        // Faz um mapa sem fronteiras, onde indo p/ cima acaba saido em baixo
        int linhaCima   = (linha  == 0)           ? altura  - 1 : linha  - 1;
        int linhaBaixo  = (linha  == altura  - 1) ? 0           : linha  + 1;
        int colunaCima  = (coluna == 0)           ? largura - 1 : coluna - 1;
        int colunaBaixo = (coluna == largura - 1) ? 0           : coluna + 1;
        
        //1
        if (matriz[linhaCima][colunaCima])
            qtd++;

        //2
        if (matriz[linhaCima][coluna])
            qtd++;

        //3
        if (matriz[linhaCima][colunaBaixo])
            qtd++;

        //4
        if (matriz[linha][colunaCima])
            qtd++;

        //5
        if (matriz[linha][colunaBaixo])
            qtd++;

        //6
        if (matriz[linhaBaixo][colunaCima])
            qtd++;

        //7
        if (matriz[linhaBaixo][coluna])
            qtd++;

        //8
        if (matriz[linhaBaixo][colunaBaixo])
            qtd++;
        
        return qtd;
    }

    /**
     * Regra 1: Celula morre se vizinhos < 2
     * Regra 2: Celula morre se vizinhos > 3
     * Regra 3: Celula nasce se vizinhos == 3
     * Regra 4: Celula continua a mesma se vizinhos == 2
     * 
     * @param linha
     * @param coluna
     * @return boolean Novo estado da célula
     */
    private boolean aplicaRegras(int linha, int coluna)
    {
        int qtd = getQtdVizinhos(linha, coluna);

        if (matriz[linha][coluna] && (qtd < 2 || qtd > 3))
            return false;
        else if (!matriz[linha][coluna] && (qtd == 3 || qtd == 6))
            return true;
        else
            return matriz[linha][coluna];
    }

    /**
     * Calcula o próximo estado do mapa de células
     */
    public void avaliaTodos()
    {
        boolean[][] matrizNova = new boolean[altura][largura];

        for (int linha = 0; linha < altura; linha++)
            for (int coluna = 0; coluna < largura; coluna++)
                matrizNova[linha][coluna] = aplicaRegras(linha, coluna);

        matriz = matrizNova;
    }

    public void mudaCelula(int linha, int coluna)
    {
        if (linha < 0 || linha >= altura || coluna < 0 || coluna >= largura)
            throw new IndexOutOfBoundsException("Índice: (" + linha + "," + coluna + ")");

        matriz[linha][coluna] = !matriz[linha][coluna];
    }

    public void limpar()
    {
        this.matriz = new boolean[altura][largura];
    }

    public boolean[][] getMatriz()
    {
        return matriz;
    }

    public int getAltura()
    {
        return altura;
    }

    public int getLargura()
    {
        return largura;
    }
}

JogoDaVida.java

package jogodavida;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.Timer;

public class JogoDaVida extends javax.swing.JFrame implements ActionListener
{
    private final Dimension MIN;
    private final Mapa mapa;
    private Timer timer;
    private int speed;
    private int PIXEL_SIZE;

    public JogoDaVida(Mapa mapa, int pixel)
    {
        this.mapa = mapa;
        this.PIXEL_SIZE = pixel;
        this.MIN = new Dimension(mapa.getLargura() * pixel, mapa.getAltura() * pixel);
        this.speed = 500;
        this.timer = new Timer(speed, this);

        initComponents();
    }

    private void desenhaMapa()
    {
        Graphics g = painel.getGraphics();

        int p = PIXEL_SIZE;
        
        for (int linha = 0; linha < mapa.getAltura(); linha++)
            for (int coluna = 0; coluna < mapa.getLargura(); coluna++)
                if (mapa.getMatriz()[linha][coluna])
                    g.fillRect(coluna * p, linha * p, p, p);
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        desenhaMapa();
    }

    public void actionPerformed(ActionEvent e)
    {
        mapa.avaliaTodos();
        repaint();
        timer.restart();
    }

    public static void main(String args[])
    {
        final Mapa mapa = new Mapa(64, 64);

        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new JogoDaVida(mapa, 10).setVisible(true);
            }
        });
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

painel = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Jogo da Vida");
setResizable(false);
addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
formMouseClicked(evt);
}
});
addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
formKeyPressed(evt);
}
});

painel.setBackground(new java.awt.Color(255, 255, 255));
painel.setName("painel"); // NOI18N
painel.setPreferredSize(MIN);

javax.swing.GroupLayout painelLayout = new javax.swing.GroupLayout(painel);
painel.setLayout(painelLayout);
painelLayout.setHorizontalGroup(
painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 10, Short.MAX_VALUE)
);
painelLayout.setVerticalGroup(
painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 10, Short.MAX_VALUE)
);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(painel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(painel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

pack();
}// </editor-fold>//GEN-END:initComponents

private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked
    if (painel.getMousePosition() != null)
    {
        int x = painel.getMousePosition().x;
        int y = painel.getMousePosition().y;

        int p = PIXEL_SIZE;
        int linha = y / p;
        int coluna = x / p;

        mapa.mudaCelula(linha, coluna);
        //repaint();
        repaint(coluna * p, linha * p, (coluna + 1) * p, (linha + 1) * p);
    }
}//GEN-LAST:event_formMouseClicked

private void formKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyPressed
    int key = evt.getKeyCode();

    if (key == KeyEvent.VK_SPACE)
        if (timer.isRunning())
            timer.stop();
        else
            timer.restart();
    else if (key == KeyEvent.VK_RIGHT)
    {
        timer.stop();
        if (speed > 50)
            speed -= 50;

        timer = new Timer(speed, this);
        timer.start();
    }
    else if (key == KeyEvent.VK_LEFT)
    {
        timer.stop();
        if (speed < 2000)
            speed += 50;

        timer = new Timer(speed, this);
        timer.start();

    }
    else if (key == KeyEvent.VK_C)
    {
        timer.stop();
        mapa.limpar();
        repaint();
    }
    else if (key == KeyEvent.VK_ESCAPE)
        System.exit(0);
}//GEN-LAST:event_formKeyPressed

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel painel;
// End of variables declaration//GEN-END:variables
}
Criado 9 de abril de 2009
Ultima resposta 10 de abr. de 2009
Respostas 6
Participantes 4