- submit 버튼 클릭이벤트로
WordData클래스의 main함수를 실행하고, 입력값인 value를 매개변수로 넘겨준다. - value값을 배열로 만들어 의미 단위별로
wordArr,num,way속성에 값을 저장 - 방향이 소문자면 대문자로 바꿔주고, 음수는 절댓값으로 바꾸고, 방향을 반대로 바꿔줌
- 숫자가 문자열의 길이보다 같거나 클 경우, 나눈 나머지로 이동할 거리
distance속성에 저장. 작을 경우에는 그대로distance에 저장. R일 때 단어 배열을distance번 pop, unshift 반복하고 반환.L일 때 단어 배열을distance번 shift, push 반복하고 반환.- 위의 결과를
join('')해서 문자열을 view 클래스에 반환 ViewWord클래스에서 반환받은 문자열을result속성에 저장- 요소를 생성하고
result값을 화면에 출력.
✱ View 클래스
- submit 버튼 클릭이벤트로 value값을 먼저 검사해서 Q만 입력됐을 때는 종료 요소 출력하고, 데이터를 초기화한다.
- Q만 입력되지 않았다면,
PlaneCubeData클래스의 main 함수를 실행하고, 입력값인 value를 매개변수로 넘겨준다. - main 실행 전 초기 데이터를 복사해서
init변수에 저장한다.
✱ Data 클래스
- 입력값 value를 의미 단위로 쪼개 배열로 만든다.
- split('')으로 배열로 만든 다음,
'원소의 인덱스를idx배열에 저장 idx배열을 돌면서 전 요소[idx - 1]에'를 더해줌- filter로
'원소를 제외하고 배열로 반환해서inputArr속성에 저장
- split('')으로 배열로 만든 다음,
- 입력값에
Q가 존재하는지 확인하고 있으면, Q부터 뒤 요소들 제거하고, 존재여부에 따른 boolean값 반환해서quit변수에 저장한다. (이후에 view 클래스로 넘겨줌) - 동작해야할 조작법이 들어있는 배열
inputArr를 돌면서 함수들을 실행한다. - 조작법에 따라 처리할 배열을 선택해서
currArr속성에 저장한다. - 조작법에 따라 방향을 정해
way속성에 저장한다. step-1에 있는 함수에currArr, 1, way를 매개변수로 넘겨 밀어내기 구현하고, 결과값을 저장한다.- 결과값을
dataArr에 반영하고, 변경된dataArr를 복사해서allResults배열에 push한다. data객체를 만들어 조작법 배열inputArr, 순서대로 실행한 결과값 배열allResults, Q 존재여부q를 저장해ViewPlaneCube클래스에 반환한다.
✱ View 클래스
main함수 실행 전 초기값init,main함수 실행 후 데이터data를 화면 출력 함수에 매개변수로 넘겨주고 실행한다.init초기상태를 출력하고,data의input로 입력한 조작법을 출력한다.data의Result로 결과값을 출력한다.Q가 입력값 마지막에 있다면, 종료 요소를 출력하고, 데이터를 초기화한다.
✱ View 클래스
- submit 버튼 클릭이벤트로 value값을 먼저 검사해서
Q만 입력됐을 때는 종료 요소 출력하고cube데이터를 초기화한다. 그리고 조작갯수counting을 출력하고, 초기화한다. - Q만 입력되지 않았다면,
RubiksCubeData클래스의 main 함수를 실행하고, 입력값인 value를 매개변수로 넘겨준다. - main 실행 전 초기 데이터를 복사해서
init변수에 저장한다.
✱ Data 클래스
- 입력값 value를 의미 단위로 쪼개 배열로 만들어
inputArr속성에 저장한다.step-2의 tokenize 함수를 사용해'를 문자에 붙여줌- 숫자가 있으면 (숫자 - 1)만큼 앞의 문자를 반복해 더해줌
- 입력값에
Q가 존재하는지 확인하고 있으면, Q부터 뒤 요소들 제거하고, 존재여부에 따른 boolean값 반환해서quit변수에 저장한다. (이후에 view 클래스로 넘겨줌) - 동작해야할 조작법이 들어있는 배열
inputArr를 돌면서 실행한다. - 조작갯수 카운팅하는 속성
counting에 1을 더해준다. - 조작을 위해 사용할 배열들을 업데이트해준다.
- 조작법에 따라 처리할 인접 4면의 배열을 선택해서
currArr속성에 저장한다. - 조작법에 따라 방향을 정해
way속성에 저장한다. step-2에 있는 함수를 call로 this를 설정해서 실행한다. (밀어내기 구현하고, 결과값은 속성에 저장됨)- 처리된 데이터를 cube 객체에 반영한다. 조작법에 따라 변경되는 데이터 배열이 다르기 때문에 함수를 나눠 만들어 값을 새로 할당했다. 이로써 인접해 있는 4면의 데이터 변경은 완료됐다.
- 그 다음으로는, 돌아가는 면(U조작이면 U면)을 시계 / 반시계 회전을 해준다.
- 시계방향으로 돌릴 때는 R로(배열을 오른쪽으로 밀도록)
currArr의 배열 순서를 정해놓았기 때문에way ==='R'이면 시계방향회전, 아니면 반시계방향으로 회전한다. 인덱스를 직접 설정해 값을 새로 할당하도록 했다. - 데이터조작이 완료된
cube를 깊은 복사를 해서allResults배열에 push한다. data객체를 만들어 조작법 배열inputArr, 순서대로 실행한 결과값 배열allResults, Q 존재여부q를 저장해ViewPlaneCube클래스에 반환한다.
✱ View 클래스
main함수 실행 전 초기값init,main함수 실행 후 데이터data를 화면 출력 함수에 매개변수로 넘겨주고 실행한다.cube객체의 면 속성들(3x3 배열)을 템플릿으로 만들어준다. 이 함수의 반환값을 초기상태와 결과값 출력하는 함수에서 사용한다.innerHTML로 요소를 생성하면서init초기상태를 출력한다.innerHTML로 요소를 생성하면서data의Result로 결과값을 출력한다.Q가 입력값 마지막에 있다면, 종료를 알리는 요소를 출력하고,cube데이터를 초기화한다. 그리고 조작갯수counting을 출력하고, 초기화한다.
✱ 경과시간
- data 클래스에
this.boolOfTime속성을 true로 설정해 처음에 main 함수가 실행될 때 시간값이 저장되도록 한다. - main 함수가 실행되면
saveTime함수가 실행된다. 이 함수에서 현재 시간을this.startingTime속성에 저장하고,this.boolOfTime속성을 false로 설정해 다음 main 실행 때는 시간 값을 저장하지 않도록한다. - view 클래스에서
quit함수가 실행될 때 현재 시간을 구하고, data클래스의startingTime속성을 가져와 차이를 구한다. - 그 차이를
getTime함수에서 계산해서 경과 시간을 시간, 분, 초 단위로 반환한다. - 경과시간 데이터를
this.time속성에 저장하고quit함수 실행 중 경과 시간을 출력한다.
✱ 랜덤으로 섞기
RandomCube클래스로 객체 생성하고setEvent함수 호출하면서 매개변수로 몇 번 반복해서 랜덤으로 조작할지 설정한다. (8로 전달하면 8개의 랜덤 조작법을 뽑아서 실행)- random 버튼을 누르면 이벤트가 발생하면서 함수 실행
- 매개변수로 전달한 개수(8)만큼 인덱스를 랜덤으로 뽑고, 해당 인덱스의 조작법을
this.string에 더한다. rubiksCubeData.main()함수에this.string을 넘겨주어 실행한다.- main 함수에서 처리한 데이터를 객체로 반환하는데,
result속성에는 단계별로 실행한cube결과값들이 들어있다. 최종 결과값만 출력하면 되니까result속성값의 가장 마지막 원소를 변수cube에 저장한다. viewRubiksCube.getSideTemplate()함수를 사용해서cube의 면들을 템플릿으로 받고, 화면에 출력한다.- 마지막으로
this.string값과this.rubiksCubeData.counting(조작갯수)를 초기화한다.
✱ 모든 면 맞추면 축하메시지 출력하기
- 결과값을 모두 출력한 이후(
viewResult())checkComplete()큐브 검사를 한다. - 순서대로 실행한 결과값이 모두 들어있는
allResults의 마지막 객체 원소만 빼서lastCube변수에 저장한다. Object.entries(lastCube).toString()으로 문자열로 변환한 후 완전한 큐브로 저장해 두었던this.completeCube와 비교하고,true이면viewCongratulation()을 실행한다.innerHTML로 축하메시지를 출력한다.
랜덤으로 큐브 섞어서 출력하기
축하메시지 출력하기





