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목이상 알고리즘등 적용하지 않았습니다.
적용하고싶으면 한번 적용해서 만들어 보시길 추천드립니다.