[개발] Java로 구현한 '물고기 키우기 게임' 수정기1

이나형·2024년 8월 17일
0

개발공부

목록 보기
1/3

2학년에 Java를 공부하면서 오픈소스로 만들었던 물고기 키우기 게임 코드를 다시 들여다보게 되었습니다. 그 당시에는 쓰레드도 사용하고, 잘 만든 게임이라 생각했는데 지금 이 당시 코드 구조와 실제 게임 동작, 코드를 보니 오류가 꽤 있다고 생각이 들었습니다.

따라서 몇 가지 코드를 수정하고, 다시는 이를 반복하지 않게 이러한 오류를 해결하는 포스팅을 작성해야겠다고 다짐하게 되었습니다.



🐠계획했던 물고기 키우기 게임





계획했을 당시에는, 물고기와 상어를 스레드를 사용하여 동기화 시켜 데드락이 발생하지 않게 해야겠다는 생각을 했습니다. 그런데 실제 코드에서는 동기화를 하는 코드가 빠져 각각의 스레드가 동작하였습니다.

실제 동작

계획했을 당시에는, 물고기와 상어를 스레드를 사용하여 동기화 시켜 데드락이 발생하지 않게 해야겠다는 생각을 했습니다. 그런데 실제 코드에서는 동기화를 하는 코드가 빠져 각각의 스레드가 동작하였습니다.



📝 수정한 코드

//동기화 코드 Synchronized를 사용하여 바꾼 Fish 코드중 일부
public void run() {
		life = 10;
		while(life > 0) {
			int next_x = new Random().nextInt(600)+30;
			int next_y = new Random().nextInt(350)+30;
            
           //동기화 블록
			synchronized (this) { 
			while(!(x == next_x && y == next_y)) {
				if (x > next_x) x -= 1;
				else if (x < next_x) x += 1;
				else if (y > next_y) y -= 1;
				else if (y < next_y) y += 1;
				
                app.repaint();
                //---중략---
                public synchronized void Life() {
	    this.life = 10;
	}
}



//동기화 코드 Synchronized를 사용하여 바꾼 Enemy 코드중 일부
public class Enemy extends Thread
{
	int x, y;
	int speed;
	int dir;
	public static int life;
	int term;
	JPanel app;
	Random ran = new Random();
	
	public Enemy(JPanel _app, int w, int h)
	{
		app = _app;
		x = w;
		y = h;
	}
	
	public void run()
	{	
		while(true)
		{	
			x = 250; y = -400;
			term = (int)(Math.random() * 10000) + 5000; // 상어가 다시 활동하기까지의 시간을 랜덤하게 결정
			
			try{
				sleep(term);
			} 
			catch (InterruptedException e1) {
				
				e1.printStackTrace();
			}
			
			dir = ran.nextInt(4)+1; //방향 설정
			life = (int)(Math.random() * 5) + 1; // 상어의 생명력 설정
			
			//동기화코드
			synchronized (this) {
			while(life>0)
			{
            
            //---중략---
            
         public synchronized void Life() {  // 동기화 메서드
	        this.life = 10;
	    }
    }



🐱깃허브 주소

깃허브 주소: 물고기 키우기 게임

profile
정도를 걷는 개발자

0개의 댓글