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

JAVA

[마피아] Start Sequence

shinyunha 2025. 11. 21. 22:33

Tag: "Start:"

Sequence Diagram

 

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