투표는 밤과 유사하게 진행된다. 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 |