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

JAVA

[마피아] 투표

shinyunha 2025. 12. 2. 11:13

투표는 밤과 유사하게 진행된다. Tag도 똑같이 "Target:"을 사용한다.

 

1. 투표 제한시간은 30초이다

@Override
public void execute(사회자 매니저) {

    // TODO Auto-generated method stub
    매니저.getCommandManager().broadcastAll("System:"+"투표가 시작되었습니다. 30초 안에 마피아로 의심되는 플레이어의 ID를 입력해주세요");

    try {
        Thread.sleep(30000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    voteResult(매니저);

    // 다음 투표 위해 초기화
    for (int i = 0; i < 매니저.voteResult.size(); i++) {
        매니저.voteResult.set(i, 0);
    }
}

투표

 

2. 사용자들은 voteField에 투표 대상의 고유번호를 입력한다

voteField.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        JTextField input = (JTextField) e.getSource();
        String voteId = input.getText();
        clientManager.sendMessage("Target:" + voteId);
        input.setText("");
    }
});

View

 

3. Socket 통신을 통해 "Target:" Tag를 받은 Target Command가 사회자의 voteResult List에 투표 결과를 저장한다. 

@Override
public void execute(ServerThread sender, String payload, IState currentState) {

    int targetId = Integer.parseInt(payload);
    Player p = sender.getPlayer();

    if(currentState instanceof 밤) {
        if (p != null) {
            if(p.is_alive) {
                p.setNightTargetId(targetId);
                System.out.println("[서버] " + p.nickname + " -> 타겟 " + targetId + " 설정완료");
            }
        }
    }
    else if(currentState instanceof 투표) {
        // 살아있는 플레이어의 투표만 받게 하기.
        if(p.is_alive) {
            logicBrain.voteResult.set(targetId, (logicBrain.voteResult.get(targetId)+1));
        }
    }
}

TargetCommand

 

4. voteResult 함수가 투표 결과를 계산하여 출력한다. 

private void voteResult(사회자 매니저) {
    int max = 0;

    max = Collections.max(매니저.voteResult);
    Integer killedID = 매니저.voteResult.indexOf(max);

    // 최대 득표자수 찾기
    int topCandidates = 0;
    for (int i = 0; i < 매니저.voteResult.size(); i++) {
        if (매니저.voteResult.get(i) == max) {
            topCandidates++; 
        }
    }

    if(max == 0 || topCandidates > 1) {
        매니저.getCommandManager().broadcastAll("System:"+"[투표 결과] 아무도 사망하지 않았습니다.");		
    }
    else {
        Player 사망자 = 매니저.getPlayerById(killedID);
        사망자.is_alive = false;
        매니저.ghosts.add(사망자);
        매니저.getCommandManager().broadcastAll("System:"+"[투표 결과] "+(killedID)+"번 플레이어가 투표로 사망했습니다.");
        //Jlist 업데이트
        매니저.getCommandManager().broadcastAll("List:"+(사망자.id));
    }
}

투표

 

5. 밤에 사망하거나 투표 결과로 사망한 사용자는 채팅이나 스킬 사용, 투표를 하지 못하고 전체 사용자의 View의 player list에서도 회색처리된다. 

playerList.setCellRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
            boolean cellHasFocus) {

        JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,
                cellHasFocus);

        label.setHorizontalAlignment(SwingConstants.CENTER); // 가운데 정렬

        if (deadIndices.contains(index)) {
            label.setForeground(Color.GRAY);
            label.setBackground(new Color(220, 220, 220)); // 흐린 회색 배경
            label.setOpaque(true);
        } else {
            label.setForeground(Color.BLACK);
            label.setBackground(Color.WHITE);
            label.setOpaque(true);
        }
        return label;
    }
});

View

'JAVA' 카테고리의 다른 글

[마피아] 완성  (0) 2025.12.02
[마피아] 밤  (0) 2025.12.02
[마피아] Message  (0) 2025.12.02
[마피아] Role  (0) 2025.12.01
[JAVA] Spring Boot - 2  (0) 2025.11.25