자바로 만든 체스(5일차)

Updated:

5일차 진행상황

게임플레이화면 UI 구현

로컬1

로컬플레이시에 우측 빈공간에 UI를 구성하였다.
프로젝트가 진행될수록 이상하게 포토샵 기술이 느는 것 같다…….

양 플레이어가 각각 잃은 기물을 보여줄 수 있도록 투명도를 이용한 16칸식의 공간을 만들었고,
기물이 잡힐 때 마다 이곳에 배치시킬 예정이다. (아직 미구현)

다시시작

EXIT버튼을 누를 시 메인버튼으로 돌아간다.

            @Override
            public void mousePressed(MouseEvent e) {
                localButton.setVisible(true);
                exitButton.setVisible(true);
                multiButton.setVisible(true);
                background = new ImageIcon(Main.class.getResource("./img/mainbackground.png")).getImage();
                boardLabel.setVisible(false);
                for (int i = 0 ; i < 16 ; i ++)
                {
                    p1bt[i].setVisible(false);
                    p2bt[i].setVisible(false);
                }
                returnButton.setVisible(false);
                lostPiece.setVisible(false);
                black_lost.setVisible(false);
                white_lost.setVisible(false);
            }

게임 중에 보이도록 했던 버튼들을 모두 감추고,
메인화면에 필요한 버튼들을 다시 보이도록 한다.

다시 로컬플레이에 진입하면 모든 객체를 새로 배치하기 때문에
초기 상태부터 플레이가 가능하다.

체크기능 구현

체크

    public void checkKing() {
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                check.setVisible(false);
            }
        };
        if (turnPlayer == 1) {
            for (int i = 0; i < 16; i++) {
                if(movable(player1.getPieces()[i], player1.getPieces()[i].getPos_x(), player1.getPieces()[i].getPos_y(), player2.getPieces()[0].getPos_x(), player2.getPieces()[0].getPos_y())) {
                    check.setVisible(true);
                    timer.schedule(timerTask, 1000);
                    break;
                }
            }
        } else {
            for (int i = 0; i < 16; i++) {
                if(movable(player2.getPieces()[i], player2.getPieces()[i].getPos_x(), player2.getPieces()[i].getPos_y(), player1.getPieces()[0].getPos_x(), player1.getPieces()[0].getPos_y())) {
                    check.setVisible(true);
                    timer.schedule(timerTask, 1000);
                    break;
                }
            }
        }
    }

피스가 이동함에 따라 다음 차례에 상대의 킹을 잡을 수 있는 상태라면,
체크를 화면에 1초 표시하도록 했다.

피스의 이동이 이루어졌을 때, 자신의 모든 피스의 위치와 상대 킹의 위치를 movable로 보내어
이동이 가능하다면 체크라벨이 보여지도록 했다.

모든 피스에 대해 검사가 이루어지기 때문에, 나의 피스 이동에 따라 드러는 다른 피스로 인한
체크 또한 잡아낼 수 있다.

1초 뒤에 다시 사라지도록 하기위해 처음에는 Thread.sleep을 사용했는데, 화면이 완전 정적이 되어
어색하거니와 정상적인 동작도 하지 않아 TimerTimerTask를 사용했다.

구현해야 할 목록

  • 잃은 기물 화면 우측에 나열
  • 특수 룰(프로모션, 앙파상, 캐슬링)
  • 킹이 잡힘에 따른 패배처리(화면만 구현하면 됨)
  • 음악, 효과음 등
  • (추가) 승패를 로그로 기록, 지난 경기기록 확인하기
  • 멀티플레이 기능(중요)

Leave a comment