만든이유
어느날 이런글을 보았다 "1부터1000까지의 숫자가있다 1000명에 사람이 게임에 참여한다. 한사람은 하나의 번호를 선택한다. 그후 당첨자에게 상금을 준다 당첨조건은 다음과 같다
1. 선택한사람중 가장낮은수가 당첨된다
2. 2명이상 선택한숫자면 그 이후숫자에게 당첨기회가 넘어간다
당신은 몇번을 선택할것이냐" 이런글이었다
나는 결과가 너무나 궁금했다 그래서 이걸 구현해서 확인해보고싶어져 눈치왕 프로젝트를 시작했다
구현설명
1.진행중인게임 보여주기
2.카카오 api를 활용한 로그인
2.회원가입페이지
카카오에서 이름과 고유id를 가져와 고유ID라는 걸만들어 수정이 불가능하게 만들었다 그리고 닉네임을 입력하지않으면 회원가입을 하지못하게 만들었다. 추후 닉네임 중복확인도 할수있게 만들면 좋을것같다
닉네임에 관리자코드를 입력하면 관리자권한을 얻을수있도록 하였다
3.게임설명페이지
그냥 친구들한테만 배포해볼려고 대충만들었다
5.게임참가
참여인원만큼의 테이블이 있다
선택시 확인alert가 뜨게했다
로그인을 하지않았을때 선택을 하지못하게했다
응모성공 alert
두번 응모는못하게 방지했다
6.당첨자 발표알고리즘
정원이 다차면 자동으로 당첨자 발표알고리즘이 작동하여 당첨자를 알려준다.
@Transactional
public void 당첨자찾기(int gameId,Game game){
List<Info> infos = infoRepository.findByGameId(gameId);
List<Integer> nums = new ArrayList<>();
for(Info i : infos){
nums.add(i.getNumber());
}
// 숫자의 빈도를 저장할 Map 생성
Map<Integer, Integer> frequencyMap = new HashMap<>();
// 배열의 각 숫자의 빈도를 계산
for (int number : nums) {
frequencyMap.put(number, frequencyMap.getOrDefault(number, 0) + 1);
}
// 빈도가 1인 숫자들 중 가장 작은 숫자를 찾음
int winnerNum = Integer.MAX_VALUE;
boolean found = false;
String winnerUsername = null;
for (int number : nums) {
if (frequencyMap.get(number) == 1 && number < winnerNum) {
winnerNum = number;
found = true;
}
}
if(found == false){
game.setWinner(null);
}
else{
for(Info i : infos){
if(i.getNumber()==winnerNum){
winnerUsername = i.getUsername();
break;
}
}
game.setWinner(winnerUsername);
game.setWinnerNumber(winnerNum);
}
System.out.println("우승자: "+winnerUsername);
System.out.println("우승번호: "+winnerNum);
}
7.끝난게임보여주기
당첨자가 나온게임은 당첨내역으로 이동하여 결과를 볼수있게 하였다
8.게임결과보여주기
0명이선택한거랑 한명이상이 선택한것의 색깔을 다르게하여 보기좋게 해놓았다 이게임에서는 모두 중복을 입력하여 당첨자가 안나왔다
당첨자가 나온 번호는 노란색으로 보이게 해놓았다
한명 이상선택한것의 테이블을 클릭하면 모달창이 뜨면서 누가 언제 선택했는지 볼수있게해놓았다
9.관리자페이지 , 10.게임생성하기
관리자권한을 얻은 아이디로 접속하면 상단에 관리자페이지 버튼이 보인다 그 버튼을 누르면 관리자페이지를 볼수있게해놓았다 일반유저가 url로 접속할려해도 접속을 못하게해놓았다. 관리자페이지에서는 게임생성이랑 진행중인게임의 상황을 볼수있게 해놓았다
11.관리자권한으로 게임진행상황보기
12.게임삭제
13.상품보내기
관리자페이지에서는 게임진행중일때도 누가 몇번을 선택했는지 볼수있게하였다 그리고 고유Id도 볼수있게하였다
그리고 혹시모를 상황을 대비하여 상품도 수동으로 보내게 해놓았다. 당첨자가 나온게임에는 자동으로 고유Id부분에 당첨자의 고유ID가 들어가게 설정해놓았다
14.당첨내역
상품을 보내면 당첨자는 당첨내역에서 상품을 받을수있게하였다(사진은대충넣었다)
친구들한테배포
이번프로젝트는 다만들면 배포를 해볼려고 보안에 신경을썼다. 다만들고선 몇없는 친구들한테 배포를 하였다. 나는 AWS를 써본적이없어서 ngrok을 사용하여 배포를하였다 ngrok을 사용하면 노트북이꺼지거나 와이파이가끊기면 서버도 다운된다 하지만 AWS를 잘모르고썻다가 돈폭탄이 나온다는소리를 듣고 무서워서 못사용했다. 친구가 많이없고 돈도별로없었던 나는 10명이서 아이스아메리카노를 걸고 게임을 진행시켯다 다행이 잘참여해주어서 게임이 잘 마무리되었다
재밌게도 모두가 중복된숫자를 선택해가지고 당첨자가없었다.
후기
비록10명밖께 이용을 안한게임이지만 하루동안 누군가가 나의 서비스를 이용해준다는게 너무재밌었다
첫배포가 성공적으로 마무리되어서 기뻣다
추후 테이블마다 실시간채팅을 넣고 이벤트성으로 번호마다 몇명이 선택한지 보여준상태에서 게임을 진행해도 재밌을거같다는 생각을 하였다. 나중에 AWS도 제대로사용할줄알고 개발실력도 좋아지면 큰돈을걸고 많은사람한테 배포해보고싶다