/* 말발굽 스프레드 타로 뽑기 */
package pad;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;
public class Pad {
Pad() {
new HorseShoeSpread(); // 다시하기 호출
}
public static void main(String[] args) {
new HorseShoeSpread(); // 초기실행
}
}
/* 주 코딩 영역 */
class HorseShoeSpread {
private final String[] MAJOR_ARCANA = { // 전체 카드 배열
"The Fool", "The Magician", "The High Priestess", "The Empress", "The Emperor",
"The Hierophant", "The Lovers", "The Chariot", "Strength", "The Hermit", "The Wheel of Fortune", "Justice",
"The Hanged Man", "Death", "Temperance", "The Devil", "The Tower", "The Star", "The Moon", "The Sun",
"Judgement", "The World"
}; // 카드 설명
private final String[] EXPLANATIONS = { "현재 상태", "현재 목표", "내면 심리", "가까운 미래", "먼 미래" };
private Scanner sc;
private Random rd; // 역방향 뽑기용 랜덤 클래스
private boolean isRead; // 메뉴 생성 제어용
private ArrayList arcanaList; // Collections 클래스 용 전체 카드 옮겨 담을 List
private ArrayList pickedCards; // 사용자가 선택한 카드 종류
private ArrayList cardPositions; // 사용자가 선택한 카드 방향
HorseShoeSpread() {
this.sc = new Scanner(System.in); // 스캐너 생성
this.pickedCards = new ArrayList<>();
this.cardPositions = new ArrayList<>();
this.isRead = false;
this.rd = new Random();
this.main();
this.sc.close(); // 스캐너 종료
}
/* 핵심 코드 영역 */
private void main() {
System.out.println(this.getTitle()); // 타이틀
try {
System.in.read(); // 엔터 입력
} catch (Exception e) {
}
this.makeList(); // 전체 카드 배열 list로 옮기고 초기 셔플
while (!isRead) { // 리딩 완료 할 때 까지 반복
this.makeMenu();
}
}
// 카드 선택
private void pickCard() {
StringBuilder sb = new StringBuilder();
sb.append("[ 카드를 고르시오: 1 ~ " + this.arcanaList.size() + " ]");
System.out.println(sb);
int input = this.input(); // 입력
// 실수 제어
if (input < 1 || input > this.arcanaList.size()) {
sb.setLength(0);
sb.append("[ 1에서 " + this.arcanaList.size() + " 사이에 숫자를 입력해주세요 ]");
System.out.println(sb);
this.pickCard(); // 실수 시 반복
} else {
this.pickedCards.add(this.arcanaList.get(input - 1)); // 카드 종류 선택
this.cardPositions.add(this.rd.nextBoolean()); // 카드 방향 선택
this.arcanaList.remove(input - 1); // 덱에서 선택한 카드 제거
}
}
// 리딩
private void makeResult() {
StringBuilder sb = new StringBuilder();
sb.append("****************************\n");
for (int i = 0; i < 5; i++) {
sb.append(this.EXPLANATIONS[i]); // 카드 설명
sb.append("\t");
sb.append((!this.cardPositions.get(i)) ? "↕" : " "); // 카드 방향 가져오기
sb.append(" ");
sb.append(this.pickedCards.get(i)); // 카드 종류 가져오기
sb.append("\n");
}
sb.append("****************************");
System.out.println(sb);
this.isRead = true; // 리딩 완료 표시
sb.setLength(0);
sb.append("[ Enter 다시하기 ]");
System.out.println(sb);
try {
System.in.read();
} catch (Exception e) {
}
new Pad(); // Pad() 생성자 호출로 프로그램 재실행
}
// 셔플
private void shuffle() {
Collections.shuffle(this.arcanaList);
StringBuilder sb = new StringBuilder();
sb.append("[ 셔플 완료 ]");
sb.append("\n");
System.out.println(sb);
}
// 메뉴 생성
private void makeMenu() {
StringBuilder sb = new StringBuilder();
// 현재 카드 선택 진행 상황 표시
for (int i = 0; i < 5; i++) {
sb.append(this.EXPLANATIONS[i]);
if (i < this.pickedCards.size()) {
sb.append(" 〆"); // 선택 완료 표시
}
sb.append((i % 2 == 0) ? "\t" : "\n"); // 짝수 항목 tab, 홀수 항목 줄바꿈
}
sb.append("\n\n");
sb.append((this.pickedCards.size() < 5) ? "1. 카드 뽑기" : "1. 리딩하기"); // 5번 모두 선택 후 1번 항목 내용 변경
sb.append("\t2. 셔플하기\n");
sb.append("3. 그만두기\n");
System.out.println(sb);
int input = this.input();
switch (input) {
case 1:
if (this.pickedCards.size() < 5) { // 현재 선택한 카드 개수로 제어
this.pickCard(); // 카드 선택 함수 호출
} else {
this.makeResult(); // 리딩 함수 호출
}
break;
case 2:
this.shuffle(); // 셔플
break;
case 3:
new Pad(); // 재시작용 생성자 호출
break;
default: // 실수 제어
sb.setLength(0);
sb.append("[ 1 ~ 3 숫자를 입력해주세요 ]");
System.out.println(sb);
}
}
// 전체 카드 배열에서 list로 옮겨 담기 + 초기 셔플
private void makeList() {
this.arcanaList = new ArrayList<>();
for (String s : this.MAJOR_ARCANA) {
this.arcanaList.add(s);
}
this.shuffle(); //초기 셔플 호출
}
// 타이틀 디자인
private String getTitle() {
StringBuilder sb = new StringBuilder();
sb.append("************************\n\n");
sb.append("5 Horseshoe Spread v 1.0\n\n");
sb.append("\tdesigned by Byul\n");
sb.append("\tinspired by 유성\n\n");
sb.append("************************\n");
sb.append("[ Enter를 눌러서 시작 ]");
return sb.toString();
}
// 사용자 입력
private int input() {
return this.sc.nextInt();
}
}
댓글
댓글 쓰기