직업 배정 문제를 해결했다.
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 |