2013-06-16 3 views
1

체스와 같지만 나이트와 만 관련된 ratsuk이라는 게임을 만들려고합니다. 나이트 캔트 이동은 이전에 이동 했으므로 이동 손실은 없습니다.버튼을 한 번만 만드는 방법;

문제는 버튼 중 하나를 누르면 새 기사가 나타나기 전에 기사가 나타납니다. 그리고 새로운 1이 나타나서는 안되는 이유가 확실하지 않습니다.

버튼이 한 번만 작동해야하기 때문일 수 있습니다.

그럼 한 번만 작업하려면 버튼을 어떻게 만듭니 까?

여기 루이 코드

버튼의 accions가 acciones 방법에
package ratsuk; 

import java.util.Random; 
import javax.swing.JFrame; 

/** 
* import javax.swing.JFrame; import javax.swing.SwingUtilities; import 
* javax.swing.UIManager; 
*/ 
public class Ratsuk extends JFrame { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     Random rad; 
     rad = new Random(); 
     int row = rad.nextInt(8); 
     int column = rad.nextInt(8); 



     Tablero newtablero = new Tablero(); 

     newtablero.caballo(row, column); 



    } 
} 

이다. 나는 아직 모든 가능한 움직임을 프로그램 할 수 없다.

package ratsuk; 

import javax.swing.JFrame; 
import javax.swing.JButton; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JPanel; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 

/** 
* 
* @author Melvin 
*/ 
public class Tablero { 

    private static final int HEIGHT = 8; 
    private static final int WIDTH = 8; 
    private JButton[][] mesa; 
    private Icon image; 
    private JPanel panel; 

    public Tablero() { 
     mesa = new JButton[HEIGHT][WIDTH]; 
     panel = new JPanel(new GridLayout(HEIGHT, WIDTH)); 
     image = new ImageIcon(getClass().getResource("redKnight.gif")); 

     crearventana(); 

     crearmesa(); 

     pintarmesa(); 
    } 

    private void crearventana() { 
     JFrame ventana = new JFrame("Juego de Ratsuk"); 
     ventana.setVisible(true); 
     ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     ventana.setContentPane(panel); 
     ventana.setSize(500, 500); 
     ventana.setVisible(true); 
    } 

    private void crearmesa() { 

     for (int row = 0; row < HEIGHT; row++) { 
      for (int column = 0; column < WIDTH; column++) { 
       JButton button = new JButton(); 
       button.setPreferredSize(new Dimension(40, 40)); 

       mesa[row][column] = button; 
       panel.add(button); 
      } 
     } 
    } 

    private void pintarmesa() { 
     Color fondo; 
     for (int r = 0; r < HEIGHT; r++) { 
      for (int t = 0; t < WIDTH; t++) { 
       fondo = getBackgroundColor(r, t); 

       mesa[r][t].setBackground(fondo); 
      } 
     } 
    } 

    private Color getBackgroundColor(int r, int t) { 
     Color fondo; 
     if (r % 2 == 0 || r == 0) { 
      if (t % 2 == 0 || t == 0) { 
       fondo = Color.BLACK; 
      } else { 
       fondo = Color.WHITE; 
      } 
     } else { 
      if (t % 2 == 0 || t == 0) { 
       fondo = Color.WHITE; 
      } else { 
       fondo = Color.BLACK; 
      } 
     } 
     return fondo; 
    } 

    public void caballo(final int row, final int column) { 

     final JButton current = mesa[row][column]; 

     current.setIcon(image); 
     panel.repaint(); 

     acciones(row, column, current); 
    } 

    private void acciones(final int row, final int column, final JButton current) { 

    final int nextRow = row + 2; 
     final int nextColumn = column - 1; 
     if (tienebotton(nextRow, nextColumn)==true){ 
      JButton next = mesa[nextRow][nextColumn]; 

      next.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent d) { 
        current.setIcon(null); 

        caballo(nextRow, nextColumn); 
       } 
      }); 
     } 
     final int nextColumn1 = column+ 1; 
     if (tienebotton(nextRow, nextColumn1)==true){ 
      JButton next = mesa[nextRow][nextColumn1]; 

      next.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent d) { 
        current.setIcon(null); 

        caballo(nextRow, nextColumn1); 
       } 
      }); 
     } 
     final int nextRow1 = row- 2; 
     if (tienebotton(nextRow1, nextColumn)==true){ 
      JButton next = mesa[nextRow1][nextColumn]; 

      next.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent d) { 
        current.setIcon(null); 

        caballo(nextRow1, nextColumn); 
       } 
      }); 
     } 

    } 

    private boolean tienebotton(int row, int column) { 
     if (row >= 0 && row < HEIGHT && column >= 0 && column < WIDTH) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

일부 1 개가 내 프로젝트에 대한 포인터를 일반적으로 제공 할 수 있으면 좋겠다.

+0

자, setEnable 코드를 구현하십시오. 그러나 새로운 기사단은 여전히 ​​두 곳 이상의 기사로 끝내지 않아야하는 장소에 나타납니다. 그것을 많이 실행하고 패턴을보고 시작합니다. 기사가 (행, 열)에있는 경우 새 기사는 항상 (행 + 4, 열 +2)에 표시되지만 여기에 제한되지 않습니다. 나는 틀린 것을 발견 할 수 없다 : /. – user2488345

+1

원래 질문에 대한 답변이 왔으며 지금 묻고있는 것은 새로운 질문입니다. 새 스레드에서이 질문을해야합니다. –

답변

5

일단 버튼을 누르면 setEnabled(false)으로 전화하십시오. 그게 전부 야.

public void actionPerformed(ActionEvent evt) { 

    // .. whatever code is needed for the button 

    // and then disable the button pressed 
    ((AbstractButton)evt.getSource).setEnabled(false); 
} 
관련 문제