[JAVA / ³×Æ®¿öÅ©] ¸ÖƼ·ë ±¸Á¶¿¡ ´ëÇÏ¿©(°ÔÀÓ&äÆà ¹æ ¿©·¯°³)
¸ÖƼ ·ë ±¸Á¶¶ó´Â °Í¿¡ ´ëÇØ ÀÌÇØ´Â ÇÏ°í ÀÖÁö¸¸ ±¸Çö¿¡ ¾Ö¸¦ ¸Ô¾ú´ø ±â¾ïÀÌ ÀÖ´Ù.
À̴ äÆà À̶ó´øÁö, °ÔÀÓ¿¡ Åë¿ëµÇ´Â °³³äÀ¸·Î
ÇϳªÀÇ ¹æÀ» °¡Áö´Â °ÔÀÓ°ú äÆÃÀ̶ó¸é »ó°üÀº ¾øÀ¸³ª, ¿©·¯°³ÀÇ ¹æÀ» °¡Á®¾ßÇÏ´Â ÇÁ·Î±×·¥¿¡¼´Â ±¸ÇöÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù.
ÀÏ´Ü Á¢¼ÓÇÏ´Â °¢°¢ÀÇ À¯Àú¸¶´Ù ¼ÒÄÏÀ» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù.
¼¹ö¿¡¼´Â ¿©·¯°³ÀÇ ¼ÒÄÏÀ» »ý¼ºÇÏ¿© Ŭ¶óÀ̾ðÆ®¸¦ ÇÒ´çÇÏ°Ô µÇ°í,
±× ¼ÒÄÏÀ» ¹æ(Room) °³³ä¿¡ ¸Â°Ô ºÐ¹èÇØÁÖ¸é °£´ÜÇÏ°Ô ±¸ÇöÀÌ µÈ´Ù.
¿¹¸¦ µé¾î ¸ÞÀΠŬ·¡½º°¡ ÀÖ´Ù°í ÇßÀ» ¶§ ¸ÖƼ·ë ±¸Á¶¸¦ À§Çؼ µÎ°³ÀÇ Å¬·¡½º°¡ ´õ ÇÊ¿äÇÏ°Ô µÈ´Ù.
ÆíÀÇ»ó °£´ÜÇÏ°Ô
RoomManager, GameRoom
À̶ó´Â À̸§À¸·Î Á¤ÇÑ´Ù°í °¡Á¤ÇÏÀÚ.
±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
±×¸²ÀÌ ¸¹ÀÌ ½ÉÇÃÇϱäÇѵ¥.. Àü´ÞÇÏ°íÀÚ ÇÏ´Â Àǹ̴ Àü´ÞµÇ¾úÀ¸¸®¶ó ¹ÏÀ½.
Ŭ·¡½º´Â ±âº»ÀûÀ¸·Î ÃÑ 3°³°¡ ÇÊ¿äÇÏ´Ù
°ÔÀÓ¼¹ö¸¦ ±âÁØÀ¸·Î Àâ¾ÒÀ» ¶§(äÆü¹ö³ª °ÔÀÓ¼¹ö³ª »ç½Ç ±×³É À̸§¸¸ ´Ù¸¦»Ó)
RoomManager
GameRoom
GameUser
ÀÌÁ¤µµ°¡ ÇÊ¿äÇÏ°Ú´Ù.
°¢ Ŭ·¡½ºÀÇ ¿ªÇÒÀº ´ÙÀ½°ú °°´Ù.
RoomManager : RoomÀÇ »ý¼º/»èÁ¦¸¦ °ü¸®Çϴ Ŭ·¡½ºÀÌ´Ù. RoomÀ» ¿©·¯°³ °¡Áú ¼ö ÀÖÀ½
GameRoom : °ÔÀÓ ³»ÀÇ ·ÎÁ÷(°ÔÀÓ ÁøÇà °ü·Ã)À» ó¸®Çϱâ À§ÇÑ Å¬·¡½ºÀÌ´Ù. GameUser¸¦ ¿©·¯°³ °¡Áú ¼ö ÀÖÀ½
GameUser : Ŭ¶óÀ̾ðÆ®ÀÇ °íÀ¯ÇÑ Á¤º¸(´Ð³×ÀÓ, ¾ÆÀÌÅÛ, Ç÷¹À̾î Á¤º¸ µî)¸¦ °¡Áö´Â Ŭ·¡½ºÀ̸ç, Áß¿äÇÑ °ÍÀº "¼ÒÄÏ" À» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
¿¹¸¦ µé¾î A, B , C¶ó´Â ¹æÀÌ ÀÖÀ» ¶§
°¢ ¹æ¿¡¼ ÀϾ´Â ÀÏÀº ´Ù¸¥ ¹æ¿¡¼ ¾Ë ÇÊ¿ä°¡ ¾ø´Ù.
A¿¡¼ µÎ »ç¿ëÀÚ°¡ äÆÃÀ» ÇÏ°í ÀÖÀ» ¶§ A¹æ¿¡ ¼ÓÇÑ »ç¿ëÀÚµé ³¢¸®¸¸ µ¥ÀÌÅ͸¦ ÁÖ°í¹ÞÀ¸¸é µÈ´Ù.
ÀÌ ¶§ äÆÃÀÇ ´Ü°è´Â ´ÙÀ½°ú °°ÀÌ ÀÌ·ç¾îÁø´Ù.
(À¯ÀúA , À¯ÀúB, À¯Àú C)°¡ ·ë A¿¡ ¼ÓÇØÀÖ´Ù.
À¯Àú A : Hello World Àü¼ÛÇÏ°íÀÚ ÇÔ
À¯Àú A -> ¼¹ö·Î Hello world ¹®ÀÚ¿ ¼Û½Å -> ¼¹ö¿¡¼´Â A°¡ ¼ÓÇÑ ·ë Ŭ·¡½º¿¡ ±× Á¤º¸¸¦ Àü´ÞÇÏ°Ô µÊ -> Àü´Þ¹ÞÀº ¹®ÀÚ¿À» A·ë¿¡ ¼ÓÇÑ »ç¿ëÀڵ鿡°Ô Broadcast(À¯ÀúµéÀÌ °¡Áö°í ÀÖ´Â ¼ÒÄÏ Á¤º¸¸¦ ÂüÁ¶ÇÏ¸é ¹Ù·Î º¸³¾ ¼ö ÀÖ´Ù)
ÀÌ·±½ÄÀ¸·Î ±¸¼ºÇÏ°Ô µÈ´Ù¸é °¢ ¹æ¿¡ ¼ÓÇÑ »ç¿ëÀÚµé ³¢¸®¸¸ µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ» ¼ö ÀÖ´Ù.
Ŭ·¡½º¸¦ Á÷Á¢ ÀÛ¼ºÇؼ ¿Ã¸®´Â °Ç ´ÙÀ½¿¡ Çϵµ·ÏÇÏ°í..
°£´ÜÇÏ°Ô ÀÌ·±½ÄÀÌ¸é µÉ°Å°°´Ù
RoomManager
List<GameRoom> roomList;
·Î °ÔÀÓ·ëÀÇ ¸®½ºÆ®¸¦ ¸¸µé°í °ü¸®ÇÏ¸ç ¹æÀ» »ý¼ºÇÏ°í Áö¿ì´Â ÇÔ¼ö¸¦ ±¸ÇöÇÑ´Ù.
GameRoom
List<GameUser> userList;
·Î À¯Àú ¸®½ºÆ®¸¦ °ü¸®ÇÏ°í À¯Àú°¡ ³ª°¬À» ¶§ ¸®½ºÆ®¿¡¼ »©°í, Á¢¼ÓÇßÀ» ¶§ ¸®½ºÆ®¿¡ ³Ö¾îÁÖ¸é µÈ´Ù.
GameUser
ÀÌ Å¬·¡½º¿¡´Â ·Î±×ÀÎ Á¤º¸ ¹× ´Ð³×ÀÓ µîÀ» °¡Áö°í ÀÖÀ¸¸é µÈ´Ù. °ÔÀÓÀ̶ó¸é ¾ÆÀÌÅÛ Á¤º¸µéÀÌ, äÆÃÀ̶ó¸é ºÎ°¡ÀûÀΠäÆðü·Ã º¯¼öµéÀÌ Á¸Àç
±×·¡¼ ¼¹ö¿¡¼ À¯Àú°¡ Á¢¼ÓÇؼ ¹æ¿¡ µé¾î°¡´Â °úÁ¤À» °£·«ÇÏ°Ô ³ªÅ¸³»º»´Ù¸é
--¸ÞÀÎŬ·¡½º--
Socket Accept ÀÌÈÄ
Socket °´Ã¼¸¦ GameUser Ŭ·¡½º·Î »ý¼ºÀ» ÇØÁØ´Ù.
GameUser user = new GameUser(socket);
ÀÌÈÄ »ç¿ëÀÚ°¡ ¿øÇÏ´Â ¹æ¿¡ ÀÔÀåÇÏ°íÀÚ ÀÔÀå󸮸¦ ¿äûÇϸé
user.enterRoom(room); ÀÌ·±½ÄÀ¸·Î ·ë¿¡ ÀÔÀå󸮸¦ ÇÑ´Ù.
enterRoomÀÇ ÇÔ¼ö¿¡´Â
void enterRoom(GameRoom room){
this.gameRoom = room;
}
ÀÌ·±½ÄÀ¸·Î GameUser°¡ °¡Áö°í ÀÖ´Â GameRoom°´Ã¼¸¦ º¹»çÇØÁØ´Ù.
ȤÀº »õ·Î¿î ¹æÀ» »ý¼ºÇÏ°íÀÚ ÇÏ´Â ¿äûÀ» ¹Þ´Â´Ù¸é
--¸ÞÀÎŬ·¡½º--
RoomManager roomManger = new RoomManager(); // Ŭ·¡½º ½ÃÀÛ ½Ã Çѹø¸¸ »ý¼ºÇØ¾ß ÇÑ´Ù.
GameUser user = new GameUser(socket);
GameRoom room = new GameRoom();
user.enterRoom(room);
room.enterUser(user);
roomManager.createRoom(room);
ÀÌ·±½ÄÀ¸·Î ¸¸µé¸é µÉ °Í °°´Ù.
Áß¿äÇÑÁ¡Àº Room <-> User °£ ¼·Î »óÈ£ÂüÁ¶¸¦ ÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù´Â Á¡ÀÌ°í,
RoomManager´Â RoomÀÇ ¸®½ºÆ®¸¦,
GameRoomÀº UserÀÇ ¸®½ºÆ®¸¦,
°¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
¿¹Á¦Äڵ带 º¸µµ·Ï ÇÏÀÚ.
ÀÌ·±½ÄÀ¸·Î °£´ÜÇÏ°Ô ¼¼°¡Áö ÄÉÀ̽º¸¦ ´ë»óÀ¸·Î »ùÇÃÄڵ带 ¸¸µé¾îºÃ´Ù.
À§¿¡ ¾ð±ÞÇÑ´ë·Î, Room°ú User°£ ¼·Î »óÈ£ÂüÁ¶¸¦ ÇÏ°í ÀÖÀ¸¸é ½±°Ô À¯Àú¿Í ·ë¿¡ Á¢±ÙÇÒ ¼ö°¡ ÀÖ´Ù.
»ùÇà ÇÁ·ÎÁ§Æ®ÀÇ ±¸¼ºÀº ³×°³ÀÇ Å¬·¡½º·Î ±¸¼ºÀ» Çß´Ù.
ÀÌ·±½ÄÀ¸·Î ¿ª½Ã ÇÑ ÆÐÅ°Áö ³»¿¡ ¹¾î¼ ÀÛ¼ºÀ» ÇÏ¸é µÈ´Ù.
¸Å¿ì ±âÃÊÀûÀÎ ±â´É¸¸ ´ã¾Ò±â ¶§¹®¿¡ ÇÊ¿äÇÑ ±â´ÉÀÌ ÀÖ´Ù¸é Ãß°¡Çؼ »ç¿ëÇÏ¸é µÉ °Í °°´Ù
ÀÌÁ¦ °ÔÀÓ·ë ±¸Á¶, ÇÁ·ÎÅäÄÝ ±¸Á¶¿¡ ´ëÇÑ Æ÷½ºÆÃÀ» ¿Ï·áÇ߱⠶§¹®¿¡
ÃßÈÄ¿¡ ÀÛ¼ºµÉ Æ÷½ºÆÃÀº "ºñµ¿±â JAVA ³×Æ®¿öÅ©" ¿¡ ´ëÇØ Æ÷½ºÆà ÇÏ°íÀÚ ÇÑ´Ù.
±×¸®°í ÃÖÁ¾ÀûÀ¸·Î ¾Õ¼± Æ÷½ºÆõéÀ» ¸ðµÎ ÀÌ¿ëÇÑ °£´ÜÇÑ »ùÇà ³×Æ®¿öÅ© ÇÁ·Î±×·¥À» ¸¸µå´Â °ÍÀÌ ¸ñÀûÀÌ´Ù.
Á¢±â
/*
* Author : Gompang
* Desc : ³×Æ®¿öÅ© °ÔÀÓ¿¡¼ »ç¿ëµÇ´Â(äÆõµ Æ÷ÇÔ) ¹æ °³³ä Ŭ·¡½º
* Blog : http://gompangs.tistory.com/
*/
package GameRoomPkg;
import java.util.ArrayList;
import java.util.List;
public class GameRoom {
private int id; // ·ë ID
private List userList;
private GameUser roomOwner; // ¹æÀå
private String roomName; // ¹æ À̸§
public GameRoom(int roomId) { // ¾Æ¹«µµ ¾ø´Â ¹æÀ» »ý¼ºÇÒ ¶§
this.id = roomId;
userList = new ArrayList();
}
public GameRoom(GameUser user) { // À¯Àú°¡ ¹æÀ» ¸¸µé¶§
userList = new ArrayList();
user.enterRoom(this);
userList.add(user); // À¯Àú¸¦ Ãß°¡½ÃŲ ÈÄ
this.roomOwner = user; // ¹æÀåÀ» À¯Àú·Î ¸¸µç´Ù.
}
public GameRoom(List users) { // À¯Àú ¸®½ºÆ®°¡ ¹æÀ» »ý¼ºÇÒ
this.userList = users; // À¯Àú¸®½ºÆ® º¹»ç
// ·ë ÀÔÀå
for(GameUser user : users){
user.enterRoom(this);
}
this.roomOwner = userList.get(0); // ù¹ø° À¯Àú¸¦ ¹æÀåÀ¸·Î ¼³Á¤
}
public void enterUser(GameUser user) {
user.enterRoom(this);
userList.add(user);
}
public void enterUser(List users) {
for(GameUser gameUser : users){
gameUser.enterRoom(this);
}
userList.addAll(users);
}
/**
* ÇØ´ç À¯Àú¸¦ ¹æ¿¡¼ ³»º¸³¿
* @param user ³»º¸³¾ À¯Àú
*/
public void exitUser(GameUser user) {
user.exitRoom(this);
userList.remove(user); // ÇØ´ç À¯Àú¸¦ ¹æ¿¡¼ ³»º¸³¿
if (userList.size() < 1) { // ¸ðµç ÀοøÀÌ ´Ù ¹æÀ» ³ª°¬´Ù¸é
RoomManager.removeRoom(this); // ÀÌ ¹æÀ» Á¦°ÅÇÑ´Ù.
return;
}
if (userList.size() < 2) { // ¹æ¿¡ ³²Àº ÀοøÀÌ 1¸í ÀÌÇ϶ó¸é
this.roomOwner = userList.get(0); // ¸®½ºÆ®ÀÇ Ã¹¹ø° À¯Àú°¡ ¹æÀåÀÌ µÈ´Ù.
return;
}
}
/**
* ÇØ´ç ·ëÀÇ À¯Àú¸¦ ´Ù ÅðÀå½ÃÅ°°í »èÁ¦ÇÔ
*/
public void close() {
for (GameUser user : userList) {
user.exitRoom(this);
}
this.userList.clear();
this.userList = null;
}
// °ÔÀÓ ·ÎÁ÷
/**
* ÇØ´ç byte ¹è¿À» ¹æÀÇ ¸ðµç À¯Àú¿¡°Ô Àü¼Û
* @param data º¸³¾ data
*/
public void broadcast(byte[] data) {
for (GameUser user : userList) { // ¹æ¿¡ ¼ÓÇÑ À¯ÀúÀÇ ¼ö¸¸Å ¹Ýº¹
// °¢ À¯Àú¿¡°Ô µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â ¸Þ¼µå È£Ãâ~
// ex) user.SendData(data);
// try {
// user.sock.getOutputStream().write(data); // ÀÌ·±½ÄÀ¸·Î ¹ÙÀÌÆ®¹è¿À» º¸³½´Ù.
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
public void setOwner(GameUser gameUser) {
this.roomOwner = gameUser; // ƯÁ¤ »ç¿ëÀÚ¸¦ ¹æÀåÀ¸·Î º¯°æÇÑ´Ù.
}
public void setRoomName(String name) { // ¹æ À̸§À» ¼³Á¤
this.roomName = name;
}
public GameUser getUserByNickName(String nickName) { // ´Ð³×ÀÓÀ» ÅëÇؼ ¹æ¿¡ ¼ÓÇÑ À¯Àú¸¦ ¸®ÅÏÇÔ
for (GameUser user : userList) {
if (user.getNickName().equals(nickName)) {
return user; // À¯Àú¸¦ ã¾Ò´Ù¸é
}
}
return null; // ã´Â À¯Àú°¡ ¾ø´Ù¸é
}
public GameUser getUser(GameUser gameUser) { // GameUser °´Ã¼·Î get
int idx = userList.indexOf(gameUser);
// À¯Àú°¡ Á¸ÀçÇÑ´Ù¸é(gameUserÀÇ equals·Î ºñ±³)
if(idx > 0){
return userList.get(idx);
}
else{
// À¯Àú°¡ ¾ø´Ù¸é
return null;
}
}
public String getRoomName() { // ¹æ À̸§À» °¡Á®¿È
return roomName;
}
public int getUserSize() { // À¯ÀúÀÇ ¼ö¸¦ ¸®ÅÏ
return userList.size();
}
public GameUser getOwner() { // ¹æÀåÀ» ¸®ÅÏ
return roomOwner;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List getUserList() {
return userList;
}
public void setUserList(List userList) {
this.userList = userList;
}
public GameUser getRoomOwner() {
return roomOwner;
}
public void setRoomOwner(GameUser roomOwner) {
this.roomOwner = roomOwner;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GameRoom gameRoom = (GameRoom) o;
return id == gameRoom.id;
}
@Override
public int hashCode() {
return id;
}
}
Á¢±â
Á¢±â
/*
* Author : Gompang
* Desc : ³×Æ®¿öÅ© °ÔÀÓ¿¡¼ »ç¿ëµÇ´Â(äÆõµ Æ÷ÇÔ) ¹æ °³³ä Ŭ·¡½º
* Blog : http://gompangs.tistory.com/
*/
package GameRoomPkg;
import java.net.Socket;
// ½ÇÁ¦·Î °ÔÀÓÀ» Ç÷¹ÀÌÇÏ´Â À¯ÀúÀÇ Å¬·¡½ºÀÌ´Ù.
public class GameUser {
private int id; // Unique ID
private GameRoom room; // À¯Àú°¡ ¼ÓÇÑ ·ëÀÌ´Ù.
private Socket sock; // ¼ÒÄÏ object
private String nickName; // ´Ð³×ÀÓ
// °ÔÀÓ¿¡ °ü·ÃµÈ º¯¼ö ¼³Á¤
// ...
//
private PlayerGameInfo.Location playerLocation; // °ÔÀÓ Á¤º¸
private PlayerGameInfo.Status playerStatus; // °ÔÀÓ Á¤º¸
public GameUser() { // ¾Æ¹«·± Á¤º¸°¡ ¾ø´Â ±øÅë À¯Àú¸¦ ¸¸µé ¶§
}
/**
* À¯Àú »ý¼º
* @param nickName ´Ð³×ÀÓ
*/
public GameUser(String nickName) { // ´Ð³×ÀÓ Á¤º¸¸¸ °¡Áö°í »ý¼º
this.nickName = nickName;
}
/**
* À¯Àú »ý¼º
* @param id ID
* @param nickName ´Ð³×ÀÓ
*/
public GameUser(int id, String nickName) { // UID, ´Ð³×ÀÓ Á¤º¸¸¦ °¡Áö°í »ý¼º
this.id = id;
this.nickName = nickName;
}
/**
* ¹æ¿¡ ÀÔÀå½ÃÅ´
* @param room ÀÔÀåÇÒ ¹æ
*/
public void enterRoom(GameRoom room) {
room.enterUser(this); // ·ë¿¡ ÀÔÀå½ÃŲ ÈÄ
this.room = room; // À¯Àú°¡ ¼ÓÇÑ ¹æÀ» ·ëÀ¸·Î º¯°æÇÑ´Ù.(Áß¿ä)
}
/**
* ¹æ¿¡¼ ÅðÀå
* @param room ÅðÀåÇÒ ¹æ
*/
public void exitRoom(GameRoom room){
this.room = null;
// ÅðÀåó¸®(ȸ鿡 ¸Þ¼¼Áö¸¦ Áشٴ µî)
// ...
}
public void setPlayerStatus(PlayerGameInfo.Status status) { // À¯ÀúÀÇ »óŸ¦ ¼³Á¤
this.playerStatus = status;
}
public void setPlayerLocation(PlayerGameInfo.Location location) { // À¯ÀúÀÇ À§Ä¡¸¦ ¼³Á¤
this.playerLocation = location;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public GameRoom getRoom() {
return room;
}
public void setRoom(GameRoom room) {
this.room = room;
}
public Socket getSock() {
return sock;
}
public void setSock(Socket sock) {
this.sock = sock;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public PlayerGameInfo.Location getPlayerLocation() {
return playerLocation;
}
public PlayerGameInfo.Status getPlayerStatus() {
return playerStatus;
}
/*
equals¿Í hashCode¸¦ override ÇØÁà¾ß, µ¿ÀÏÀ¯Àú¸¦ ºñ±³ÇÒ ¼ö ÀÖ´Ù
ºñ±³ÇÒ ¶§ -> gameUser °£ equals ºñ±³, list¿¡¼ find µî
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GameUser gameUser = (GameUser) o;
return id == gameUser.id;
}
@Override
public int hashCode() {
return id;
}
}
Á¢±â
Á¢±â
/*
* Author : Gompang
* Desc : ³×Æ®¿öÅ© °ÔÀÓ¿¡¼ »ç¿ëµÇ´Â(äÆõµ Æ÷ÇÔ) ¹æ °³³ä Ŭ·¡½º
* Blog : http://gompangs.tistory.com/
*/
package GameRoomPkg;
// À¯ÀúÀÇ »óÅ ¹× ÇöÀç À§Ä¡ÇÏ°í ÀÖ´Â Àå¼Ò¸¦ ÁöÁ¤Çϱâ À§ÇÑ Enum Class
public class PlayerGameInfo {
enum Location {
MAP_1, MAP_2, MAP_3, MAP_4, MAP_5
};
enum Status {
IDLE, BATTLE, DEAD
};
}
Á¢±â
Á¢±â
/*
* Author : Gompang
* Desc : ³×Æ®¿öÅ© °ÔÀÓ¿¡¼ »ç¿ëµÇ´Â(äÆõµ Æ÷ÇÔ) ¹æ °³³ä Ŭ·¡½º
* Blog : http://gompangs.tistory.com/
*/
package GameRoomPkg;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class RoomManager {
private static List roomList; // ¹æÀÇ ¸®½ºÆ®
private static AtomicInteger atomicInteger;
static {
roomList = new ArrayList();
atomicInteger = new AtomicInteger();
}
public RoomManager() {
}
/**
* ºó ·ëÀ» »ý¼º
* @return GameRoom
*/
public static GameRoom createRoom() { // ·ëÀ» »õ·Î »ý¼º(ºó ¹æ)
int roomId = atomicInteger.incrementAndGet();// room id ä¹ø
GameRoom room = new GameRoom(roomId);
roomList.add(room);
System.out.println("Room Created!");
return room;
}
/**
* ¹æÀ» »ý¼ºÇÔ°ú µ¿½Ã¿¡ ¹æÀåÀ» ¸¸µé¾îÁÜ
* @param owner ¹æÀå
* @return GameRoom
*/
public static GameRoom createRoom(GameUser owner) { // À¯Àú°¡ ¹æÀ» »ý¼ºÇÒ ¶§ »ç¿ë(À¯Àú°¡ ¹æÀåÀ¸·Î µé¾î°¨)
int roomId = atomicInteger.incrementAndGet();// room id ä¹ø
GameRoom room = new GameRoom(roomId);
room.enterUser(owner);
room.setOwner(owner);
roomList.add(room);
System.out.println("Room Created!");
return room;
}
/**
* À¯Àú ¸®½ºÆ®·Î ¹æÀ» »ý¼º
* @param users ÀÔÀå½Ãų À¯Àú ¸®½ºÆ®
* @return GameRoom
*/
public static GameRoom createRoom(List users) {
int roomId = atomicInteger.incrementAndGet();// room id ä¹ø
GameRoom room = new GameRoom(roomId);
room.enterUser(users);
roomList.add(room);
System.out.println("Room Created!");
return room;
}
public static GameRoom getRoom(GameRoom gameRoom){
int idx = roomList.indexOf(gameRoom);
if(idx > 0){
return roomList.get(idx);
}
else{
return null;
}
}
/**
* Àü´Þ¹ÞÀº ·ëÀ» Á¦°Å
* @param room Á¦°ÅÇÒ ·ë
*/
public static void removeRoom(GameRoom room) {
room.close();
roomList.remove(room); // Àü´Þ¹ÞÀº ·ëÀ» Á¦°ÅÇÑ´Ù.
System.out.println("Room Deleted!");
}
/**
* ¹æÀÇ ÇöÀç Å©±â¸¦ ¸®ÅÏ
* @return ÇöÀç size
*/
public static int roomCount() {
return roomList.size();
}
}
Á¢±â
Á¢±â
package game.room.test;
import GameRoomPkg.GameRoom;
import GameRoomPkg.GameUser;
import GameRoomPkg.RoomManager;
public class GameRoomTest {
public void roomCreateTest(){
// #1. À¯Àú ·Î±×ÀÎ
GameUser gameUser = new GameUser(1, "gompang");
GameUser gameUser2 = new GameUser(2, "apple");
GameUser gameUser3 = new GameUser(3, "banana");
// #2. ƯÁ¤ À¯Àú°¡ ¹æÀ» ¸¸µå·Á°í ÇÔ
GameRoom gameRoom = RoomManager.createRoom(gameUser);
// #3. ±× ¹æ¿¡ ³ª¸ÓÁö À¯Àú°¡ µé¾î°¡·Á°í ÇÔ
gameRoom.enterUser(gameUser2);
gameRoom.enterUser(gameUser3);
// -- ·ÎÁ÷ ÁøÇà~ °ÔÀÓ, äÆà µî --
// #4. À¯Àú°¡ ¹æ¿¡¼ ³ª°¨
gameRoom.exitUser(gameUser2);
// #5. ¹æÀåÀÌ ¹æ¿¡¼ ³ª°¨ -> gameUser3ÀÌ ¹æÀåÀÌ µÊ
gameRoom.exitUser(gameUser);
// #6. gameUser3ÀÌ ¹æ¿¡¼ ³ª°¨ -> size°¡ 0ÀÌ µÇ¸é¼ ¹æÀÌ ¾ø¾îÁü
gameRoom.exitUser(gameUser3);
// #7. ¾Æ·¡ °á°ú´Â null ÀÌ°ÚÁö
GameRoom room = RoomManager.getRoom(gameRoom);
if(room != null){
System.out.println("¹æÀÌ ¾ÆÁ÷ ÀÖ³×");
}
else{
System.out.println("¹æÀÌ ¾ø¾îÁ³³×");
}
}
public void roomTest(){
// #1. À¯Àú ·Î±×ÀÎ
GameUser gameUser = new GameUser(1, "gompang");
GameUser gameUser2 = new GameUser(2, "apple");
GameUser gameUser3 = new GameUser(3, "banana");
// #2. ƯÁ¤ À¯Àú°¡ ¹æÀ» ¸¸µå·Á°í ÇÔ
GameRoom gameRoom = RoomManager.createRoom(gameUser);
// #3. ±× ¹æ¿¡ ³ª¸ÓÁö À¯Àú°¡ µé¾î°¡·Á°í ÇÔ
gameRoom.enterUser(gameUser2);
gameRoom.enterUser(gameUser3);
// -- ¹æ ¸ðµçÀ¯Àú¿¡°Ô µ¥ÀÌÅÍ Àü¼Û --
byte[] data = "¹æ À¯Àú¿¡°Ô broadcastÇÒ µ¥ÀÌÅÍ".getBytes();
gameRoom.broadcast(data);
// #4. ´©±º°¡°¡ gompangÀ̶ó´Â ´Ð³×ÀÓÀ¸·Î ¹æÀÇ À¯Àú¸¦ °Ë»öÇÔ(±Ó¼Ó¸», °Å·¡ µîÀÇ ¸ñÀûÀ¸·Î)
GameUser gompang = gameRoom.getUserByNickName("gompang");
// #5. ¼¹ö¿¡¼ ¹«¾ð°¡ÀÇ ÀÌÀ¯·Î gameRoomÀ» »èÁ¦ÇÔ(¸ðµç À¯Àú ÅðÀåó¸®)
RoomManager.removeRoom(gameRoom);
}
}
Á¢±â
* p.s
2017.11.30 ¼öÁ¤
- ¸¹Àº ºÐµéÀÌ test class¸¦ Á» ´Þ¶ó°í Çϼż.. °£¸¸¿¡ ¼Ò½ºÄÚµå Á» º¸°í ÆĶó¹ÌÅÍ¿Í Å¬·¡½º µîÀ» Á¤¸®Çؼ ¼öÁ¤.
- test class Ãß°¡
- ¼¼»ó¿¡³ª Äڵ尡 ¾ÆÁÖ ¾²·¹±â¿´½À´Ï´Ù. (Á˼ÛÇÕ´Ï´Ù) ÀÌÁ¨ ¿Ïº®ÇÏÁø ¸øÇصµ ±âº»±â´ÉÀº ÇÏ´Â ÄÚµå´Ï Âü°íÇϽñ⠹ٷ¡¿ä