«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

자바로 Tic Tac Toe 틱택톡 게임 만들기 + 음악 넣기 본문

개발일기/Java

자바로 Tic Tac Toe 틱택톡 게임 만들기 + 음악 넣기

민장미 2023. 5. 8. 01:53

오늘도 오류랑 열심히 싸웠다 ㅠㅠㅠ

재생영상 한번 찍어봤다~  한손으로 타자치고, 한손으로 촬영하느라 흔들림이 많음

(인코딩하는데 상하,좌우반전 다 해야하는 줄 몰라서 3번이나 했다... 자고싶어 )

음악소리가 포인트 ~

 

 

 

 

인터페이스썼다가 딱히 쓸모없어서 걍 지움

 

소스파일은 3개   Mp3player class( jlayer 드라이브 필수), Tic Tac Toe class , UI(메인)

내가 원하던 것:  게임시작과 동시에 음악1 재생

승리자 정해진 순간에 음악1 스탑, 음악2 재생(축하음)

 

문제점1. 

처음엔 겜 끝나고 음악2가 재생이 자꾸 안됐다. 이건 데몬스레드를 해지하면서 해결이 되었다. ㅇㅇ

대신 메인끝나고 음악은 끝까지 재생. 

 

문제점2. 

승리자를 판별하는 메소드가 첫 입력 후에 무조건 실행된다는 거...

이건 gpt 탓을 해야함  얘가 애초에 틀린 답을 알려줬음...

차라리 혼자 고민했으면 처음부터 맞는 코드는 작성했었을 것 같다.  점점 신뢰도가 떨어져;;

 

