2048

2020. 5. 1. 18:25C#/과제

2048.zip
0.03MB

<해야 할 것>

- Game Over 조건 구체화 할 것

- 수의 크기에 따라 색 조절

========================================================

 

 

2048_20200504.zip
5.23MB

<2020-05-04>

 

a. 종료 시 저장하는 방법이 적용되지 않음. 사용하는 코드 자체도 이해하고 사용하는게 아니었고...

같은 수업을 듣는 "신완철"님의 코드를 참고해 봤으나, 차이가 있는 코드가 무슨내용인지도 알 수 없었다.

따라서 어쩔 수 없이 매 턴마다 Serialize 하는 방법으로 변경

 -> 나중에 Delegate를 공부한 후 다시 접근해보기

<종료 시 Save Error 이미지>

 

b. 특정 배열의 값 마다 색상을 지정하여 숫자별로 색을 다르게 입히려고 했으나, 콘솔 전체의 폰트 색상을 바꿀 수만 있었다. 폰트를 알록달록하게 하는 방법은 찾지 못함. 실제로 있는데 못 찾는 것일수도 있으나, 콘솔 자체의 기능을 찾느라 너무 많은 시간을 할애하는 것 같아 포기함.

 

c. 코딩을 하며 있었던 issue? 문제점? 들에 대해 나열해보자면

 

 1) AddRandomNumber()

- 처음엔 랜덤한 위치를 정하는 것 자체를 난수로 만들고, 만약 해당 위치에 이미 값이 있다면 재귀호출을 통해 다시 난수를 돌리는 방식으로 함.

여기서 생기는 문제점은 메소드 안에서 난수 객체를 실체화 시키는 구조였기 때문에, 빈 칸을 찾아내는 시도가 일정 이상 실패할 경우 무한정 스택에 쓰이지 않는 객체가 쌓이다가 결국 StackOverFlow Exception이 발생하게 됨.

 

- 다음으로 변경했던 방법은, 난수 객체를 Class 내의 멤버변수로 각각 행과 열에 맞춰 1개씩만 만들어 놓은 후, 그 객체만 다루어서 다시 시도.

이 방법으로 Exception은 해결되었으나, 빈 칸의 갯수가 매우 적어지는 게임 후반부에선 컴퓨터가 빈칸을 찾지 못하고 한참동안이나 난수만 추출하다가 결국 멈춰버리는 현상이 발생.

 

- 세번째로 시도한 방법은, 난수 생성 전에 TileMap의 모든 칸을 스캐닝 한 후, 빈 칸에 해당하는 좌표를 리스트화해서 관리. 그 후 그 리스트 내에서 다시한번 난수를 돌리는 방법으로 변경.

이 방법으로 인해 해당 리스트의 Count를 이용해서 Game Over 조건까지 맞출 수 있었음.

 

2) ConsolKeyInfo

- 처음엔 일반적인 Console.ReadLine()을 이용해서 조작키를 입력받았으나, 테스트 시에 너무 번거로워서 찾아보니 ConsolKeyInfo라는걸 발견했음.

키 자체를 입력받는 방식이라 화살표 만으로 조작 가능한 방식이어서 상당히 편리했으나, 의도하지 않은 키를 눌렀을 때엔 누르는 순간 에러가 발생하는경우가 많았음.

해결법은 "switch - case" 내에서 default를 꼭 설정해서 내가 입력받길 원하는 값 외에는 전부 예외처리를 시켜버리면 됨

 

3) 구조적 문제

- 일단 점수측정방식.

처음엔 "타일 위에 올라와있는 모든 수 = 총 점수" 인 줄 알았는데, 게임을 몇 번 더 해보니 숫자가 합쳐질 때에 그 합쳐진 수만큼만 점수였음.

다 뜯어고쳐야하나 싶어서 멘탈 살짝 나갔었는데, 가만 생각해보니 숫자를 비트연산으로 2배시킬때, 그 숫자 자체를 TotalScore에 더하면 그만이었다. 이건 운이 좋았다고 봐야 할 것 같다.

 

- 메소드 구성

코딩 중 특정 부분에서 막히는 시간이 길어지기 시작하면, 어느 순간 객체 지향의 기본 원칙은 개나 주고 일단 돌아가게 하는데에 급급한 나쁜 버릇이 있는 것 같다. 마치 그라데이션 분노를 느끼면서....

 

완성 후 메소드를 점검해보면 지켜지지 않는 원칙들이 몇 가지 있었는데, 대충 추려보면 다음과 같다.

->Move() : 메소드 명과는 맞지않는 점수 추가가 여기서 이루어짐. 단일 책임의 원칙이 지켜지지 않음.

-> 타일 맵 범위([] x []) : 나중에 타일 수를 늘리려면 하드코딩한 부분을 바꿔야 함. 개방 폐쇄 원칙이 지켜지지 않음.

-> 이 이외에도 자잘하게 캡슐화 안하고 다 Public 처리한다거나....

 

<후기>

 

일단 굴러가게 하고, 그 이후에 코드 구조에 욕심을 내는게 맞는것이라고 배우면서 지내왔지만

막상 코드 완성 후에 코드 구조를 예쁘게 변경하려고 하면 거의 못건드리게 되는 아이러니가 있다.

"신완철"님의 코드를 보고 구조가 너무 예뻐서 그런 방식으로 바꿔보려다가, 가족 연휴 일정에 치여서 결국 중도 포기했다. 내 코드에 대한 아쉬움이 남아있는건 덤....

 

스스로의 기준에서 열심히 하는건 어렵지 않다. 다만 항상 선을 정하는게 가장 중요하고, 피곤하고, 어려운 일이다.

질문을 할 때 조차 너무 적게 알아보고 질문하면 괘씸한 무노력형 핑거프린세스가 되는법이고,

그렇다고 한참 혼자 끙끙 앓으면서 계속 찾아보다보면 결국 지금 해야하는 중심 맥락에서 이탈하기 마련이니까.

 

되짚어봤을 때 할만큼 했다고 생각이 들면 주변에 신경쓰지 말고 만족하는 습관을 들이자.

죽을만큼 더 하면 더 잘할 수 있는건 어느분야나 마찬가지지만, 모두의 기댓값을 충족시키는건 어짜피 불가능하다.

매번 되새김질 하면서도 혼자 스트레스를 받는걸 보면, 나도 아직 정신적으로는 멀었다.

선두로 달리다 과로로 죽은 말의 시체는, 뒤쳐진 말에게 귀감이 되지 못한다. 명심하자.

 

'C# > 과제' 카테고리의 다른 글

스킨 상점  (0) 2020.05.01
접속 보상  (0) 2020.04.29
상점 구성 및 구매  (0) 2020.04.28
캐릭터 전직 종합편  (0) 2020.04.27
객체지향이란  (0) 2020.04.22