교수님이 쓰라고 하셔서 쓰는 그런데 은근 재밌는 듯

JAVA

[마피아] Role

shinyunha 2025. 12. 1. 22:27

직업 배정 문제를 해결했다.

2주쯤 걸렸다. 정말 별 걸 다 시도해봤다.

결국 처음으로 돌아와서 Join,Start와 같은 방식으로 직업 배정 결과를 View에 적용하기로 했다. 

 

원래는 사회자가 lobby.getView().setRoleView(player.getRole()); 이렇게 직접 View를 변경하려고 했다. 그런데 LobbyList에 lobby가 들어가질 않았다. 넣을 때는 잘 넣었다고 출력되면서 꺼낼 때는 아무것도 없다고 나왔다. 미칠 것 같았다.

 

시행착오

1. setLobby 위치가 잘못된 줄 알았다. 수정해도 결과는 달라지지 않았다.

 

2. ClientManager가 하나인지 의심했다. 아니었다.

 

3. 싱글톤이 제대로 구현되지 않았는지 의심했다. 아니었다. 

 

4. 사회자가 Lobby를 소유하면 안되나 싶어서 ClinetManagerList를 소유하게 했다. 결과는 같았다. 


해결방법

"Role:" Tag를 추가했다.

 

1. 사회자가 직업을 배정한 후 각 사용자의 ServerThread에

"Role:" "Skill:" "Players:" Tag를 달아서 배정된 직업, skill, 모든 사용자의 ID와 닉네임을 전송

roleFactory.randomRole(players);
		
for(Player player : players) {
    ServerThread thread = player.getServerThread();
    thread.sendMessage("Role:"+player.getRole());
    thread.sendMessage("Skill:"+player.getSkillName());
    thread.sendMessage("Players:"+playersMessage());
}

//플레이어 리스트를 String으로 만들기 위한 함수
public String playersMessage() {
    String playerList = "";
    for (Player player : players) {
        playerList = playerList + player.id +" " + player.nickname + ";";
    }
    return playerList;
}

사회자

 

2. ClientManager가 받아서 처리 후 View 함수 호출

// Case 3: 직업 배정 (사회자가 "Role:직업"을 보냄)
else if (message.startsWith("Role:")) {
    String role = message.substring(5);
    System.out.println("내 역할: "+role);
    lobby.getView().setRoleView(role);

    // 직업이 마피아면 마피아 채팅창 따로 또 띄우기
    if ("mafia".equals(role)) { // 문자열 비교 주의 ("mafia"인지 "MAFIA"인지 서버랑 맞추세요)
        if (mafiaChatView == null) {
            mafiaChatView = new MafiaChatView(this);
            mafiaChatView.setVisible(true);
        }
    }
}
else if (message.startsWith("Skill:")) {
    String skill = message.substring(6);
    System.out.println("내 역할: "+skill);
    lobby.getView().setSkillButton(skill);
}

//Case 4: playerList 처리
else if (message.startsWith("Players:")) {
    String playersMessage = message.substring(8);
    String[] playersMessageSplit = playersMessage.split(";");

    DefaultListModel<String> players = new DefaultListModel<String>();
    for (String string : playersMessageSplit) {
        players.addElement(string);
    }

    lobby.getView().setPlayersModel(players);
}

ClientManager

 

3. View의 함수들

// 사용자의 role에 따라 다르게 나와야함. 예외처리는 throws로 .
public void setRoleView(String role) throws IOException {
    roleImage = new JLabel();
    roleImage.setIcon(new ImageIcon(View2.class.getResource("/image/" + role + ".png")));
    roleImage.setBounds(817, 343, 127, 127);
    contentPane.add(roleImage);

    /////////////////////////////////////////////////
    img = ImageIO.read(View2.class.getResource("/image/" + role + ".png"));
    bgPanel.setSourceImage(img); // 이미지 교체 반영하기!

    roleName = new JLabel(role);
    roleName.setHorizontalAlignment(JLabel.CENTER);
    roleName.setBounds(817, 480, 127, 15);
    contentPane.add(roleName);
    contentPane.repaint();

}

public void setSkillButton(String skill) {
    skillButton = new JButton(skill);
    skillButton.setBounds(863, 508, 91, 21);
    contentPane.add(skillButton);

    contentPane.repaint();
}

public void setPlayersModel(DefaultListModel<String> players) {
    this.players = players;
    playerList.setModel(players);
}

View

'JAVA' 카테고리의 다른 글

[마피아] 밤  (0) 2025.12.02
[마피아] Message  (0) 2025.12.02
[JAVA] Spring Boot - 2  (0) 2025.11.25
[마피아] Start Sequence  (0) 2025.11.21
[마피아] Join Sequence  (0) 2025.11.21