for (int i = 0; i < 3; i++) {

if (board[i][0] == player && board[i][1] == player && board[i][2] == player) {

// 틀린거 //board[i][1] && board[i][1] == board[i][2] && board[i][0] ==board[i][2])

// 틀린이유: 이미 다 빈공간이라서 조건이 충족되서 계속 첫판에 승리자가 나옴

이건 코드 다시보고 내가 알아서 고쳤음.. 애초에 말이 안되는 조건식이었는데 ㅋㅋㅋ...허무 

 

문제점3. 

음악1을 Tic Tac Toe클래스의 생성자에 집어 넣었더니 깔끔하게 바로 실행되서 좋았는데

마지막엔 결국엔 음악1재생 메소드를 UI에 직접 객체 생성과 메소드를 호출했어야 했다 ㅠㅠ

내가 하고 싶었던 건 가능한 클래스 안에 넣는건데 ㅠㅠ

 

추가해야할 기능 좀 있는데 

무튼 원하는 대로 완성~

 

코드1.mp3player class

package tic_tac_tok;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class Mp3player {
	//아래는 음악 파일 경로. 
	private String mp3Start ="C:\\\\MV0cm.mp3";  //게임시작 음악 (
	private String mp3Win ="C:\\Users\\SmallCongratulations(1).mp3"; // // 승리음악 경로
	private Player playerS; // 음악을 실행시켜주는 객체
	//private Player playerW; // 음악을 실행시켜주는 객체
	private int position; // 위치값

	

	public String getMp3Start() {
		return mp3Start;
	}
	
	public String getMp3Win() {
		return mp3Win;
	}


	//게임시작할때 나오는 음악 
	public void playmp3Start(String mp3Start) {
		
		BufferedInputStream bis=null;
		try {
			bis = new BufferedInputStream(new FileInputStream(mp3Start)); 
			playerS = new Player(bis);
		} catch (Exception e) {
			e.printStackTrace();
		}

		
		Thread t = new Thread() {
			public void run(){
				try {
					playerS.play();
				} catch (JavaLayerException e) {
					e.printStackTrace(); 
					System.out.println("S재생미스");
					
				}
			};
		};
		t.setDaemon(true); 
		t.start();
		
	}// start
	
	
	
	//승리자가 정해졌을때 축하하는 음악 
	public void playMp3Win(String mp3Win) {
		
		
		BufferedInputStream bis=null;
		try {
			bis = new BufferedInputStream(new FileInputStream(mp3Win)); 
			playerS = new Player(bis);
		} catch (Exception e) {
			e.printStackTrace();
		}

		
		Thread t = new Thread() {
			public void run(){
				try {
					playerS.play();
				} catch (JavaLayerException e) {
					e.printStackTrace(); 
					System.out.println("W재생미스");
					
				}
			};
		};
		//t.setDaemon(true); //이걸 해버리면 음악재생이 아예 안되버림
		t.start();
		
		
	}// start
	
	//음악 2가지 다 정지 가능한 메소드 
	public void stpoMusicS() {
		if (playerS != null) {
			playerS.close(); // 종료
		}
	}//st mu

	/*
	 * public void stpoMusicW() { if (playerW != null) { playerW.close(); // 종료 }
	 * }//st mu
	 */	
	
}//

 

 

코드2: 틱택톡 class

 

package tic_tac_tok;

public class TicTacTok {

	private char player1 = 'O';
	private char player2 = 'x';
	char[][] board;
	Mp3player mp3 = new Mp3player();

	// 생성자: 보드 출력 및 초기화
	public TicTacTok() {

		// 게임시작 및 빈 게임판 출력
		gameStart();

	}// 생성자

	// 게임시작 및 빈 게임판 출력
	public void gameStart() {
		//Mp3player mp3= new Mp3player();
		//mp3.playmp3Start(mp3.getMp3Start());
		System.out.println("플레이 순서를 정해주세요. 플레이어 1번: O 플레이어 2번: X 입니다.");
		System.out.println("게임을 시작합니다. 자신의 문자와 좌표 x,y를 순서대로 입력해주세요. +좌표범위: 0~2 ");

		board = new char[3][3];
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				board[i][j] = ' ';
			}
		}
		printBoard(); // 프린트까지
	}

	public char[][] getBoard() {
		return board;
	}

	public void printBoard() {
		for (int i = 0; i < 3; i++) {
			System.out.println(board[i][0] + " | " + board[i][1] + " | " + board[i][2]);
			if (i < 2) {
				System.out.println("---------");
			}
		}
	}

	// 이미 가득차있는경우 / 비어있는 경우
	public void playGame(char player, int x, int y) {
			
			if (player != 'X' && player != 'O') { //
			System.out.println("올바른 기호를 입력하세요");
			return;
			}
			
			if ((x < 0 || x > 2) || (y < 0 || y > 2)) {
				System.out.println("좌표의 범위를 벗어났습니다. 다시 입력하세요.");
				return;
			} else {
				if (board[x][y] != ' ') {
					System.out.println("이미 입력된 칸입니다. 다시 입력하세요.");
					return;
				} else {
					board[x][y] = player;
				}
			}
	}// playgame

	public boolean isWiner(char player) {

		for (int i = 0; i < 3; i++) {
			if (board[i][0] == player && board[i][1] == player && board[i][2] == player) {
				// 틀린거 //board[i][1] && board[i][1] == board[i][2] && board[i][0] ==board[i][2])
				// 틀린이유: 이미 다 빈공간이라서 조건이 충족되서 계속 첫판에 승리자가 나옴
				return true;
			}
		} // for 가로검사

		for (int i = 0; i < 3; i++) {
			if (board[0][i] == player && board[1][i] == player && board[2][i] == player) {
				return true;
			}
		} // for 세로검사

		// 대각선검사1
		if (board[0][0] == player && board[1][1] == player && board[2][2] == player) {
			return true;
		}
		// 2
		if (board[2][0] == player && board[1][1] == player && board[0][2] == player) {
			return true;
		}

		// 음악 나오게
		return false; // 승리에 해당사항이 없는 경우;
	}// iswinner

	public void winEnding(char player) {
		
		Mp3player mp3 = new Mp3player();
		mp3.playMp3Win(mp3.getMp3Win());

		System.out.println("축하합니다. 승리자 " + player + "님! 승리하셨습니다.");
	}

}

 

코드3: UI 이자 메인

package tic_tac_tok;

import java.util.Scanner;

import com.sun.source.tree.ContinueTree;

public class UI {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Mp3player mp3 = new Mp3player();
		TicTacTok t = new TicTacTok();
		
		mp3.playmp3Start(mp3.getMp3Start());
		end: while (true) {
			System.out.print("1. 플레이어 입력 (O or X): ");
			char player = sc.nextLine().charAt(0);
			
			try {
				System.out.print("2. x좌표: ");
				int x = Integer.parseInt(sc.nextLine());
				System.out.print("3. y좌표: ");
				int y= Integer.parseInt(sc.nextLine());
				
				t.playGame(player, x, y);
				t.printBoard();
				boolean res = t.isWiner(player);//
				if(res==true) {
					mp3.stpoMusicS();
					t.winEnding(player);
				}else{
					continue end;
				}
			} catch (NumberFormatException e) {
				System.out.println("양수인 정수만 입력해주세요!");
				continue end;
			} 
			break end;
		}// wh
		
		
		//System.out.println("게임을 다시 플레이하시겠습니까? 1번을 누르면 다시 시작합니다.");
		
		
	}//main 

}