Tag: "Start:"

1. 사용자가 "시작하기" 버튼 클릭
2. Lobby가 "Start:" 메시지를 ClientManager에게 전달
//시작하기 버튼 누르면
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Start 시퀀스 시작
clientManager.sendMessage("Start:");
}
});
Lobby
3. ClientManager는 메시지를 ClientThread를 거쳐서 OutputThread를 통해 Server에게 보낸다.
4. Server는 ServerThread로 메시지를 받아와서 CommandManager로 "Start:"임을 감지하고 사회자에게는 게임을 시작하라고 지시, 모든 클라이언트들에게 "Start:" 메시지를 BroadCasting한다.
else {
// Start 명령어일 시 모든 클라이언트에게 게임이 시작되었다고 알려주기.
logicBrain.init_game();
broadcastAll("Start:");
}
5-1. BroadCasting된 "Start:" 메세지를 받은 ClientManager는 Lobby를 View로 전환한다.
// Case 2: 게임 시작 (서버가 "Start:"를 보냄)
else if (message.startsWith("Start:")) {
// 로비 화면을 게임 화면으로 전환
lobby.start();
}
ClientManager
//Start 시퀀스의 끝
public void start() {
setView(new View());
getView().setVisible(true);
dispose();
}
Lobby
5-2. 사회자는 RoleFactory를 통해 플레이어들에게 직업을 배정한다.
//Start 받으면
public void init_game() {
System.out.println("=====마피아 게임 시작=====");
roleFactory.randomRole(players);
//배정한 직업을 각 사용자 화면에 보여줘야 하는데 이 부분을 아직 해결하지 못했다
}
사회자
public void randomRole(List <Player> players) {
/*인원 수에 따라 의사, 경찰 1로 고정, 마피아는 4-1, 5-2, 6-2
* 4명:마피아1,시민1,의사1,경찰1,
* 5명:마피아2,시민1,의사1,경찰1,
* 6명:마피아2,시민2,의사1,경찰1
*/
List <String> roles = new ArrayList<>();
int n = players.size();
//n나누기3 반올림하면 마피아수
int numMafia = (int)Math.round(n/3.0);
for(int i=0; i<numMafia; i++) {
roles.add("mafia");
}
roles.add("doctor");
roles.add("police");
//나머지 시민
int numCitizen = n - roles.size();
for(int i=0; i<numCitizen; i++) {
roles.add("citizen");
}
//직업 랜덤 섞기
//역할 리스트 roles를 완전히 뒤섞음. 피셔-예이츠 알고리즘?
Collections.shuffle(roles);
//플레이어들에게 역할 배정 스킬 배정
for(int i=0; i<n; i++) {
Player p = players.get(i);
String role = roles.get(i);//섞인 역할 배분
p.setRole(role);
switch(role) {
case "mafia":
p.skill = new Kill();
break;
case "doctor":
p.skill = new Heal();
break;
case "police":
p.skill = new Inspect();
break;
default:
p.skill = null;
}
}
}
RoleFactory
남아있는 문제
배정한 직업을 각 사용자 화면에 보여줘야 한다. 즉 각 클라이언트의 View마다 다른 화면이 나와야한다.
현재는 사회자의 init_game()에서 하려고 했다.
근데 화면에 안 나온다. 이것저것 찍어봤는데, LobbyList 들어간 for문부터 안 돈다. 의심되는 문제는 각 사용자들이 각자의 ClientManager를 생성해서 가지고 있는 게 아니라 하나의 ClientManager를 공유하고 있는 것 같다. 아니 싱글톤도 아닌데 왜!!!!!!!
연결 성공해서 화면 동기화 되는 거 보고 팀원들이 다 소리지르고 엄청 신났었는데.....다른 문제가 발생했다...ㅎ
뭐가 문제인지도 몰라서 더 문제이다.
for (Player player : players) {
for (Lobby lobby : lobbyList) {
if(lobby.getClientManager().getMyName().equals(player.nickname)){
lobby.getView().setRoleView(player.getRole());
System.out.println("직업 배정 완료");
}
}
}
사회자의 init_game()
//사용자의 role에 따라 다르게 나와야함
public void setRoleView(String role) {
roleImage = new JLabel();
roleImage.setIcon(new ImageIcon(View.class.getResource("/image/" + role + ".png")));
roleImage.setBounds(817, 343, 127, 127);
contentPane.add(roleImage);
roleName = new JLabel(role);
roleName.setHorizontalAlignment(JLabel.CENTER);
roleName.setBounds(817, 480, 127, 15);
contentPane.add(roleName);
contentPane.repaint();
}
View에 만들어둔 함수
'JAVA' 카테고리의 다른 글
| [마피아] Role (0) | 2025.12.01 |
|---|---|
| [JAVA] Spring Boot - 2 (0) | 2025.11.25 |
| [마피아] Join Sequence (0) | 2025.11.21 |
| [JAVA] Spring Boot - 1 (0) | 2025.11.18 |
| [JAVA] DB (0) | 2025.11.16 |