[Java] 자바 미니 프로젝트 - 육목

주재완·2024년 3월 7일
0

Java

목록 보기
12/13
post-thumbnail

Introduction

국비 학원에서 강의를 들은지 2개월이 지나 자바 미니 프로젝트를 진행하게 되었습니다.

자바 자체는 학원에서 수강하기 전 2~3개월 전 간단히 유튜브를 통해 학습한 바 있긴 하지만, 처음 주제 선정 및 기능을 추가로 배우면서 뭔가 마음에 안드는 부분도 많이 있어 몇번 엎고 완전히 새로 시작한 결과 실제로 만든 기간은 짧지만 그래도 어느정도 구색은 갖추게 되었습니다.

만든 프로젝트 깃허브 링크는 아래와 같습니다.
https://github.com/red-sprout/TCP_6mok

주제 선정

이때까지 배운 자바의 모든 기능들을 활용해보고자 했고, 특히 TCP 통신을 활용하고 싶었습니다. 이를 활용한게 어떤게 적절할까 생각하다가 아예 온라인 게임을 만들면 어떨까 생각했고, 학원 이전에 학습했던 알고리즘도 한번 적용하기 편한 오목이 어떨까 생각했습니다.

그런데, 오목은 불공정한 게임임이 알려져 있습니다. 따라서 이런 요소는 마음에 들지 않았기에 육목을 진행하게 되었습니다.

진행 기간

2024.02.26 ~ 2024.03.05 까지 기능을 구현하였습니다.
그 이후로는 리펙토링 진행 및 개선점을 찾고 있는 중입니다.

사용한 기술

Java, Oracle, JDBC로 진행하였습니다.

육목 규칙

육목의 규칙은 다음과 같습니다.

  • 흑이 선으로 1개의 수를 둡니다.
  • 백이 다음으로 2개의 수를 둡니다.
  • 흑이 다음으로 2개의 수를 둡니다.

구현한 사항들

  • 로그인을 통해 아이디 비밀번호를 조회해서 있는 회원일 경우 (회원명)님 환영합니다 를 출력합니다.
  • 회원가입은 아이디, 비밀번호, 이름, 전화번호를 입력합니다.
    • 있는 회원은 회원가입이 진행되지 않습니다.
  • 테이블은 총 3개, 유저 정보를 저장하는 Gameuser, 승패 전적을 조사하는 History, 온라인 게임(TCP 통신)을 위한 대기방 Room 테이블을 만들었고, 이를 Java에서 VO(Value Object)로 제작하였습니다.
  • 육목의 규칙에 맞게 게임을 할 수 있도록 하였습니다. (바로 아래 육목 전략 탭 참고)
  • 유저 정보를 수정할 경우
    • 먼저 로그인을 진행합니다
    • 변경사항(비밀번호, 닉네임, 전화번호)를 차례대로 입력합니다.
    • 변경사항이 반영됩니다.
  • 유저 전적 검색은 아이디로 조회합니다. 아이디, 승, 무, 패 정보가 출력됩니다.
  • 탈퇴시 아이디 확인을 하도록하였습니다.
    • 탈퇴를 성공하였으면 전적까지 삭제하도록 하였습니다. 즉 전적 검색을 하면 정보가 조회되지 않습니다.

육목 전략

공통

  • 기본적으로 6개가 일렬로 있으면 승리하는 게임입니다. 하지만 7목과 8목 같은 n목은 허용하지 않도록 하였습니다.
  • 판별 알고리즘은 현재 백트래킹을 사용하였습니다. 알고리즘의 경우 추가 개선 계획을 가지고 있습니다. SixmokGameService.java에 반영하였습니다.

오프라인

  • 흑돌 선으로 1수를 두고 그다음부터는 번갈아가며 2수씩 따로 두었습니다.

온라인

  • 온라인 통신 전략으로 대기방을 만들었습니다. 대기방을 만드는 즉시 방장(방을 만든 사람)은 ServerSocket 객체를 생성하여 서버가 되도록 하였습니다.
  • IP의 경우 방장의 localhost에 대응하는 IP(127.0.0.1이 아닌 실제 접속 가능한 IP)를 찾을 수 있게 하였습니다.
// TCPService.java
	public String getIP() {
		String serverIP = null;
		try {
			serverIP = InetAddress.getLocalHost().getHostAddress(); // 본인의 IP로 설정
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return serverIP;
	}
  • 포트는 1000번부터 하나하나씩 돌아가면서 열린 포트가 있는지 확인하였습니다.
// TCPService.java
	public int getPort(String serverIP) {
		int port = 1000; // 포트는 1000으로 우선 설정
		for(int i = 1000; i <= 65535; i++) {
			if(availablePort(serverIP, i)) {
				port = i;
				break;
			}
		}
		return port;
	}
	
	public boolean availablePort(String host, int port) {
		try {
		    (new Socket(host, port)).close();
		    return false;
		} catch(Exception e) {
		    return true;
		}
	}
  • 해당하는 대기방에 들어가면 TCP 통신으로 서로 돌에 해당하는 좌표 정보를 주는 방식으로 통신을 진행했습니다. 육목판을 객체 정보로 직접 주는 방식도 생각했는데, 좌표 정보만 주는 방식이 좀 더 전송할 데이터가 적어 효과적이라 판단했습니다.

기본 UI

  • 첫 화면
    첫 화면
  • 메인 메뉴
  • 오프라인 플레이
    오프라인 플레이
  • 온라인 플레이 (왼쪽이 방장 UI, 오른쪽이 접속자 UI)
    아이디가 admin일 뿐 실제 관리자는 아닙니다
    온라인1
    온라인2
profile
언제나 탐구하고 공부하는 개발자, 주재완입니다.

0개의 댓글

관련 채용 정보