0. 소개
지난번 글에서는 오셀로 UI 혹은 체스판 UI를 만들었다. 혹시나 설명이 필요하다면 링크를 참조하길 바란다.
2022.04.25 - [JAVA] - [Java] 오셀로, 체스 게임 UI 만들기
지난번 글에서는 UI를 만들었으니 이제 UI를 이용해서 기능을 추가해 보겠다.
1. 기능
버튼 - Game ReStart, Game End, Game GiveUp, Skip turn 총 4가지가 있다.
Game ReStart = 게임 재시작, Game End = 눌린 기점으로 돌이 많은 쪽이 승리
Game GiveUp = 게임 기권. Skip turn = 더는 둘 곳이 없을 때 턴을 넘김
돌 설정 - 돌은 그림판에 그려서 이미지 파일로 만들어서 사용했다. 아래 코드를 그냥 쓰면 이미지가 안 나올 것이므로 자기 경로 파일에 있는 이미지를 사용하기를 바란다. 이미지는 JPanelSquare[ ][ ]에 setIcon(ImageIcon icon)을 이용해 추가하였다.
메소드 - 여기서 메소드 처리는 mouseClicked(MouseEvent e)에서 처리된다. 클릭된 부분의 getX( )와 getY( ) 메소드를 x, y 좌표를 가져오고, findComponent메소드로 JPanelSquare[ ][ ]의 열과 행을 가져와 데이터 처리를 할 수 있게 한다.
클릭된 부분을 기준으로 checkRight, checkLeft, checkUp, checkDown, checkUpRight, checkDownLeft, 등 8가지 방향으로 대각과 십자 방향을 확인해서 사용자가 둘 수 있는 곳인지 확인한다. 각 메소드는 true, false을 반환하고 둘 수 있는 곳이면 true을 false면 둘 수 없는 곳을 말한다. 8개의 방향이 다 false를 반환한다면 그곳은 둘 수 없으므로 illegal Point 메시지를 보인다. 이게 핵심 메소드고 나머지 부분은 직관적으로 이해할 수 있다. (궁금하다면 댓글로 물어봐주세요.)
2. 어려웠던 점
첫 번째로 생각했던 방법은 한 개의 메소드로 8방향을 한 번에 체크해서 돌을 뒤집으려 했으나, 변수 조작이 어려워서 각 방향을 확인해주는 메소드를 8개를 선언하였다.
두 번째에는 8개의 메소드를 사용자가 클릭한 점을 기준으로 끝에서부터 백트레킹 방식으로 같은 색의 돌이 있으면 그 사이는 다 뒤집는 방법을 생각했으나, 중간에 빈칸이 있을 경우 빈칸도 뒤집는 오류가 있었다. 백트레킹을 방식을 고집했던 이유는 돌아오면서 체크하면 for문을 더 안 돌아도 된다는 장점에 했으나, 빈칸을 체크할 수 없어 포기했다.
이 부분이 코드에 중간중간 메소드에 주석으로 되어 있는 부분이다.
세 번째로 성공했던 방법은 뒤집기 전에, 뒤집을 수 있는 상황이 아니면 바로 return 시킨다. 이 부분이 if(row<2) return; 이런 부분이다. 뒤집을 수 있는 조건에 들어오면 두 칸 뒤 돌부터 같은 색깔이면 바로 그 사이를 뒤집고, 다른 색이면 일단 boundary(7)까지 진행시킨다. 뒤집을 수 있는 상황이 오면 for문을 중간에 돌고 return으로 빠져나온다.
3. 아쉬운 점
- 방향 체크하는 부분에서 코드를 재활용하지 않아 쓸데없이 코드가 길어졌다.
- if문이 너무 많다. 조건을 효율적으로 체크할 수 있는 부분의 이론 공부가 필요하다.
- 사용자가 모든 곳에 대해 둘 수 없는 상황이면, 자동으로 턴이 넘어가야 하는데, 지금 코딩에서는 추가하면 너무 비효율적이라, 사용자 부담으로 클릭하여 수동으로 넘어가게 한 부분이 아쉽다.
4. 코드
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
public class Othello extends JPanel implements MouseListener, ActionListener {
JLayeredPane layeredPane;
JPanel board;
JPanel controlPanel;
JToolBar tool;
JPanel gui;
JButton restartButton;
JButton endButton;
JButton giveUpButton;
JButton skipTurnButton;
JLabel imgLabel;
BufferedImage black;
ImageIcon blackIcon;
BufferedImage blue;
ImageIcon blueIcon;
JPanelSquare[][] squarePanel = new JPanelSquare[8][8];
String turn = "black";
JLabel blueLabel;
JLabel blackLabel;
JLabel blueScore;
JLabel blackScore;
JLabel turnLabel;
int bluecount = 0;
int blackcount = 0;
boolean flag = true;
public Othello() throws IOException {
blue = ImageIO.read(new File("C:\\Users\\siloa\\eclipse-workspace\\imageProcessing\\src\\game\\blue2.png"));
blueIcon = new ImageIcon(blue);
black = ImageIO.read(new File("C:\\Users\\siloa\\eclipse-workspace\\imageProcessing\\src\\game\\black2.png"));
blackIcon = new ImageIcon(black);
Dimension guiSize = new Dimension(600,600);
Dimension size = new Dimension(600,600);
gui = new JPanel(new BorderLayout());
gui.setSize(guiSize);
//Toolbar 달기
tool = new JToolBar();
restartButton = new JButton("Game ReStart");
endButton = new JButton("Game End");
giveUpButton = new JButton("Game GiveUp");
skipTurnButton = new JButton("Skip turn");
blueLabel = new JLabel("BLUE : ");
blueScore = new JLabel("2");
blackLabel = new JLabel("Black : ");
blackScore = new JLabel("2");
turnLabel = new JLabel("Black Turn");
turnLabel.setFont(new Font("Bold",Font.BOLD,20));
tool.add(restartButton);
tool.addSeparator();
tool.add(endButton);
tool.addSeparator();
tool.add(giveUpButton);
tool.addSeparator();
tool.add(skipTurnButton);
tool.addSeparator();
tool.add(blackLabel);
tool.add(blackScore);
tool.addSeparator();
tool.add(blueLabel);
tool.add(blueScore);
tool.addSeparator();
tool.add(turnLabel);
gui.add(tool, BorderLayout.NORTH);
//JFrame에 LayeredPane 넣기
layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(size);
gui.add(layeredPane);
//LayeredPane에 board 넣기
board = new JPanel();
board.setLayout(new GridLayout(8,8));
board.setPreferredSize(size);
board.setBounds(0, 0, size.width, size.height);
layeredPane.add(board,JLayeredPane.DEFAULT_LAYER);
//setBoard();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
squarePanel[i][j] = new JPanelSquare(i, j, "Empty");
squarePanel[i][j].setLayout(new BorderLayout());
// JPanel square = new JPanel(new BorderLayout());
squarePanel[i][j].setBackground((i + j) % 2 == 0 ? Color.lightGray : Color.white);
ImageIcon icon = new ImageIcon(new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));
imgLabel = new JLabel(icon, SwingConstants.CENTER);
squarePanel[i][j].add(imgLabel);
board.add(squarePanel[i][j]);
}
} // for
// 판 초반 세팅
squarePanel[3][3].getPiece().setIcon(blueIcon);
squarePanel[4][3].getPiece().setIcon(blackIcon);
squarePanel[3][4].getPiece().setIcon(blackIcon);
squarePanel[4][4].getPiece().setIcon(blueIcon);
squarePanel[3][3].setState("blue"); squarePanel[4][3].setState("black");
squarePanel[3][4].setState("black"); squarePanel[4][4].setState("blue");
board.addMouseListener(this);
skipTurnButton.addActionListener(this);
giveUpButton.addActionListener(this);
endButton.addActionListener(this);
restartButton.addActionListener(this);
}
public Dimension setPreferredSize() {
return new Dimension(700,600);
}
private static void createAndShowGUI() throws IOException {
// Create and set up the window.
JFrame frame = new JFrame();
Othello othello = new Othello();
frame.add(othello.gui);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("오델로 게임");
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//imageprocess.setOpaque(true);
//frame.setContentPane(imageprocess);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
createAndShowGUI();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
Component c = board.findComponentAt(e.getX(), e.getY());
//System.out.println(c.getParent());
JPanelSquare square = (JPanelSquare)c.getParent();
int row= square.getRow();
int column = square.getColumn();
Boolean checkL = checkLeft(row, column, turn);
Boolean checkR = checkRight(row, column, turn);
Boolean checkU = checkUp(row, column, turn);
Boolean checkD = checkDown(row, column, turn);
Boolean checkUL = checkUpLeft(row, column, turn);
Boolean checkUR = checkUpRight(row, column, turn);
Boolean checkDL = checkDownLeft(row, column, turn);
Boolean checkDR = checkDownRight(row, column, turn);
//둔 곳이 뒤집을 수 없을경우 Error
if(!checkR & !checkL & !checkU & !checkD & !checkUR & !checkUL & !checkDL & !checkDR ) {
JOptionPane.showMessageDialog(null, "Illegal Point", "Not Allowd Move", 1);
// 뒤집을 수 있는 경우
}else {
if (turn.equals("black")) { //바둑돌 일단 두기
square.getPiece().setIcon(blackIcon);
square.setState("black");
turn = "blue";
turnLabel.setText("Blue Turn");
} else {
square.getPiece().setIcon(blueIcon);
square.setState("blue");
turn = "black";
turnLabel.setText("Black turn");
}
}
//점수 카운트
bluecount = 0;
blackcount = 0;
//점수 카운트
for(int i=0;i<=7;i++) {
for(int j=0;j<=7;j++) {
if(squarePanel[i][j].getState() =="blue") {
bluecount++;
}
else if(squarePanel[i][j].getState() =="black") {
blackcount++;
}
}
}//for
blueScore.setText(Integer.toString(bluecount));
blackScore.setText(Integer.toString(blackcount));
System.out.println("row : " + row + " column : " + column);
} //mouseClicked Event
public boolean checkRight(int row, int column, String turn) {
if(column>5) { //뒤집을게 없는 경우
return false;
}
int j = column;
//바로 오른돌이 같은 색이거나 비어있으면 종료
if(squarePanel[row][j+1].getState() == turn || squarePanel[row][j+1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int jj=column+2; jj<=7; jj++) {
String state = squarePanel[row][jj].getState();
if(state == "Empty") { //1.오른칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = jj- column - 1;
//돌 사이 뒤집기
for(int z = column+1;z <= column+between; z++) {
if(turn == "black") {
squarePanel[row][z].getPiece().setIcon(blackIcon);
squarePanel[row][z].setState(turn);
}else {
squarePanel[row][z].getPiece().setIcon(blueIcon);
squarePanel[row][z].setState(turn);
}
}
return true;
}
}
return false;
}
public boolean checkLeft(int row, int column, String turn) {
if(column<2) { //뒤집을게 없는 경우
return false;
}
int j = column;
//바로 왼쪽돌이 같은 색이거나 비어있으면 종료
if(squarePanel[row][j-1].getState() == turn || squarePanel[row][j-1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int jj=column-2; jj>=0; jj--) {
String state = squarePanel[row][jj].getState();
if(state == "Empty") { //1.왼쪽칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = column - jj - 1;
//돌 사이 뒤집기
for(int z = column-1;z >= column-between; z--) {
if(turn == "black") {
squarePanel[row][z].getPiece().setIcon(blackIcon);
squarePanel[row][z].setState(turn);
}else {
squarePanel[row][z].getPiece().setIcon(blueIcon);
squarePanel[row][z].setState(turn);
}
}
return true;
}
}
return false;
}
public boolean checkUp(int row, int column, String turn) {
if(row<2) { //뒤집을게 없는 경우
return false;
}
int i = row;
//바로 위돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i-1][column].getState() == turn || squarePanel[i-1][column].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row-2; ii>=0; ii--) {
String state = squarePanel[ii][column].getState();
if(state == "Empty") { //1.위칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = row - ii - 1;
//돌 사이 뒤집기
for(int z = row-1;z >= row-between; z--) {
if(turn == "black") {
squarePanel[z][column].getPiece().setIcon(blackIcon);
squarePanel[z][column].setState(turn);
}else {
squarePanel[z][column].getPiece().setIcon(blueIcon);
squarePanel[z][column].setState(turn);
}
}
return true;
}
}
return false;
/*
* for (int i = 7; i > row; i--) { // 위으로 가는거
*
* String state = squarePanel[i][column].getState(); if (state.equals("black")
* && turn.equals("black")) { for (int j = i - 1; j > row; j--) {
* squarePanel[j][column].getPiece().setIcon(blackIcon);
* squarePanel[j][column].setState("black");
*
* } break; } else if (state.equals("blue") && turn.equals("blue")) { for (int j
* = i - 1; j > row; j--) { squarePanel[j][column].getPiece().setIcon(blueIcon);
* squarePanel[j][column].setState("blue");
*
*
* } } }
*/
}
public boolean checkDown(int row, int column, String turn) {
if(row>5) { //뒤집을게 없는 경우
return false;
}
int i = row;
//바로 아래돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i+1][column].getState() == turn || squarePanel[i+1][column].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row+2; ii<=7; ii++) {
String state = squarePanel[ii][column].getState();
if(state == "Empty") { //1.아래칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = ii - row - 1;
//돌 사이 뒤집기
for(int z = row+1;z <= row+between; z++) {
if(turn == "black") {
squarePanel[z][column].getPiece().setIcon(blackIcon);
squarePanel[z][column].setState(turn);
}else {
squarePanel[z][column].getPiece().setIcon(blueIcon);
squarePanel[z][column].setState(turn);
}
}
return true;
}
}
return false;
}
public boolean checkUpLeft(int row, int column, String turn) {
if(row<2 | column<2) { //뒤집을게 없는 경우
return false;
}
int i = row;
int j = column;
//바로 왼쪽대각돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i-1][j-1].getState() == turn || squarePanel[i-1][j-1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row-2, jj = column-2; ii>=0 && jj>=0; ii--,jj--) {
String state = squarePanel[ii][jj].getState();
if(state == "Empty") { //1.왼쪽대각칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = row - ii - 1;
//돌 사이 뒤집기
for(int z = row-1, zz = column -1;z >= row-between; z--, zz--) {
if(turn == "black") {
squarePanel[z][zz].getPiece().setIcon(blackIcon);
squarePanel[z][zz].setState(turn);
}else {
squarePanel[z][zz].getPiece().setIcon(blueIcon);
squarePanel[z][zz].setState(turn);
}
}
return true;
}
}
return false;
/*
* int i = 0; int j = 0;
*
* int gap = Math.min(row, column);
*
* i = row - gap; j = column - gap;
*
* for (; i < row; i++, j++) { // 오른쪽 대각으로 뒤집기
*
* String state = squarePanel[i][j].getState();
*
* if (state.equals("black") && turn.equals("black")) { for (i += 1, j += 1; i <
* row; i++, j++) { squarePanel[i][j].getPiece().setIcon(blackIcon);
* squarePanel[i][j].setState("black");
*
* } break; } else if (state.equals("blue") && turn.equals("blue")) { for (i +=
* 1, j += 1; i < row; i++, j++) {
* squarePanel[i][j].getPiece().setIcon(blueIcon);
* squarePanel[i][j].setState("blue");
*
* } } }
*/
}
public boolean checkUpRight(int row, int column, String turn) { //왼쪽 대각으로 뒤집기
if(row<2 | column>5) { //뒤집을게 없는 경우
return false;
}
int i = row;
int j = column;
//바로 오른쪽위대각돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i-1][j+1].getState() == turn || squarePanel[i-1][j+1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row-2, jj = column+2; ii>=0 && jj<=7; ii--,jj++) {
String state = squarePanel[ii][jj].getState();
if(state == "Empty") { //1.왼쪽칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = row - ii - 1;
//돌 사이 뒤집기
for(int z = row-1, zz = column +1;z >= row-between; z--, zz++) {
if(turn == "black") {
squarePanel[z][zz].getPiece().setIcon(blackIcon);
squarePanel[z][zz].setState(turn);
}else {
squarePanel[z][zz].getPiece().setIcon(blueIcon);
squarePanel[z][zz].setState(turn);
}
}
return true;
}
}
return false;
/*
* int i=0; int j=0;
*
* int gap = Math.min(row, 7-column);
*
* i = row - gap; j = column + gap;
*
* for (; i < row; i++, j--) { // 위으로 가는거
*
* String state = squarePanel[i][j].getState();
*
* if (state.equals("black") && turn.equals("black")) { for (i += 1, j -= 1; i <
* row; i++, j--) { squarePanel[i][j].getPiece().setIcon(blackIcon);
* squarePanel[i][j].setState("black");
*
* } break; } else if (state.equals("blue") && turn.equals("blue")) { for (i +=
* 1, j -= 1; i < row; i++, j--) {
* squarePanel[i][j].getPiece().setIcon(blueIcon);
* squarePanel[i][j].setState("blue");
*
* } } }
*/
}
public boolean checkDownRight(int row, int column, String turn) { //이상해서 바꿈 4-25 10:20
if(row>5 | column>5) { //뒤집을게 없는 경우
return false;
}
int i = row; //왼쪽으로 가니 row 고정
int j = column;
//바로 아래오른쪽돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i+1][j+1].getState() == turn || squarePanel[i+1][j+1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row+2, jj = column+2; ii<=7 && jj<=7; ii++,jj++) {
String state = squarePanel[ii][jj].getState();
if(state == "Empty") { //1.왼쪽칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = ii - row - 1;
//돌 사이 뒤집기
for(int z = row+1, zz = column+1; z <= row+between; z++, zz++) {
if(turn == "black") {
squarePanel[z][zz].getPiece().setIcon(blackIcon);
squarePanel[z][zz].setState(turn);
}else {
squarePanel[z][zz].getPiece().setIcon(blueIcon);
squarePanel[z][zz].setState(turn);
}
}
return true;
}
}
return false;
/*
* int i = 0; int j = 0;
*
* int gap = Math.min(7-row, 7-column);
*
* i = row + gap; j = column + gap;
*
*
* for (; i > row; i--, j--) { String state = squarePanel[i][j].getState();
*
* if (state.equals("black") && turn.equals("black")) { for (i -= 1, j -= 1; i >
* row; i--, j--) { squarePanel[i][j].getPiece().setIcon(blackIcon);
* squarePanel[i][j].setState("black");
*
* } break; } else if (state.equals("blue") && turn.equals("blue")) { for (i -=
* 1, j -= 1; i > row; i--, j--) {
* squarePanel[i][j].getPiece().setIcon(blueIcon);
* squarePanel[i][j].setState("blue");
*
* } } }
*/
}
public boolean checkDownLeft(int row, int column, String turn) {
if(row>5 | column<2) { //뒤집을게 없는 경우
return false;
}
int i = row; //왼쪽으로 가니 row 고정
int j = column;
//바로 아래왼쪽돌이 같은 색이거나 비어있으면 종료
if(squarePanel[i+1][j-1].getState() == turn || squarePanel[i+1][j-1].getState() == "Empty" ) { //바로 전돌 확인
return false;
}
//뒤집을 수 있는 상태
for(int ii=row+2, jj = column-2; ii<=7 && jj>=0; ii++,jj--) {
String state = squarePanel[ii][jj].getState();
if(state == "Empty") { //1.왼쪽칸이 비어있는 경우
return false;
}
if(state != turn) {//2. 서로 색깔다름
continue;
}
if(state == turn) { //3. 같은 색깔이므로 뒤집은 후 종료.
int between = ii - row - 1;
//돌 사이 뒤집기
for(int z = row+1, zz = column -1;z <= row+between; z++, zz--) {
if(turn == "black") {
squarePanel[z][zz].getPiece().setIcon(blackIcon);
squarePanel[z][zz].setState(turn);
}else {
squarePanel[z][zz].getPiece().setIcon(blueIcon);
squarePanel[z][zz].setState(turn);
}
}
return true;
}
}
return false;
/*
* int i = 0; int j = 0;
*
* int gap = Math.min(7-row, column);
*
* i = row + gap; j = column - gap;
*
* for (; i > row; i--, j++) { // 위으로 가는거
*
* String state = squarePanel[i][j].getState();
*
* if (state.equals("black") && turn.equals("black")) { for (i -= 1, j += 1; i >
* row; i--, j++) { squarePanel[i][j].getPiece().setIcon(blackIcon);
* squarePanel[i][j].setState("black");
*
* } break; } else if (state.equals("blue") && turn.equals("blue")) { for (i -=
* 1, j += 1; i > row; i--, j++) {
* squarePanel[i][j].getPiece().setIcon(blueIcon);
* squarePanel[i][j].setState("blue");
*
* } } }
*/
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String buttonCase = e.getActionCommand();
switch(buttonCase){
case "Skip turn":
int result = JOptionPane.showConfirmDialog(null, "턴을 넘기시겠습니까?", "Confirm message",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (result == JOptionPane.YES_OPTION) { //턴을 넘김
if (turn == "black") {
turn = "blue";
turnLabel.setText("Blue Turn");
} else if (turn == "blue") {
turn = "black";
turnLabel.setText("Black Turn");
}
}//턴을 넘김 if
break; //Skip turn
case "Game GiveUp":
int giveUpResult = JOptionPane.showConfirmDialog(null, "기권 하시겠습니까?", "Confirm message",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (giveUpResult == JOptionPane.YES_OPTION) {
if (turn == "black") {
JOptionPane.showMessageDialog(null, "Blue 승리", "Give Up", 1);
} else
JOptionPane.showMessageDialog(null, "Black 승리", "Give Up", 1);
}
break; //Game GiveUp
case "Game End":
String bluescores = blueScore.getText();
int blueScores =Integer.parseInt(bluescores);
String blackscores = blackScore.getText();
int blackScores = Integer.parseInt(blackscores);
if(blueScores > blackScores) {
JOptionPane.showMessageDialog(null, "Blue 승리", "Win", 1);
}else if(blackScores > blueScores) {
JOptionPane.showMessageDialog(null, "Black 승리", "Win", 1);
}else
JOptionPane.showMessageDialog(null, "무승부", "Draw", 1);
break; //Game End
case "Game ReStart":
resetBoard();
break;
}//switch
}//actionPerformed
public void resetBoard() {
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
//JPanel square = new JPanel(new BorderLayout());
ImageIcon icon = new ImageIcon(new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));
squarePanel[i][j].setState("Empty");
squarePanel[i][j].getPiece().setIcon(icon);
board.add(squarePanel[i][j]);
}
}//for
//판 초반 세팅
squarePanel[3][3].getPiece().setIcon(blueIcon);
squarePanel[4][3].getPiece().setIcon(blackIcon);
squarePanel[3][4].getPiece().setIcon(blackIcon);
squarePanel[4][4].getPiece().setIcon(blueIcon);
squarePanel[3][3].setState("blue");
squarePanel[4][3].setState("black");
squarePanel[3][4].setState("black");
squarePanel[4][4].setState("blue");
//판을 리셋하므로 값도 초기 상태로 초기화
turn = "black";
turnLabel.setText("Black Turn");
blackScore.setText("2");
blueScore.setText("2");
}
} //Othello Class
class JPanelSquare extends JPanel{
int column;
int row;
String state;
JLabel piece = null;
public JPanelSquare(int row, int column, String state) {
this.column = column;
this.row = row;
this.state = state;
}
public int getColumn() {
return column;
}
public int getRow() {
return row;
}
@Override
public Component add(Component c) {
piece = (JLabel) c;
return super.add(c);
}
@Override
public void remove(Component comp) {
piece = null;
super.remove(comp);
}
public JLabel getPiece() {
return piece;
}
public void setPiece() {
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
} //JPanelSquare Class
5. 실행화면
'JAVA' 카테고리의 다른 글
[Java] DB 회원가입, 로그인 시스템 만들기 (1) | 2022.05.02 |
---|---|
[Java] Mysql Jdbc 연결 오류 해결 방법 (1) | 2022.04.27 |
[Java] 오셀로, 체스 게임 UI 만들기 (0) | 2022.04.25 |
[Java] 색상에서 value & 0xff 의미 쉽게 이해하기 (0) | 2022.04.21 |
[JAVA] CardLayout 패널 화면 쉽게 바꾸기 (0) | 2022.04.20 |