package omokgame;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
//두개의 돌을 다 커버할 클래스.
//돌을 개체로써 흰돌과 검은돌을 속성을 가지는 Omok클래스를 한다.
public class Omok {
// 정수형이기때문에 구체적인 변수명은 안됨.
private int color; // 돌을 식별하기위한 값 , 기본값
// static생성자안에서 일관되게 초기화하는것이 바람직함
private static final int WHITE;
private static final int BLACK;
// 오목의 객체가 여러번 생성되기때문에 한번의 생성으로 사용하기위함
private static Image imgBlack;
private static Image imgWhite;
private int locationX;
private int locationY;
//모든 오목들이 사용하는값.
//색을 지정하는 불린값이다.
private static boolean isBlackTurn;
static { // 전역변수를 초기화하는 역할
isBlackTurn = false; //false이면 Black 턴 , ture이면 White;
BLACK = 2;
WHITE = 1;
try {
imgBlack = ImageIO.read(new File("./images/blackstone.png"));
imgWhite = ImageIO.read(new File("./images/whitestone.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
//draw는 그래픽객체를 이용해서 그림을그린다.
public void draw(Graphics g) {
//이미지만 변하므로 이미지변수값만 변환시켜준다.
Image img = imgBlack;
if (color == BLACK) {
g.drawImage(img, locationX - 19, locationY - 19, OmokCanvas.getInstance());
} else if (color == WHITE) {
img = imgWhite;
g.drawImage(img, locationX - 19, locationY - 19, OmokCanvas.getInstance());
}
}
public Omok(int x, int y) {
isBlackTurn = !isBlackTurn;
//isBlack은 전역 변수이므로 모든 객체가 참조한다. 객체가 생성될때마다 값을 참조하기때문에
//값은 유지되서 가져오게된다.
if(isBlackTurn)
color = BLACK;
else if(!isBlackTurn)
color = WHITE;
locationX = x;
locationY = y;
/*
* if (omokIndex % 2 == 1) color = BLACK; else color = WHITE;
*/
// 인스턴스 변수는 생성자에 초기화해주는것을 통일하는것이 바람직하다.
}
}
모든 오목 객체들이 공유하는 값을 하나를 가지고 그 값으로 color의 변숫값을 변경시켜서 흰돌과 검은 돌이 순차적으로 나오게 하겠다.
private static boolean isBlackTurn;
boolean형 변수를 전역변수로 생성하고
생성자에서 기본값으로 false를 넣고 첫 번째 순서를 검은 돌로 한다.
if(isBlackTurn)
color = BLACK;
else if(!isBlackTurn)
color = WHITE;
오목 객체가 마우스 클릭에 의해 생성되면
생성자에 있는 isBlackTurn =! isBlackTurn; 에 의해
ture값으로 변하며 전역 변수 isBlackTurn값은 true가 된다.
그 이후 if문에 의해 color가 black으로 바뀌게 되며
draw함수에 의해 검은 돌이 그려지게 된다.
다음 클릭으로 오목 객체를 만들게 되면 전역 변숫값인 true값을 가져오게 되고
isBlackTurn =! isBlackTurn에 의해 false로 바뀌게 된다
위 코드 if문에 의해 else if문이 실행되며 color값이 white로 변하게 된다.
그 뒤 draw함수에서 white이미지를 그려서 출력하게 된다.
-----문제점-----
각 네모칸마다 간격은 40이고 처음 칸 간격 값은 20이다.
만약 점과 점 사이의 좌표를 마우스로 클릭했을 때 어디에 위치해야 하는지에 대한 문제점인데
클릭한 위치 값을 40으로 나누고 20을 더해주면 첫 번째 칸에 위치하게 되는데
그 값을 반올림을 시켜줘서 왼쪽에 둘지 오른쪽에 둘지 정해준다. 그리 고난 뒤 다시 40을 곱해주면 반올림된 점에서 원래 그위 치로 가게 돼서 이미지가 출력된다.
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println(x );
//정확한 점이 마우스클릭이 되지않았을때 반올림해서한다.
//입력받은 x좌표값을 한칸이 40픽셀이므로 먼저나눈뒤 반올림을해준다
//그뒤 40을 곱해줘서 다시좌표로 보내준뒤 빈공간값인20을 더해준다.
x= (int)(Math.floor(x/40)*(40))+20;
y= (int)(Math.floor(y/40)*(40))+20;
// 오목객체를 생성해서 배열에 담은뒤 가르키는 인덱스에추가
omoks[omokIndex++] = new Omok(x, y);
repaint();
}
});
-------------문제점
만약에 더 많은 오목 알이 생성되게 된다면 update가 지우고 그리고 를 반복하기 때문에
깜빡임 현상이 심해진다. 그것을 해결하기 위해 더블 버퍼링을 사용하고
update메서드에서 부모의 update를 실행하지 않고 즉시 paint함수를 호출하도록 해서
깜빡임을 없앤다.
public void update(Graphics g) {
this.paint(g);
}
// 캔버스의 paint를 오버라이드해서 이미지를 그려주겠다.
//paint는 캔버스에 이미지를 그려준다.
public void paint(Graphics g) {
Image buf;
Graphics bufG;
//동일한크기의 비트맵이미지를만들고
buf = createImage(760,760);
//buf는 그래픽객체를 가지고있는데 getGraphics()를 통해 그래픽스객체를 반환해서 bufG에 저장한다.
//그 그래픽스 객체를 가지고 버퍼이미지에 그린뒤 전부그린 버퍼이미지를 한번에 캔버스에 그려준다.
bufG = buf.getGraphics();
//bufg를 통해 비트맵에 전부그린다.
bufG.drawImage(img, 0, 0, this);
// 판을그리고 오목을그린다.
for (int i = 0; i < omokIndex; i++)
omoks[i].draw(bufG);
//전부그려진 buf이미지를 한번에 그리도록한다.
g.drawImage(buf, 0, 0, this);
}
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 24일차 -42 (0) | 2020.03.26 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 24일차 -41 (0) | 2020.03.26 |
자바기반의 웹&앱 응용 SW개발자 양성과정 23일차 -39 (0) | 2020.03.25 |
자바기반의 웹&앱 응용 SW개발자 양성과정 22일차 -38 (0) | 2020.03.24 |
자바기반의 웹&앱 응용 SW개발자 양성과정 21일차 -37 (0) | 2020.03.24 |
댓글