Проблематика
У меня есть программа, в которой я делаю алгоритм N Королевы графической формы для того, чтобы Вы были игрой, вся программа функционирует хорошо, и когда королевы размещены правильной формы все, бежит совершенно, но моя проблема начинается следующего способа.
Когда я двигаю предметы, у меня есть договоренность, где меня, должно быть, представляет настоящая позиция предмета в табло (Все то, что я говорю, я печатаю в программе), но иногда, когда мне удается двинуть предметы очень быстро, Вы не делаете мне операции должным образом и aveces Вы помещаете мне плохо договоренность, это не замечает с компьютера так, что я имею, так как у Вас есть хорошие компоненты, но когда я прохожу программу на распространенном компьютере, начинает производить проблемы с этим.
Я думаю, что главная проблема - методы mouseReleased
и mousePressed
где я выполняю операции, которые берутся за договоренность, о которой я упоминаю Вам, не, как он мог бы улучшать отдачу программы для того, чтобы все было выполнено лучшего способа, так этих методов, о которых я упоминаю как и остаюсь от методов программы, так что, если Вы могли помогать мне с этим, он Вам был бы очень благодарен.
Метод
posicion
Вы оптимизированы плохо в большей степени и во многих ocaciones Вы производите ошибки, установив элементы.
РЕЗЮМЕ
Программа не удается в некоторых случаях, хотя все королевы будут размещены должным образом, единственная форма, которой программа удается безусловно, состоит в том, чтобы двигать предметы очень медленной формы и Вам удается дать сообщение Felicidades, completaste el juego de N reinas
взамен с ошибкой, за которой последует в некоторых случаях программа, просто Вы бросаете где сообщение упоминая об ошибке, хотя это не будет правильно.
package otraprueba;
import java.awt.Color;
import java.awt.event.*;
import javax.swing.BorderFactory;
import javax.swing.*;
import javax.swing.border.Border;
public class OtraPrueba extends JFrame implements ActionListener {
static int reinas = 0;
String[][] algoritmo = new String[reinas][reinas];
String[][] comprobacion = new String[reinas][reinas];
int count = 0;
int anchoAlto = 50;
int margen = 25;
int espacio = 50;
JPanel jpanel = (JPanel) this.getContentPane();
JLabel ex = new JLabel();
JLabel label[] = new JLabel[reinas];
JLabel tablero[][] = new JLabel[reinas][reinas];
Border border = BorderFactory.createLineBorder(Color.black, 1);
String[] parts;
int x, y, cooX, cooY, newI, newJ;
JButton boton1;
public static void main(String[] args) {
reinas = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese la cantidad de reinas"));
OtraPrueba op = new OtraPrueba();
op.setBounds(0, 0, (60 * reinas), (60 * reinas));
op.setVisible(true);
op.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public OtraPrueba() {
// Declaracion de reinas
for (int i = 0; i < label.length; i++) {
label[i] = new JLabel();
// r + r + r + r
label[i].setBounds(margen + (espacio * i), margen, anchoAlto, anchoAlto);
label[i].setText("Q" + (i + 1));
label[i].setForeground(Color.red);
label[i].setBorder(border);
label[i].setHorizontalAlignment(SwingConstants.CENTER);
label[i].addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent evt) {
arrastreReina(evt);
}
});
label[i].addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent evt) {
arregloTablero(evt);
}
@Override
public void mousePressed(MouseEvent evt) {
valoresIniciales(evt);
}
});
jpanel.add(label[i]);
for (int j = 0; j < algoritmo.length; j++) {
if (i == 0) {
algoritmo[i][j] = Integer.toString((margen + (espacio * j))) + "|" + Integer.toString(margen);
} else {
algoritmo[i][j] = "0|0";
}
}
}
// Declaracion del tablero
for (int i = 0; i < tablero.length; i++) {
for (int j = 0; j < tablero.length; j++) {
tablero[i][j] = new JLabel();
tablero[i][j].setBounds(margen + (espacio * i), margen + (espacio * j), anchoAlto, anchoAlto);
tablero[i][j].setBorder(border);
if ((i % 2 == 0) == (j % 2 == 0)) {
tablero[i][j].setBackground(Color.white);
} else {
tablero[i][j].setBackground(Color.black);
}
tablero[i][j].setOpaque(true);
tablero[i][j].setHorizontalAlignment(SwingConstants.CENTER);
jpanel.add(tablero[i][j]);
}
}
// Declaracion del boton
setLayout(null);
boton1 = new JButton("Finalizar");
boton1.setBounds(25, 3, 90, 20);
jpanel.add(boton1);
boton1.addActionListener(this);
ex.setBounds(margen, margen, anchoAlto, anchoAlto);
jpanel.add(ex);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == boton1) {
for (int i = 0; i < comprobacion.length; i++) {
for (int j = 0; j < comprobacion.length; j++) {
if (algoritmo[i][j].equals("0|0")) {
comprobacion[i][j] = "*";
} else {
comprobacion[i][j] = "+";
}
}
}
imprimirArreglo(comprobacion);
int contUno = 0;
int contDos = 0;
int contTres = 0;
int diagS, diagI;
for (int i = 0; i < comprobacion.length; i++) {
for (int j = 0; j < comprobacion.length; j++) {
// Comprobacion de filas
if (comprobacion[i][j].equals("+")) {
contUno++;
if (contUno == 2) {
JOptionPane.showMessageDialog(null, "Existe más de una reina en una fila");
break;
}
}
// Comprobacion de columnas
if (comprobacion[j][i].equals("+")) {
contDos++;
if (contDos == 2) {
JOptionPane.showMessageDialog(null, "Existe más de una reina en una columna");
break;
}
// Comprobacion de diagonales
diagS = j - 1;
diagI = j + 1;
if (diagS < 0) {
diagS = 0;
} else if (diagI >= comprobacion.length) {
diagI = (comprobacion.length - 1);
}
System.out.println("S/I: " + diagS + "/" + diagI);
if (i < comprobacion.length - 1) {
if (comprobacion[diagS][i + 1].equals("+") || comprobacion[diagI][i + 1].equals("+")) {
JOptionPane.showMessageDialog(null, "En alguna diagnoal de las reinas existe mas de una reina");
contTres = 2;
break;
}
}
}
}
if (contUno == 2 || contDos == 2 || contTres == 2) {
break;
}
contUno = 0;
contDos = 0;
contTres = 0;
}
if (contUno == 0 && contDos == 0 && contTres == 0) {
JOptionPane.showMessageDialog(null, "Felicidades, completaste el juego de N Reinas");
}
}
}
public void arrastreReina(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
((JLabel) evt.getSource()).setLocation(posicion(evt)[0], posicion(evt)[1]);
}
}
public void valoresIniciales(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
this.newI = (posicion(evt)[1] - 25) / 50;
this.newJ = (posicion(evt)[0] - 25) / 50;
x = posicion(evt)[0];
y = posicion(evt)[1];
System.out.println("INI X/Y: " + this.newI + "/" + this.newJ);
System.out.println("X/Y: " + x + "/" + y);
}
}
public void arregloTablero(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
int newX = (posicion(evt)[0] - x) / 50;
int newY = (posicion(evt)[1] - y) / 50;
System.out.println("pos X/Y: " + posicion(evt)[0] + "/" + posicion(evt)[1]);
System.out.println("newX: " + newX + "\nnewY: " + newY);
algoritmo[newI][newJ] = "0|0";
System.out.println("newI/newJ: " + newI + "/" + newJ);
algoritmo[newI + newY][newJ + newX] = Integer.toString(posicion(evt)[0]) + "|" + Integer.toString(posicion(evt)[1]);
count++;
System.out.println("Movimientos: " + count);
imprimirArreglo(algoritmo);
}
}
public void imprimirArreglo(String[][] arreglo) {
for (String[] arreglo1 : arreglo) {
for (int j = 0; j < arreglo.length; j++) {
System.out.print(arreglo1[j] + " ");
}
System.out.println("");
}
}
public int[] posicion(MouseEvent evt) {
int newX, newY;
// Variables de entorno X
String conX = Integer.toString(evt.getXOnScreen());
String ultimoX = conX.substring(conX.length() - 2, conX.length());
int primerosMenosUltimosX = Integer.parseInt(ultimoX);
if (primerosMenosUltimosX < 25) {
newX = 25 + (evt.getXOnScreen() - espacio - primerosMenosUltimosX);
} else if (primerosMenosUltimosX < 75) {
newX = 75 + (evt.getXOnScreen() - espacio - primerosMenosUltimosX);
} else {
newX = 25 + ((evt.getXOnScreen() - espacio + 100) - primerosMenosUltimosX);
}
// Variables de entorno Y
String conY = Integer.toString(evt.getYOnScreen());
String ultimoY = conY.substring(conY.length() - 2, conY.length());
int primerosMenosUltimosY = Integer.parseInt(ultimoY);
if (primerosMenosUltimosY < 25) {
newY = 25 + (evt.getYOnScreen() - espacio - primerosMenosUltimosY);
} else if (primerosMenosUltimosY < 75) {
newY = 75 + (evt.getYOnScreen() - espacio - primerosMenosUltimosY);
} else {
newY = 25 + ((evt.getYOnScreen() - espacio + 100) - primerosMenosUltimosY);
}
int retorno[] = {newX, newY};
return retorno;
}
}
В действительности есть проблема, которая производится, освободив мышь mouseReleased ()> arregloTablero () и есть:
java.lang. ArrayIndexOutOfBoundsException
, который производится в, когда ты освобождаешь мышь и пробуешь изменять стоимость в одной posiciГіn не существующий array:
algoritmo[newI][newJ] = "0|0";
В действительности ты должен использовать стоимость newI
и newJ
вычисленных, но начиная с mГ©todo posicion()
:
public void arregloTablero(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
int position[] = posicion(evt);
int newX = posicion(evt)[0];
int newY = posicion(evt)[1];
newI = (newX - 25) / 50;
newJ = (newY - 25) / 50;
//int newX = (posicion(evt)[0] - x) / 50;
//int newY = (posicion(evt)[1] - y) / 50;
...
...
//* error algoritmo[newI][newJ] = "0|0";
//Reemplaza con valor de posición.
algoritmo[newJ][newI] = newX + "|" + newY;
...
...
Начальная стоимость "0|0" должна быть заменена внутри mГ©todo valoresIniciales()
:
algoritmo[newJ][newI] = "0|0";
Проблема в действительности - вычисление ячеек, так как от случая к случаю получается неправильная или отрицательная стоимость, которые не существуют в array!
у Тебя Есть какие-то проблемы в них mГ©todo arregloTablero()
, posicion()
, даже в ней impresiГіn стоимости договоренности осуществляется некорректно, потому что должны быть введенными algoritmo[newJ][newI]
вместо algoritmo[newI][newJ]
для того, чтобы оно функционировало правильно mГ©todo imprimirArreglo()
:
import java.awt.Color;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.BorderFactory;
import javax.swing.*;
import javax.swing.border.Border;
public class OtraPrueba extends JFrame implements ActionListener {
static int reinas = 3;
String[][] algoritmo = new String[reinas][reinas];
String[][] comprobacion = new String[reinas][reinas];
int count = 0;
int anchoAlto = 50; //Alto celda
int margen = 25; //Margen superior, donde se posiciona botón finalizar.
int espacio = 50; //Ancho celda
JPanel jpanel = (JPanel) this.getContentPane();
JLabel ex = new JLabel();
JLabel label[] = new JLabel[reinas];
JLabel tablero[][] = new JLabel[reinas][reinas];
Border border = BorderFactory.createLineBorder(Color.black, 1);
String[] parts;
int x, y, cooX, cooY, newI, newJ;
JButton boton1;
public static void main(String[] args) {
reinas = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese la cantidad de reinas"));
OtraPrueba op = new OtraPrueba();
op.setBounds(0, 0, (60 * reinas), (60 * reinas));
op.setVisible(true);
op.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public OtraPrueba() {
// Declaracion de reinas
for (int i = 0; i < label.length; i++) {
label[i] = new JLabel();
// r + r + r + r
label[i].setBounds(margen + (espacio * i), margen, anchoAlto, anchoAlto);
label[i].setText("Q" + (i + 1));
label[i].setForeground(Color.red);
label[i].setBorder(border);
label[i].setHorizontalAlignment(SwingConstants.CENTER);
label[i].addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent evt) {
arrastreReina(evt);
}
});
label[i].addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent evt) {
//System.out.println("mouseReleased " + evt.toString());
arregloTablero(evt);
}
@Override
public void mousePressed(MouseEvent evt) {
//System.out.println("mousePressed " + evt.toString());
valoresIniciales(evt);
}
});
jpanel.add(label[i]);
for (int j = 0; j < algoritmo.length; j++) {
if (i == 0) {
algoritmo[i][j] = Integer.toString((margen + (espacio * j))) + "|" + Integer.toString(margen);
} else {
algoritmo[i][j] = "0|0";
}
}
}
// Declaracion del tablero
for (int i = 0; i < tablero.length; i++) {
for (int j = 0; j < tablero.length; j++) {
tablero[i][j] = new JLabel();
tablero[i][j].setBounds(margen + (espacio * i), margen + (espacio * j), anchoAlto, anchoAlto);
tablero[i][j].setBorder(border);
if ((i % 2 == 0) == (j % 2 == 0)) {
tablero[i][j].setBackground(Color.white);
} else {
tablero[i][j].setBackground(Color.black);
}
tablero[i][j].setOpaque(true);
tablero[i][j].setHorizontalAlignment(SwingConstants.CENTER);
jpanel.add(tablero[i][j]);
}
}
// Declaracion del boton
setLayout(null);
boton1 = new JButton("Finalizar");
boton1.setBounds(25, 3, 90, 20);
jpanel.add(boton1);
boton1.addActionListener(this);
ex.setBounds(margen, margen, anchoAlto, anchoAlto);
jpanel.add(ex);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == boton1) {
for (int i = 0; i < comprobacion.length; i++) {
for (int j = 0; j < comprobacion.length; j++) {
if (algoritmo[i][j].equals("0|0")) {
comprobacion[i][j] = "*";
} else {
comprobacion[i][j] = "+";
}
}
}
imprimirArreglo(comprobacion);
int contUno = 0;
int contDos = 0;
int contTres = 0;
int diagS, diagI;
for (int i = 0; i < comprobacion.length; i++) {
for (int j = 0; j < comprobacion.length; j++) {
// Comprobacion de filas
if (comprobacion[i][j].equals("+")) {
contUno++;
if (contUno == 2) {
JOptionPane.showMessageDialog(null, "Existe más de una reina en una fila");
break;
}
}
// Comprobacion de columnas
if (comprobacion[j][i].equals("+")) {
contDos++;
if (contDos == 2) {
JOptionPane.showMessageDialog(null, "Existe más de una reina en una columna");
break;
}
// Comprobacion de diagonales
diagS = j - 1;
diagI = j + 1;
if (diagS < 0) {
diagS = 0;
} else if (diagI >= comprobacion.length) {
diagI = (comprobacion.length - 1);
}
System.out.println("S/I: " + diagS + "/" + diagI);
if (i < comprobacion.length - 1) {
if (comprobacion[diagS][i + 1].equals("+") || comprobacion[diagI][i + 1].equals("+")) {
JOptionPane.showMessageDialog(null, "En alguna diagonal de las reinas existe mas de una reina");
contTres = 2;
break;
}
}
}
}
if (contUno == 2 || contDos == 2 || contTres == 2) {
break;
}
contUno = 0;
contDos = 0;
contTres = 0;
}
if (contUno == 0 && contDos == 0 && contTres == 0) {
JOptionPane.showMessageDialog(null, "Felicidades, completaste el juego de N Reinas");
}
}
}
public void arrastreReina(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
((JLabel) evt.getSource()).setLocation(posicion(evt)[0], posicion(evt)[1]);
}
}
public void valoresIniciales(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
this.newI = (posicion(evt)[0] - 25) / 50;
this.newJ = (posicion(evt)[1] - 25) / 50;
x = posicion(evt)[0];
y = posicion(evt)[1];
System.out.println("* iniciales INI X/Y: " + this.newI + "/" + this.newJ);
//Reemplaza valor inicial con "0|0"
algoritmo[newJ][newI] = "0|0";
imprimirArreglo(algoritmo);
}
}
//Posibles valores en array.
// 25/25 25/75 25/125
// 25/75 75/75 125/75
// 25/125 75/125 125/125
public void arregloTablero(MouseEvent evt) {
if (evt.getSource() instanceof JLabel) {
int[] posicion = posicion(evt);
int newX = posicion(evt)[0];
int newY = posicion(evt)[1];
newI = (newX - 25) / 50;
newJ = (newY - 25) / 50;
System.out.println("*finales newI/newJ: " + newI + "/" + newJ);
//Reemplaza con valor de posición.
algoritmo[newJ][newI] = newX + "|" + newY;
count++;
System.out.println("Movimientos: " + count);
imprimirArreglo(algoritmo);
}
}
public void imprimirArreglo(String[][] arreglo) {
System.out.println("/------------/");
for (String[] elemento : arreglo) {
for (int j = 0; j < arreglo.length; j++) {
System.out.print(elemento[j] + " ");
}
System.out.println("");
}
System.out.println("/------------/");
}
public int[] posicion(MouseEvent evt) {
JLabel label = (JLabel) evt.getSource();
Point labelLocation = label.getLocation();
int newX = labelLocation.x + evt.getX();
int newY = labelLocation.y + evt.getY();
newX = Math.min(Math.max(0, ((newX - margen) / espacio)), reinas - 1);
newY = Math.min(Math.max(0, ((newY - margen) / espacio)), reinas - 1);
newX = (newX * espacio) + margen;
newY = (newY * espacio) + margen;
int retorno[] = {newX, newY};
return retorno;
}
}
Это примеры функционирования asГ - как она impresiГіn стоимости в array и Ваш comprobaciГіn:
Проблема estГЎ в ней funciГіn posicion()
. Мне осложнено понимать чувство тебя implementaciГіn, где ты делаешь обработки Strings, когда действительно sГіlo он нужен делать операции matemГЎticas.
, Кроме того использовав их mГ©todos getXOnScreen, () положение, которое ты получаешь, оказывается затронутым ею posiciГіn окна.
Пытается с этой implementaciГіn:
public int[] posicion(MouseEvent evt) {
JLabel label = (JLabel) evt.getSource();
Point labelLocation = label.getLocation();
int x = labelLocation.x + evt.getX();
int y = labelLocation.y + evt.getY();
// Obtener numero de casilla x, y
x = (x - margen) / espacio;
y = (y - margen) / espacio;
// No posicionar fuera del tablero
x = Math.min(Math.max(0, x), reinas - 1);
y = Math.min(Math.max(0, y), reinas - 1);
// Revertir posicion exacta de casilla
x = (x * espacio) + margen;
y = (y * espacio) + margen;
return new int[] { x, y };
}
AГ±ado explicaciГіn
Мотив, из-за которого ты не должен использовать evt.getXOnScreen()
для этого случая,, - потому что эта funciГіn возвращает ее posiciГіn, где кликают относительно экрана. А именно, возврати ее posiciГіn курсора с верхнего левого угла экрана. Следовательно, она posiciГіn JFrame на рабочем столе afectarГЎ в эту стоимость.
С другой стороны, с evt.getX()
posiciГіn получается касающаяся компонента, который получает событие. В этом случае, касающаяся JLabel. Например: Если evt.getX () он возвращает 30, означай, что pulsaciГіn был сделан 30 pГ-xeles с левого края JLabel.
Именно поэтому во мне soluciГіn, я получаю evt.getX()
и погружаю ее posiciГіn JLabel labelLocation.x
. AsГ - sabrГЎs точной формы в quГ© posiciГіn из индикаторного табло была сделана она pulsaciГіn.
я показываю Тебе grГЎficamente дистанцию, которая возвращает каждую функцию, если мы нажимаем курсор в зоне Q2 , например:
Siguendo ты implementaciГіn, ты должен иметь в виду первоначальную маржу, которую ты применяешь к индикаторному табло, чтобы получать ее posiciГіn от нажатой будки.
, Сказанные это, выполнив cГіdigo, посредством этих lГ-neas мы получаем quГ© будку pulsГі:
// Obtener numero de casilla x, y
x = (x - margen) / espacio; // Para el ejemplo x será 1
y = (y - margen) / espacio; // Para el ejemplo y será 0
Следующие 2 линии подтверждают, что эта стоимость не была ниже 0 ни превышающий королев - 1 (если пользователь тащит будку снаружи индикаторного табло)
, И в конце концов мы конвертируем ее posiciГіn без дистанции, чтобы помещать JLabel в индикаторном табло.
// Revertir posicion exacta de casilla
x = (x * espacio) + margen; // Para el ejemplo x será 75 (1 espacio + margen)
y = (y * espacio) + margen; // y será 25 (margen)
Как habrГЎs подтвержденный, меняя в тебе cГіdigo ее implementaciГіn posicion()
на ту, которую я предложил тебе, оно функционирует, не будучи должен реализовывать больше настроек. Я надеюсь помочь тебе.
getX
и getY
без labelLocation
двигаются немного редко королевы а следовательно я закончил тем, что использовал getXOnScreen
– ASASCED
05.11.2019, 23:27