Computer Science/Spring & Java

[Java] Swing을 이용한 오목게임만들기

콩순이냉장고 2024. 11. 6. 00:15

swing을 공부하시는분이라면

한번 직접만들어 보시길 권해드립니다.

 

 

저거 복붙하면 보이지 않습니다. 

이미지도 필요한데

프로젝트 알집으로 파일 올렸으니 다운로드 해서 실행하시면 됩니다.

 

바둑판 이미지 출처 :https://ko.wikipedia.org/wiki/%EB%B0%94%EB%91%91%ED%8C%90

오목돌 이미지 출처 : https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Go_w_no_bg.svg

 

오목 프로젝트 파일: https://drive.google.com/file/d/1HfW8pEt3xl_sPSTTYvsn2jj7rtABg0dk/view?usp=sharing

오목 판정알고리즘 문제 백준 : https://www.acmicpc.net/problem/2072

 

 

 

 

소스코드 : 

package org.example;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Omok extends JFrame{
    JPanel panel;
    JLabel[][] jLabels;
    public static int dy[]= new int[]{-1,-1,0,1};
    public static int dx[]= new int[] {0,1,1,1};

    public static int rdy[] = new int[] {1,1,0,-1};
    public static int rdx[] =new int[] {0,-1,-1,-1};
    public static final int line=45;
    public static final int gosize = 30;
    int cnt = 0;
    public static int board[][]= new int[25][25];
    boolean flag= false;
    Omok(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel() {
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Image img = new ImageIcon("img/board.png").getImage();
                g.drawImage(img, 0, 0, 863, 863, this);  // 이미지 크기 맞추기
            }
        };
        jLabels = new JLabel[19][19];
        panel.setPreferredSize(new Dimension(863, 863));
        panel.setLayout(null);
        for(int i =0;i<19;i++){
            for(int j =0;j<19;j++){
                jLabels[i][j]=new JLabel();

                jLabels[i][j].setSize(gosize,gosize);
                jLabels[i][j].setLocation(13+j*45,15+i*45);

                /*
                jButton[i][j].setBorderPainted(false);//테두리 제거
                jButton[i][j].setFocusPainted(false);
                jButton[i][j].setContentAreaFilled(false);//button 배경제거
                jButton[i][j].setOpaque(true);
                jButton[i][j].setBackground(new Color(0,0,0,0));
                */

                panel.add(jLabels[i][j]);
            }
        }

        setContentPane(panel);
        pack();//프레임크기를 이미지 맞춰서 자동조정
        panel.addMouseListener(new MyMouseAdapter());
        setLocationRelativeTo(null);//화면 중앙배치
        setVisible(true);
    }
    class MyMouseAdapter extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            if(flag)return;

            int x = e.getX()-13;
            int y = e.getY()-15;
            System.out.println("찍은 좌표 "+x+","+y);
            int x2 = x/line;
            int y2 = y/line;
            if(board[y2+1][x2+1]>0){
                return;
            }
            System.out.println(y2+" "+x2+"에 찍으셨습니다.");
            ImageIcon img = new ImageIcon("img/white.png");
            if(cnt%2==0) {
                img = new ImageIcon("img/black.png");
            }
            else{
                img = new ImageIcon("img/white.png");
            }
            Image scaledImg = img.getImage().getScaledInstance(gosize,gosize,Image.SCALE_SMOOTH);
            jLabels[y2][x2].setIcon(new ImageIcon(scaledImg));
            board[y2+1][x2+1]=cnt%2+1;
            flag=finish();
            if(flag){
                if(cnt%2==0){
                    System.out.println("흑돌승리");
                    JOptionPane.showMessageDialog(null,"흑돌승리");
                }
                else{
                    System.out.println("백돌승리");
                    JOptionPane.showMessageDialog(null,"백돌승리");
                }
            }
            cnt++;
        }
    }
    public static boolean isrange(int y,int x) {
        return 0<=y && y<=20&& 0<=x && x<=20;
    }

    public static boolean check(int y,int x) {
        for(int i =0;i<4;i++) {
            int ny=y+dy[i];
            int nx = x+dx[i];
            int cnt=1;//돌이 한개부터시작
            int rny = y+rdy[i];
            int rnx = x+rdx[i];
            if(isrange(rny,rnx)&& board[y][x]!=board[rny][rnx]) {
                while(isrange(ny,nx)&&board[y][x]==board[ny][nx]) {
                    cnt++;
                    ny+=dy[i];
                    nx+=dx[i];
                }
            }
            if(cnt==5)return true;
        }
        return false;
    }
    public static boolean finish() {
        for(int i =1;i<=19;i++) {
            for(int j =1;j<=19;j++) {
                if(board[i][j]>0 && check(i,j))
                    return true;

            }
        }

        return false;
    }
    public static void main(String[] args) {
        new Omok();
    }
}

 

3-3 알고리즘 4-4 알고리즘 6목이상 알고리즘등 적용하지 않았습니다. 

적용하고싶으면 한번 적용해서 만들어 보시길 추천드립니다.