본문 바로가기
개발

자바 오목게임 만들기

by 카앙구운 2014. 10. 23.
728x90
반응형

이번에는 오목게임을 만들어보도록 하겠다.

룰은 한번씩 돌아가며 돌을 놓고 먼저 5개를 놓는 사람이 이기는 게임이다.

 

GUI는 JFrame과 JPane으로 그렸다.

지정된 판에 선을 그리고 마우스프레스드를 통해 마우가 클릭하는 자리에 돌을 놓는 방식으

로 진행된다.

 

 

오목을 시작하는 메인으로 코드를 작성 후 게임을 실행하는 클래스이다.

GUI객체를 생성하는데 GUI 클래스를 확인해보자

 

GUI클래스는 전체적인 목을 그림을 그리는 판으로 JFrame과 JOptionPane을 이용하여 그림

을 그렸다.

MapSize와 DrawBoard클래스에 있는 것을 활용하여 전체적인 그림을 그리고

mouseEventHandler클래스를 이용하여 마우스가 클릭되는 곳에 돌을 넣어을 수 있도록 만들

었다.

showPopUp은 승리시 메세지 박스를 뜨게 만들어 누가 승리했는지 알려주게된다.

----------------------------------------------------------------------------------

package omoke;

public class Map {

 private short[][] map;// 맵의 배열 1일때 흑,-1일때 백, 0일때 돌이 안놓여짐
 private final short BLACK = 1;
 private final short WHITE = -1;
 private boolean checkBNW = true;// 흑백차례확인

 public Map(MapSize ms) {
  map = new short[ms.getSize()][];
  for (int i = 0; i < map.length; i++) {
   map[i] = new short[ms.getSize()];
  }
 }

 public short getBlack() {
  return BLACK;
 }

 public short getWhite() {
  return WHITE;
 }

 public short getXY(int y, int x) {
  return map[y][x];
 }

 public boolean getCheck() {
  return checkBNW;
 }

 public void changeCheck() {
  if (checkBNW) {
   checkBNW = false;
  } else {
   checkBNW = true;
  }
 }

 public void setMap(int y, int x) {
  // checkBNW를 확인해 true일 때 map에 BLACK, false일 때 WHITE저장
  if (checkBNW) {
   map[y][x] = BLACK;
  } else {
   map[y][x] = WHITE;
  }
 }

 // 승리확인
 public boolean winCheck(int x, int y) {
  if (winCheckL(x, y) || winCheckLD(x, y) || winCheckLU(x, y)
    || winCheckR(x, y)

    || winCheckRD(x, y) || winCheckRU(x, y) || winCheckUp(x, y)
    || winCheckDown(x, y)

    || winCheckOneDown(x, y) || winCheckOneL(x, y)
    || winCheckOneLD(x, y) || winCheckOneLU(x, y)

    || winCheckOneR(x, y) || winCheckOneRD(x, y)
    || winCheckOneUp(x, y) || winCheckOneRU(x, y)

    || winCheckCenterLU(x, y) || winCheckCenterRL(x, y)
    || winCheckCenterRU(x, y) || winCheckCenterUD(x, y)) {
   return true;
  } else {

   return false;
  }
 }

