본문 바로가기
Computer Science/Spring & Java

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

by 콩순이냉장고 2024. 11. 6.

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목이상 알고리즘등 적용하지 않았습니다. 

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

'Computer Science > Spring & Java' 카테고리의 다른 글

[JPA] 영속성전이 & 고아객체  (0) 2022.11.21
[JPA] 즉시 로딩과 지연 로딩  (0) 2022.11.21
[JPA]스프링 프록시  (0) 2022.11.21
[JPA]스프링 연관관계 매핑  (0) 2022.10.23
자바 면접 질문 리스트3  (0) 2022.08.30