티스토리 뷰


이번 포스팅에서는

방에 입장하는 기능을 응용하여

사용자가 들어갈 수 있는 방중에서

아무방이나 랜덤으로 들어갈 수 있도록 해주는

빠른입장 기능을 설계해보겠습니다.


======================================================================


Rhythm Game : Quick Enter Room





1. Rhythm Game : Quick Enter Room


  빠른입장을 구현하기 위해서는 어떤 방식으로 설계해야할지 생각해보아야합니다.


 저는 빠른입장 버튼을 누르는 것이 사용자가 특정 방 버튼을 누르는 것과 같다는 것에 착안하여 설계하였습니다. 

사용자의 방 입장 기능을 설계할 때 해당 방 버튼을 클라이언트로 전송하여 방에 입장할 수 있는지 없는지 판단하는 방식이였습니다.

때문에 빠른입장에서는 해당 인덱스를 서버에서 프로그램 자체적으로 임의로 결정하여 클라이언트에게 해당 방을 넘겨주고 클라이언트는 해당 방을 출력할 수 있도록 설계할 수 있습니다.





2. Rhythm Game : ClientUI.java


 그럼 일단 빠른 시작을 눌렀을 때 리스너가 호출되도록 해야합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package client;
 
import java.awt.event.ActionListener;
 
    ...
 
public class ClientUI extends JFrame{
    
    ...
 
    private void addListeners() {
        
        ...
        
        ActionListener bqrh =  new BtQuickRoomHandler(this);
        pnRoom.btQuickStart.addActionListener(bqrh);
    }
    
    ...
 
}
 
cs






3. Rhythm Game : BtQuickRoomHandler.java


 이제 리스너가 동작할 기능을 설계해야합니다.

클라이언트에서 서버로 정해진 idx 없이 '방을 들어가고 싶다' 라는 요청만 주면 되기 때문에 ClientNetwork에서 서버로 요청만 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package handler;
 
import java.awt.event.ActionEvent;
 
    ...
 
public class BtQuickRoomHandler implements ActionListener {
    ClientUI ui;
    public BtQuickRoomHandler(ClientUI c) {
        ui = c;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        ui.net.sendQuickRoomRequest();
    }
    
}
 
cs






4. Rhythm Game : ClientNetwork.java


 'QuickRoom' 키워드로 서버로 요청을 전송하게 됩니다. 이때 서버로부터 받는 요청에 대한 결과 값은 Integer 값으로 설계할 것입니다.

서버에서 들어갈수 있는 방을 찾아 해당 방의  idx를 클라이언트에게 전송해주게 되는 것입니다. 이때 입장할 수 있는 방이 없다면 idx는 음수일 것입니다.

방에 입장할 수 있다면 그 다음 동작은 사용자가 방을 선택해 방에 입장할 때의 동작과 일치할 것입니다. 때문에 해당 방의 idx를 얻어와 다시 방 입장를 위한 메소드를 사용하여 동작하도록 설계한 것입니다.


결국 내부적으로는 사용자가 방을 클릭했을 때의 동작이 중복되는데 사용자에게 보여지는 것은 자동으로 방을 입장하는 것으로 보여지는 것이죠.


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
package client;
 
import java.io.IOException;
 
    ...
 
public class ClientNetwork extends Thread {
    
    ...
    
    // 빠른 입장 요청
    public void sendQuickRoomRequest() {
        synchronized (oos) {
            try {
                oos.writeObject("QuickRoom");
                int resp = (Integer)ois.readObject();
                if(resp<0) {
                    JOptionPane.showMessageDialog(ui, "현재 참가할 방이 없습니다.");
                } else {
                    sendEnterRoomRequest(resp);
                }
            } catch (Exception e) {
                System.out.println(e.toString());
            }
        }
    }
}
cs






5. Rhythm Game : PersonalServer.java


 이제 서버에서 키워드를 받아 동작하는 것을 설계하면 됩니다.


먼저 유저가 들어갈 방의 idx를 뽑아내야하는데 idx를 뽑아내기 위한 조건을 생각해야합니다.

 1) 방에 사람이 가득차있지않아야한다.

 2) 1인용 방이면 안된다.

 3) 비밀번호 방이 아니어야한다..


때문에 위의 조건에 따라 if문으로 방의 목록에서 해당하는 방만 따로 List로 만듭니다.

이때 만든 List의 size가 0이라면 들어갈 수 있는 방이 없다는 것이기 때문에 클라리언트에게 -1의 Integer를 보내는 것입니다.

만약 List의 size가 0이 아니라면 List의 사이즈에서 랜덤으로 숫자를 뽑아 해당 idx를 클라이언트에게 전송하는 것입니다.


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
32
33
34
35
36
37
38
39
40
41
package server;
 
import java.io.IOException;
 
    ...
 
public class PersonalServer extends Thread {
    
    ...
 
    @Override
    public void run() {
        String[] command = null;
        while(socket.isConnected()) {
            
            ...
 
            switch(command[0]) {
                
                ...
 
                case "QuickRoom":    // 빠른 입장
                    List<Room> cur = new ArrayList<>(); 
                    for(Room s : rooms) {
                        if(s.getPass().equals(""&& s.getJoiner().size() != 2 && s.isTwoUserRoom()) {
                            cur.add(s);
                        }
                    }
                    if(cur.isEmpty()) {
                        resp = -1;
                        sendToClient(resp);
                    } else {
                        int ran = (int)(Math.random()*cur.size());
                        int d = rooms.indexOf(cur.get(ran));
                        sendToClient(d);
                    }
                    break;
            }
        }
    }
}
cs



위와 같이 설계한다면 기존에 만들었던 방 입장 기능의 앞 부분에 빠른 입장을 위한 기능 조금만 추가하는 것으로 방 입장 기능을 재활용하여 간단하여 구현할 수 있습니다.




## 빠른입장 기능에 대한 클래스 동작 흐름.


(Client) 빠른입장 버튼 클릭시 리스너(BtQuickRoomHandler) 호출 -> ClientNetwork에서 'QuickRoom' 키워드를 서버로 전송 

     -> (Server) 현재 만들어져 있는 방의 목록에서 들어갈 수 있는 방만 뽑아냄.

-> 들어갈 수 있는 방이 없다면 클라이언트에게 -1 데이터 전송

-> (Client) 다이얼로그로 입장가능한 방이 없다고 출력

-> 들어갈 수 있는 방이 있다면 방 중에서 랜덤으로 idx를 뽑아 클라이언트로 전송

-> (Client) 받은 idx를 가지고 기존에 설계한 방 입장을 위한 메소드 호출




'Project > Java를 이용한 게임 프로그램 구현' 카테고리의 다른 글

9. Rhythm Game : Enter Room  (0) 2018.12.04
8. Rhythm Game : Create Room  (0) 2018.12.03
7. Rhythm Game : LoginUserList  (0) 2018.12.03
6. Rhythm Game : Login  (0) 2018.11.30
5. Rhythm Game : Signup  (0) 2018.11.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/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
글 보관함