 // 위쪽
 public boolean winCheckUp(int x, int y) {
  try {
   for (int i = y; i < y + 5; i++) {
    if (map[y][x] != map[i][x])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckDown(int x, int y) {
  try {
   for (int i = y; i > y - 5; i--) {
    if (map[y][x] != map[i][x])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckRU(int x, int y) {
  try {
   for (int i = y, z = x; i > y - 5; i--, z++) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckLU(int x, int y) {
  try {
   for (int i = y, z = x; i > y - 5; i--, z--) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckR(int x, int y) {
  try {
   for (int z = x; z < x + 5; z++) {
    if (map[y][x] != map[y][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckL(int x, int y) {
  try {
   for (int i = y, z = x; z > x - 5; z--) {
    if (map[y][x] != map[i][z] || i > 19 || z > 19 || i < 0
      || z < 0)
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckRD(int x, int y) {
  try {
   for (int i = y, z = x; i < y + 5; i++, z++) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 public boolean winCheckLD(int x, int y) {
  try {
   for (int i = y, z = x; i < y + 5; i++, z--) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 위쪽
 public boolean winCheckOneUp(int x, int y) {
  try {
   for (int i = y - 1; i < y + 4; i++) {
    if (map[y][x] != map[i][x])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 아래쪽
 public boolean winCheckOneDown(int x, int y) {
  try {
   for (int i = y + 1; i > y - 4; i--) {
    if (map[y][x] != map[i][x])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 오른쪽 위 대각선

 public boolean winCheckOneRU(int x, int y) {
  try {
   for (int i = y + 1, z = x - 1; i > y - 4; i--, z++) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 왼쪽 위 대각선

 public boolean winCheckOneLU(int x, int y) {
  try {
   for (int i = y + 1, z = x + 1; i > y - 4; i--, z--) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 오른쪽
 public boolean winCheckOneR(int x, int y) {
  try {
   for (int z = x - 1; z < x + 4; z++) {
    if (map[y][x] != map[y][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 왼쪽
 public boolean winCheckOneL(int x, int y) {
  try {
   for (int z = x + 1; z > x - 4; z--) {
    if (map[y][x] != map[y][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 오른쪽 아래 대각선
 public boolean winCheckOneRD(int x, int y) {
  try {
   for (int i = y - 1, z = x - 1; i < y + 4; i++, z++) {
    if (map[y][x] != map[i][z] || i > 19 || z > 19 || i < 0
      || z < 0)
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 한칸 왼쪽 아래 대각선
 public boolean winCheckOneLD(int x, int y) {
  try {
   for (int i = y - 1, z = x + 1; i < y + 4; i++, z--) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {

   return false;
  }
  return true;
 }

 // 센터 업다운

 public boolean winCheckCenterUD(int x, int y) {
  try {
   for (int i = y - 2; i < y + 3; i++) {
    if (map[y][x] != map[i][x])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 센터 라이트 레프트

 public boolean winCheckCenterRL(int x, int y) {
  try {
   for (int z = x - 2; z < x + 3; z++) {
    if (map[y][x] != map[y][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 센터 라이트 대각선

 public boolean winCheckCenterRU(int x, int y) {
  try {
   for (int i = y + 2, z = x - 2; i > y - 3; i--, z++) {
    if (map[y][x] != map[i][z])
     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {
   return false;
  }
  return true;
 }

 // 센터 레프트 대각선
 public boolean winCheckCenterLU(int x, int y) {
  try {
   for (int i = y + 2, z = x + 2; i > y - 4; i--, z--) {
    if (map[y][x] != map[i][z])

     return false;
   }
  } catch (ArrayIndexOutOfBoundsException e) {

   return false;
  }
  return true;
 }

}

 

 

트레비 플레인 탄산수

COUPANG

www.coupang.com

-------------------------------------------------------------

map 클래스는 전체 바둑판에서 돌의 검정색과 흰색이 놓여지는 위치와 돌의 색을 판정하여

돌이 놓여지는 위치를 설정한다.

배열로 설정하는 것이기 때문에 헷갈리지 않게 하는 것이 좋다.

 

 

mapsize는 전체 바둑판의 크기를 설정해 주는 것이다.

 

 

 

mousePressed를 통해 마우스 이벤트를 발생 시키고 판에서만 클릭될 수 있도록하며 판의

범위를 벗어나게 되면 값을 return해준다.

 

swing을 이용하여 gui를 만들고 코딩을 해보았다.

자바 console도 좋지만 그래픽이 조금만 가해지면 좀 더 재미난 게임을 만들 수 있을 것이다.


 package Omoke;

 

 

 

public class Map{

private short[][] map; //맵의 배열 1일 때 흑, -1일 때 백, 0일 때 돌이 안놓여짐

private final short BLACK=1; 

private final short WHITE=-1;

private boolean checkBNW=true; //흑차례 백차례 확인

 

public Map(MapSize ms){

// TODO Auto-generated constructor stub

//배열 초기화

map=new short[ms.getSize()][];

for(int i=0;i<map.length;i++)

map[i]=new short[ms.getSize()];


}

public short getBlack() {

return BLACK;

}

public short getWhite() {

return WHITE;

}

public short getXY(int y,int x) {

return map[y][x];

}

public boolean getCheck() {

return checkBNW;

}

public void changeCheck() {

if(checkBNW)

checkBNW=false;

else

checkBNW=true;

}

public void setMap(int y,int x) {

//checkBNW를 확인해 true일 때 map에 BLACK, false일 때 WHITE저장

if(checkBNW)

map[y][x]=BLACK;

else

map[y][x]=WHITE;

}

 

//승리확인

 

public boolean winCheck(int x,int y){

if(winCheckL(x, y)||winCheckLD(x, y)||winCheckLU(x, y)||winCheckR(x, y)

||winCheckRD(x, y)||winCheckRU(x, y)||winCheckUp(x, y)||winCheckDown(x, y)

||winCheckOneDown(x, y)||winCheckOneL(x, y)||winCheckOneLD(x, y)||winCheckOneLU(x, y)

||winCheckOneR(x, y)||winCheckOneRD(x, y)||winCheckOneUp(x, y)||winCheckOneRU(x, y)

||winCheckCenterLU(x, y)||winCheckCenterRL(x, y)||winCheckCenterRU(x, y)||winCheckCenterUD(x, y))

return true;

else

return false;

}

 

 

//위쪽

public boolean winCheckUp(int x,int y) {

try{

for(int i=y;i<y+5;i++){

if(map[y][x]!=map[i][x])

return false;

}

}catch(ArrayIndexOutOfBoundsException e){

return false;

}

 

return true;

}

//아래쪽

public boolean winCheckDown(int x,int y) {

try {

for(int i=y;i>y-5;i--){

if(map[y][x]!=map[i][x])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//오른쪽 위 대각선

public boolean winCheckRU(int x,int y) {

try {

for(int i=y, z=x;i>y-5;i--,z++){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//왼쪽 위 대각선

public boolean winCheckLU(int x,int y) {

try {

for(int i=y, z=x;i>y-5;i--,z--){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//오른쪽

public boolean winCheckR(int x,int y) {

try {

for(int z=x;z<x+5;z++){

if(map[y][x]!=map[y][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//왼쪽

public boolean winCheckL(int x,int y) {

try {

for(int z=x;z>x-5;z--){

if(map[y][x]!=map[y][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//오른쪽 아래 대각선

public boolean winCheckRD(int x,int y) {

try {

for(int i=y, z=x;i<y+5;i++,z++){

if(map[y][x]!=map[i][z]||i>19||z>19||i<0||z<0)

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//왼쪽 아래 대각선

public boolean winCheckLD(int x,int y) {

try {

for(int i=y, z=x;i<y+5;i++,z--){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//한칸 위쪽

public boolean winCheckOneUp(int x,int y) {

try{

for(int i=y-1;i<y+4;i++){

if(map[y][x]!=map[i][x])

return false;

}

}catch(ArrayIndexOutOfBoundsException e){

return false;

}

 

return true;

}

//한칸 아래쪽

public boolean winCheckOneDown(int x,int y) {

try {

for(int i=y+1;i>y-4;i--){

if(map[y][x]!=map[i][x])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//한칸 오른쪽 위 대각선

public boolean winCheckOneRU(int x,int y) {

try {

for(int i=y+1, z=x-1;i>y-4;i--,z++){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//한칸 왼쪽 위 대각선

public boolean winCheckOneLU(int x,int y) {

try {

for(int i=y+1, z=x+1;i>y-4;i--,z--){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//한칸 오른쪽

public boolean winCheckOneR(int x,int y) {

try {

for(int z=x-1;z<x+4;z++){

if(map[y][x]!=map[y][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//한칸 왼쪽

public boolean winCheckOneL(int x,int y) {

try {

for(int z=x+1;z>x-4;z--){

if(map[y][x]!=map[y][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//한칸 오른쪽 아래 대각선

public boolean winCheckOneRD(int x,int y) {

try {

for(int i=y-1, z=x-1;i<y+4;i++,z++){

if(map[y][x]!=map[i][z]||i>19||z>19||i<0||z<0)

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

 

//한칸 왼쪽 아래 대각선

public boolean winCheckOneLD(int x,int y) {

try {

for(int i=y-1, z=x+1;i<y+4;i++,z--){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//센터 업다운

public boolean winCheckCenterUD(int x,int y) {

try{

for(int i=y-2;i<y+3;i++){

if(map[y][x]!=map[i][x])

return false;

}

}catch(ArrayIndexOutOfBoundsException e){

return false;

}

 

return true;

}

//센터 라이트 레프트

public boolean winCheckCenterRL(int x,int y) {

try {

for(int z=x-2;z<x+3;z++){

if(map[y][x]!=map[y][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//센터 라이트 대각선

public boolean winCheckCenterRU(int x,int y) {

try {

for(int i=y+2, z=x-2;i>y-3;i--,z++){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

//센터 레프트 대각선

public boolean winCheckCenterLU(int x,int y) {

try {

for(int i=y+2, z=x+2;i>y-4;i--,z--){

if(map[y][x]!=map[i][z])

return false;

}

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

return false;

}

 

return true;

}

}

 

<수정>


 

package Omoke;

 

import java.awt.Color;

import java.awt.Graphics;

 

import javax.swing.JPanel;

 

 

@SuppressWarnings("serial")

public class DrawBorad extends JPanel{

private MapSize size;

private Map map;

private final int STONE_SIZE=28; //돌 사이즈

public DrawBorad(MapSize m,Map map) {

// TODO Auto-generated constructor stub

setBackground(new Color(206,167,61)); //배경색 지정

size=m;

setLayout(null);

this.map=map;

 

}

@Override

public void paintComponent(Graphics arg0) {

// TODO Auto-generated method stub

super.paintComponent(arg0);

arg0.setColor(Color.BLACK); //그려질 색을 블랙지정

board(arg0); //보드를 그림

drawStone(arg0); //배열에 정보에 따라 돌을 그림

}

public void board(Graphics arg0) {

for(int i=1;i<=size.getSize();i++){

//가로 줄 그리기

arg0.drawLine(size.getCell(), i*size.getCell(), size.getCell()*size.getSize(), i*size.getCell()); //시작점 x : 30, 시작점 y : i값 (줄번호)*30, 끝점 x : 600,끝점 y : i값 (줄번호)*30

//세로줄 그리기

arg0.drawLine(i*size.getCell(), size.getCell(), i*size.getCell() , size.getCell()*size.getSize()); //시작점 x : i값 (줄번호)*30, 시작점 y : 30, 끝점 x : i값 (줄번호)*30, 끝점 y : 600

}

}

public void drawStone(Graphics arg0) {

for(int y=0;y<size.getSize();y++){

for(int x=0;x<size.getSize();x++){

//배열의 정보가 흑일경우 흑돌, 백일경우 백돌을 그림

if(map.getXY(y, x)==map.getBlack())

drawBlack(arg0,x,y);

else if(map.getXY(y, x)==map.getWhite())

drawWhite(arg0, x, y);

}

}

}

 

public void drawBlack(Graphics arg0,int x,int y){

//그려질 색을 블랙으로 바꿈

arg0.setColor(Color.BLACK);

arg0.fillOval((x+1)*size.getCell()-15, (y)*size.getCell()+15, STONE_SIZE, STONE_SIZE);

 

}

public void drawWhite(Graphics arg0,int x,int y){

//그려질 색을 화이트로 바꿈

arg0.setColor(Color.WHITE);

arg0.fillOval(x*size.getCell()+15, y*size.getCell()+15, STONE_SIZE, STONE_SIZE);

 

}

}


파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

728x90
반응형

댓글