• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Wizz

Erro em math.random()

3 mensagens neste tópico

Boas. Estou a fazer um programa que deve ser mais ou menos como o conhecido jogo do mastermind.

O enunciado é o seguinte:

Desenvolva um programa em Java onde devem ser sorteados 4 dígitos (que deverão ser armazenados num vector). Os dígitos não podem ser repetidos e devem ser sorteados do intervalo 0 - 9;

O jogador deve adivinhar quais os dígitos sorteados e as posições correctas destes, inserido em cada tentativa um conjunto de 4 dígitos;

A cada jogada o programa deve informar quantos dígitos estavam correctos e na posição correcta e quantos dígitos estavam correctos na posição incorrecta.

O programa também deve informar os jogadores de quantas tentativas este ainda tem (no máximo 10) e quantas já foram realizadas.

Se o jogador não adivinhar em 10 tentativas, o programa deve dar uma mensagem apropriada e informar qual a combinação que se procurava. Se o jogador adivinhar antes, o programa deve dar uma mensagem de parabéns. Em ambos os casos o jogo termina.

Após a conclusão do jogo deve ser possível continuar a jogar ou terminar o programa.

Pretende-se que o programa seja elaborado em ambiente gráfico devidamente personalizado. Tenha em conta o design da aplicação.


O código que tenho é este:

import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;

public class Mastermind1 implements ActionListener 
{
int num1, num2, num3, num4;
int tentativas = 0 ;
int tentativasr = 10 ;
int vale=0;
int npos=0;
int nume1=(int)(Math.random()*10);
int nume2=(int)(Math.random()*10);
int nume3=(int)(Math.random()*10);
int nume4=(int)(Math.random()*10);
JButton[] btn=new JButton[40];
JLabel posc=new JLabel("");
JLabel numc=new JLabel("");
JLabel tenta1=new JLabel("Tentativas Executadas: " + tentativas);
JLabel tenta2=new JLabel("Tentativas Restantes: " + tentativasr);
JLabel numero=new JLabel("N1");
JLabel numero2=new JLabel("N2");
JLabel numero3=new JLabel("N3");
JLabel numero4=new JLabel("N4");
Mastermind1 ()
{
	JPanel painel=new JPanel();
	JFrame janela=new JFrame("Mastermind");
	painel.setLayout(new GridBagLayout());
	GridBagConstraints c = new GridBagConstraints();
	janela.setSize(600,400);
	//janela.setResizable(false);
	janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	ImageIcon Master1=new ImageIcon("mind.png");
	JLabel Mind = new JLabel(Master1);
	c.fill=GridBagConstraints.BOTH;
	c.insets = new Insets(2,2,2,2);
	char letra=' ';
	for (int x=0;x<40;x++) {
		if ((int)(x/10) == 0) letra='a';
		if ((int)(x/10) == 1) letra='b';
		if ((int)(x/10) == 2) letra='c';
		if ((int)(x/10) == 3) letra='d';
		btn[x]=new JButton(""+letra+x%10);
		btn[x].addActionListener(this);
		btn[x].setPreferredSize(new Dimension(35,35));
		btn[x].setMargin(new Insets(0,0,0,0));
		btn[x].setBackground(new Color(255,255,255));

	}
	c.gridx=0;
	c.gridy=0;
	c.gridwidth = 10;
	painel.add(Mind, c);
	c.gridwidth = 1;
	for (int x=0;x<4;x++)
	{
		c.gridy=x+1;

		for (int y=0;y<10;y++)
		{
			c.gridx=y;
			painel.add(btn[x*10+y], c);
		}
	}
	c.gridwidth=5;
	c.gridx=0;
	c.gridy=5;
	painel.add(tenta1, c);
	c.gridwidth=4;
	c.gridx=6;
	c.gridy=5;
	painel.add(tenta2, c);
while(int i<10)
{
	c.gridwidth=1;
	c.gridx=0;
	c.gridy=;
	painel.add(numero, c);
	c.gridwidth=1;
	c.gridx=1;
	c.gridy=6;
	painel.add(numero2, c);
	c.gridwidth=1;
	c.gridx=2;
	c.gridy=6;
	painel.add(numero3, c);
	c.gridwidth=1;
	c.gridx=3;
	c.gridy=6;
	painel.add(numero4, c);
}
	//c.gridwidth=4;
	//c.gridx=6;
	//c.gridy=6;
	//painel.add(posc, c);
	janela.add(painel);

	janela.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
  		int xpto=Integer.parseInt(""+e.getActionCommand().charAt(1));
  		switch(e.getActionCommand().charAt(0))
  		{
  			
  			case 'a':
			btn[xpto].setBackground(new Color(0,0,253));
			for (int a=0; a<10; a++)
				btn[a].setEnabled(false);
			num1=Integer.parseInt(""+e.getActionCommand().charAt(1));
			numero.setText(" "+ num1 + " ");
			vale++;
			break;
		case 'b':
			btn[10+xpto].setBackground(new Color(0,0,253));
			for (int b=10; b<20; b++) 
				btn[b].setEnabled(false);
			num2=Integer.parseInt(""+e.getActionCommand().charAt(1));
			numero2.setText(" "+ num2 + " ");
			vale++;
			break;
		case 'c':
			btn[20+xpto].setBackground(new Color(0,0,253));
			for (int c=20; c<30; c++) 
				btn[c].setEnabled(false);
			num3=Integer.parseInt(""+e.getActionCommand().charAt(1));
			numero3.setText(" "+ num3 + " ");
			vale++;
			break;
		case 'd':
			btn[30+xpto].setBackground(new Color(0,0,253));
			for (int d=30; d<40; d++) 
				btn[d].setEnabled(false);
			num4=Integer.parseInt(""+e.getActionCommand().charAt(1));
			numero4.setText(" "+ num4 + " ");
			JOptionPane.showMessageDialog(null, "Numero4: " + nume4);
			vale++;
			break;
	}
	 if(vale==4)
	 {
			tenta1.setText("Tentativas Executadas: " + (++tentativas));
			tenta2.setText("Tentativas Restantes: " + (--tentativasr));
			vale=0;
		for (int i=0; i<40; i++) 
		{
			btn[i].setEnabled(true);
			btn[i].setBackground(new Color(255,255,255));
		}
		if(tentativas==10 && tentativasr==0)
			System.exit(0);
	 }
}
public static void main(String[] args)	
{
	SwingUtilities.invokeLater(
	new Runnable() 
	{  
		public void run() 
		{  
			new Mastermind1();  
		}  
	}
	);  	
}
}

Mas o math.random() para a gestão dos 4 números a serem seleccionados não está a funcionar, e por vezes repete. Se alguém poder ajudar agradeço :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E se experimentasses utilizar o nextInt:

Experimenta algo do tipo:


    public int gerarInt(int min, int max){

    int num=0;

    Random rd = new Random();

    num = min + rd.nextInt(max - min);

    return num;

    }

min = ao minimo a gerar e max = ao maximo a gerar

Sempre utilizei este método e raramente me repete números, apesar de isso ser possivel, visto ser random :)

Se for mesmo prioritário que não gere nenhum numero igual, então sugiro que ao método, adiciones 1 int e após gerar o número, o compares com o anterior e se for igual, pedes outro..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, é a parte final que disseste que vou fazer, porque não pode mesmo repetir nenhum número :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora