섯다 룰 (무조건 카드덱 만드는 것부터 보세요!)
1. 카드는 총 20장 1부터 10까지 2개의 덱이 있다고 생각하면 된다
1 3 8 에는 광이 들어감
4 7 9 에는 동물이 들어감
2. 카드를 총 2장 받는데 한 장씩 받고 베팅 후 나머지 한 장을 받음
카드 두 개를 더한 것이 최종 값
카드 합이 10이 될 경우 0으로 처리
족보가 없을 경우에 카드 합이 10이 넘어갈 시에는 일의 자리 숫자가 총합이 됨
3. 같은 숫자끼리 만나면 땡으로 변함
땡은 일반 숫자보다 높음
37(3광이랑 7 동물이 만나면)
모든 땡은 37 땡잡이한테 잡힘
4. 광끼리 만나면 광땡이 되고
38 광땡이 제일 높음 (무조건 이김)
13/18 광땡은 상대가 47(2개다 동물) 일시 47 땡잡이가 이김
5. 4와 9가 만나면 재경기 (사구는 알리까지 재경기/ 명사구는 9 땡까지 재경기)
하나라도 동물이 안 들어가면 땡 밑으로는 재경기
두 개다 동물이 들어간 거면 땡도 재경기 (10 땡은 재경기 안됨)
1. 카드덱을 만든다
2. 카드 두장씩 플레이어, 컴퓨터에 각각 부여
3. 배팅 (구현 못함)
* 조합 예외처리 (1-10까지 땡 / 13 광땡 / 18 광땡 / 38 광땡 / 37 땡잡이 / 47 땡잡이 / 49 /멍 49 / 망통 (46 , 28)
* 숫자끼리만 만났을 때 높은 숫자 승리 / 망통이랑 만났을 때 숫자 승리 / 49,멍49만나면 재경기 / 땡잡이랑 만났을때 숫자 승리 / 땡 광땡 만나면 숫자 패배
* 땡은 같은땡끼리 계산할 때 높은 땡이 승리 / 망통이랑 만났을 때 땡이 승리 / 멍 49 만나면 재경기(10 땡일 때만 승리) / 47 땡잡이 만나면 승리 / 망통 만나면 승리 / 멍 37 만났을 때 패배(10 땡만 승리) / 광땡 만나면 패배
* 광땡끼리는 못 만남 / 13,18일 때 멍 47 만나면 승리 / 나머지 다 승리
(오류 발견 => 멍사구 재경기하는 멘트 위에 999 이하이면 안되고 미만으로 수정해야 함.)
첫 번째로 해야 할 것은 카드덱을 만드는 것이다.
그런 다음 각각의 플레이어들에게 카드들을 나눠주고
받은 카드들을 조합한 결과끼리 비교를 해서 승패를 나누면 된다
블로그상 파일을 바꿔가며 코드 짜는 것을 구현하기 힘들기 때문에 위에 만드는 순서를 참고하면 좋을 것 같다
위 사진은 메인을 출력하는 파일이다
생성자를 만들어, 카드와 플레이어/컴퓨터 Scanner를 받아온다 (스캐너는 베팅할 때 사용)
그리고 new_game이라는 클래스를 만들어서
각각의 플레이어들이 카드를 받는 시점부터 승패를 결정하는 시점까지를 정의할 것이고
메인에는 new_game만 가져오면 되게끔 구현할 것이다
add = 각각의 플레이어의 테이블에 카드를 추가
cards = 20장의 카드
next = 20장의 카드를 다 쓸 때마다 카드 셔플 (오류 : 한판 끝날 때마다 셔플 해줘야 함 / 변경 예정)
calc = 카드들을 조합해서 맞는 족보의 value를 계산
lv = 예외처리 (땡잡이, 암행어사) 하기 위해서 구현 (족보 출력하는 곳에 자세하게 기록)
게임 시작 후 나올 수 있는 예외들을 모두 가정문을 사용하여 코드 구현
사구/멍사구/무승부 일시 새로운 게임 바로 할 수 있게 new Seokda(). new_game 코드 추가
----------------------------------------------------------------------------------------------------------------------
Player class
바뀌지 않을 값을 final로 MAX_TALBE_SIZE를 2로 지정한다
(카드를 2장 받을 것이기 때문에)
그리고 생성자에는 새로운 카드 2장을 배열 형식으로 tables에 넣는다
add는 앞서 말했듯이 플레이어와 컴퓨터 각각의 테이블에 카드를 한 장씩 추가해주는 역할을 하고,
카드는 밑에 카드 클래스에서 설명하겠지만,
실질적으로 계산되는 value와 사용자가 보는 String이 달라야 하기 때문에 toString을 사용하여
각각의 테이블에 존재하는 카드를 보여준다
computer class
player class를 extends 하여 player에 입력한 코드를 전부 다 상속받는 형식으로 구현
족보를 보여주는 클래스를 levelString1이라 칭하였고,
int first에 첫 번째 카드의 벨류의 값,
int second에 두 번째 카드의 벨류의 값을 저장하였고
boolean a, b로
a는 첫 번째 카드에 광이나 동물이 있는지 체크
b는 두 번째 카드에 광이나 동물이 있는지 체크하였다
그리고 첫 번째로,
셔플 기능을 사용하여 벨류가 작은 값, == 즉 낮은 숫자를 앞쪽으로 배치하게 셔플 하였다
(이렇게 안 하면 예시로 38 광땡일 때 ((first == 3 && second == 8) | | (second == 3 && first == 8)) )
이렇게 작성해야 함.
하지만 작은 숫자가 무조건 앞으로 간다면 한 번만 작성해도 됨. | | (second == 3 && first == 8))
위에 파란 부분이 삭제가 가능해지고. 족보가 상당히 많아서 한 개의 코드를 추가해 반복성을 줄이는 것.
그다음, (a && b) 일 때,
즉 첫 번째 카드와 두 번째 카드가 둘 다 힘을 가졌을 때 (광이나 멍일 때)
광땡, 땡잡이, 멍사구, 땡잡이, 암행어사 족보 등록
그리고 first가 1일 때를 밑에서도 등록하고 위에서도 등록하는 이유는
밑에서는 이제 a, b 두장의 카드가 파워를 가졌든 말든 작성을 할 예정인데
여기서 코드가 두 개다 파워를 가졌을 때, [ 1 / 2 = 알리 or 1 / 5 = 6끗 ] 이런 경우는 상관없지만,
[ 1 / 4(파워) = 독사 or 1 / 9 = (구삥) ] 이런 경우는 두 개다 파워를 가졌기 때문에 출력이 안 되는 문제가 발생함
* 파워는 밑에 카드 클래스 덱 만드는 곳에 위치함!
그렇기에, 두 개다 파워가 있는 카드 중에서 족보가 있는 것들은 따로 또 지정해줘야 함.
그리고 나머지는, 둘을 더한 것들의 일의 자리 숫자와 + "끗"만 출력
그다음 족보인 땡은
두 개의 숫자가 같을 때를 가정문을 사용하고
그 안에 가정문으로 숫자를 10부터 1까지 만들고 해당 값에 알맞은 str을 지정해준다
그리고 그다음 족보는 1 이 들어간 족보인데
위에처럼 각각의 조합에 맞는 족보를 출력해주는데,
족보에 포함되지 않는 조합들의 수들도 있기 때문에 (ex : 3 / 5 / 6 / 7 등등 )
그 숫자들은 else 가정문으로 1과 더한 다음 1의 자리만 출력
그다음 족보 4가 들어간 것들도 똑같이 지정해준다
원래는 클래스로 만들어서 한 번에 return 하는 방식으로 하는 게 좋은데
그걸 나중에야 깨달았다!
코드는 위 에랑 같고
str 이 value로 바뀐 것뿐이다 사구나 멍사구도 level을 체크해서 하면 더 깔끔했을 텐데
어차피 재경 기기이고, 메인에서 먼저 걸러주기 때문에 value값을 아무렇게나 지정하였다
(하지만 땡잡이와 암행어사는 다름!)
왜냐하면 땡잡이와 암행어사가 끗을 만났을 때는 승패가 갈린다.
땡잡이 0끗 / 암행어사 1끗
하지만 사구는 끝과의 승패가 없기 때문에 벨류 값에 대한 문제가 없는데
땡잡이와 암행어사는 사구처럼 아무 밸류 값을 줘서도 안되고,
하지만 땡이나 광땡을 각각 만났을 때는 승리하여야 하기 때문에, 아예 다른 값이 필요하다
그것이 카드덱의 맨 마지막 lv = = level이다
족보 순서에 맞게 벨류를 정해줌.
카드덱은 총카드의 숫자는 20개이기 때문에 CARD_SIZE를 20이라고 하고,
생성자 안에는 카드 20장을 cards라는 Card배열에 넣고
셔플을 해준다 그럼 카드들은 Card 배열 안에서 뒤섞여 있을 것이다.
next , toString 은 위에 참조
main은 카드들이 잘 찍히는지 확인해보기 위해서 넣었었다.
그리고 Card라는 class를 만들어서
각각의 카드를 보여주기 위한 값으로 mins 배열에 넣고
각각의 카드의 실제값을 넣기 위해 mins_values에 저장하였다
그리고 카드들이 광이 있는지, 멍이 있는지 체크하기 위해 boolean타입 배열로 POWER에 각각을 넣어주었다
getValue , getPower 메서드로 나중에 해당 카드의 값과 광/멍 구분을 체크할 예정.
이렇게 올리고 보니, 카드덱부터 올릴걸 그랬다.
맨 위에서부터 내리면서 보면 이해가 안 될 수도 있을 것 같은 생각이 든다
또, Str과 value를 class로 합치면 훨씬 코드가 줄었을 것 같고
배팅과 전적도 구현했으면 좋았을 것 같다
'TIL > Java' 카테고리의 다른 글
Java 핸드폰번호 유효성 체크 (0) | 2021.08.03 |
---|---|
Java 학교 (학생들의 성적표 만들기) (0) | 2021.08.03 |
Java Yacht dice game 구현하기 (0) | 2021.08.03 |
Java 로또만들기 정답버전 (0) | 2021.08.03 |
Java 로또만들기 - (오류발견 : 보너스번호관련) (0) | 2021.08.03 |