TicTacToe 게임 만들기(클론)

혜미·2021년 7월 1일
0

TIL

목록 보기
3/29
post-thumbnail

https://www.youtube.com/watch?v=gQb3dE-y1S4&t=1001s
👉이 영상을 보면서 만들었다.

초반에는 일단 유튜버 분이 작성한 코드를 보고, 설명을 듣기 전에 나름대로 먼저 해석해 봤다.

🐣나름대로의 해석(당연히 틀릴 수 있음)🐣
2d 배열이 뭔지 아직 모르지만, 배열 안의 배열(상위 배열/하위 배열)인 듯? 일단 내가 추측하는, 12번째 줄부터의 코드 진행 과정을 적어보겠음.

for each문은 아직 바로 와닿지가 않아서 그냥 for문에 대입해 볼 것임.
나름대로 상위 배열(변수 i, 0부터 시작) / 하위 배열(변수 j, 0부터 시작)으로 구분해 보았음.

💙파랑 부분 출력값: 공백|공백|공백 (첫번째 캡쳐 콘솔 맨 윗 줄 내용과 같음)
그리고 j=4일때까지 출력을 마치면 하위 배열에서 빠져 나와서 그 다음 코드인 println메소드를 실행한다(다음 줄로 이동)

이런 식으로 i=1일 때, i=2일 때, ..., i=4일 때까지 출력하면 첫 번째 캡처본의 콘솔 출력값이 나온다!

👉깔끔하게 보기 위해 아래쪽에 메소드를 하나 만들고 for each 루프를 그 안으로 옮겼다.

Q. line6에 gameBoard를 정의해줬는데 왜 line17에서 컴퓨터는 gameBoard가 뭔지 모르는 걸까? 다른 메소드 소속이라? 아님 실행 메소드인 main 메소드 안에서 정의한 거라서?

gameBoard의 정의를 class 소속으로 옮겨봤더니 non-static 필드인 gameBoard를 static 참조(??) 할 수 없다고 나와서 이클립스의 추천대로 gameBoard 정의 앞에 static을 붙였다. 이렇게 하니까 에러가 없어지긴 했는데... 자신이 없으므로 그냥 영상에서 제시한 방법대로 하겠다.


👉 영상에서 제시한 방법이다.

Q. line12에서 괄호 안에 gameBoard를 왜 쓰는 걸까? line16에 있는 메소드에서 괄호 안에 넣은 게 생성자인가? 근데 생성자 자리에는 형식만 같고 내용은 다른 값을 넣는 거 아닌가? 왜 printGameBoard 메소드 괄호 안의 내용인 gameBoard를 line12 괄호 안에 그대로 넣는 거지?

내 나름대로 컴퓨터 플레이어 차례 코드를 짜봤다. line53에 한 줄 공백을 넣어서 두 표가 아래와 같이 구분되게 했다. 공백 없으면 표 2개가 붙어버림.

유튜버 분은 어떻게 했을까!!
우선 지저분하고 긴 코드를 정리 먼저 했네.


👉 유튜버를 따라 X/O표시를 symbol이라는 변수로 설정했다.
✔✔✔ 오!!! 훨씬 깔끔하네!!

💭문법 강의 들을 땐 '지금은 코드 5줄이니까 괜찮지만 코드가 10000줄이 된다고 상상해 보세요. 엄청 복잡하겠죠. 그래서 메소드를 하나 만들어서 정리해 줘야 돼요.' 이런 말을 들어도 완전히 와닿지가 않았는데 이제 그 말이 좀 와닿는다.

👉 player측, cpu측 값 입력을 다 하고 난 다음에 보드게임표를 출력하니까 O/X가 한 번에 떠서 훨씬 깔끔하네!! 내 방식대로 했을 땐 X만 있는 표, O만 있는 표가 따로 있어서 복잡해 보였다.

💭문득 드는 생각인데, 이렇게 하나하나 찬찬히 따지면서 기록하는 게 효과적인 공부방법일까...? ㅎㅎ.... 그래도 이렇게 하는 게 제일 재밌다. 재미 없으면 오래 공부하기 힘들어 ㅠㅠ

실수 발견! random을 잘못 이해하고 있었다.
random의 0번째 값은 1, 첫 번째 값은 2, ... 이런 식인줄 알았는데 그게 아니네. 반대로 이해한 것 같다.
random의 첫 번째 값은 0, 두 번째 값은 1, ... , 아홉 번째 값은 8이구나. 1-9까지의 숫자를 랜덤으로 출력하고 싶다면 위 사진처럼 써야 되는구나.

한 명씩 차례로 경기가 계속 반복되는데 긴 코드를 복붙하면 지저분하니까 메소드 같은 걸로 다시 묶어야 되나?

👉 while문을 쓰면 되는구나.

근데 문제가 있었다. 틱택토 게임에서는 누군가 한 번 고른 자리는 다시 고를 수 없는데 여기서는 cpu가 이미 선택된 자리를 고를 수 있었다. 기존에 선택된 자리는 선택 못하게 해야 했다. 어떻게 해야 되는지 모르겠다...

혼자서 만들어보려고 해 봤는데 검색을 아무리 해도 잘 모르겠고 시간이 너무 오래 걸린다. 지금 단계에서는 영상 따라하면서 코드를 최대한 이해하고 넘어가는 방식이 효과적인 것 같다.

깔끔하게 만들려고 winning이라는 인스턴스(?)를 따로 만드는 듯?
List를 검색해 보니 인터페이스고 ArrayList는 List의 구현 클래스라는데 어떻게 쓰는 건지는 모르겠다. line103도 이해 안 됨. 우선 넘어가자.

✔ 내가 추측하는 코드 진행 과정(1-4단계)을 적어보겠다.

  • 리스트 l은 처음에는 비어 있다. winning의 0번째 인덱스(topRow, 즉 (1, 2, 3))를 l에 넣는다.
  • 플레이어 위치값이 l을 모두 포함한다면 플레이어 승. 그렇지 않다면 {}를 빠져나가서 아랫줄로 간다.
  • cpu 위치값이 l을 모두 포함한다면 cpu 승. 그렇지 않다면 {}를 빠져나가서 아랫줄로 간다.
  • 플레이어 위치값 개수와 cpu 위치값 개수가 9면 CAT(무승부) 반환. 근데 지금은 양측의 위치값 개수 합이 2다.(한 번씩 플레이 했으므로)

〰다시 FOR LOOP 새로 시작➰〰

  • 현재 l에는 아까 넣은 위치 (1, 2, 3) 이 들어 있다. 이번에는 1번째 인덱스인 middleRow를 l에 넣는다.
  • 위의 4단계까지 진행한다.
  • 결과가 안 나온다면 다시 FOR LOOP 새로 시작

〰 결과 나올 때까지 FOR LOOP 계속 돌리기〰

위치값(O/X)을 playerPositions, cpuPositions에 저장을 안 했다. 위치값이 저장되도록 작업을 해야 한다.

			👇👇👇

나는 바로 System.out.println(checkWinner());를 입력했는데 유튜버 분은 아래와 같이 입력했다.

💭가독성을 높이려고 이렇게 짠 건가? 아니면 보통 이렇게 많이 쓰나?

contains메소드가 있었네! 간편하게 값 중복 여부를 알 수 있다.
나는 '내가 입력한 숫자에 해당하는 자리 != ' ' 라면 다시 입력하라는 메시지를 띄워야지~' 이런 식으로 접근하다가 답이 안 나와서 포기했는데, 이런 방법이 있구나.


💭 마지막에 2를 입력해서 이겼는데, 2 자리에 왜 X가 안 뜰까? 나중에 이유를 찾아 봐야지. ㅠㅠ

🌫🌠🌊🌊

영상 따라서 틱택토 게임 다 만들었다. 근데 코드 진행 과정을 제대로 이해한 게 아니라서(개발 공부 한 달차 인생에서 제일 긴 코드다.......ㅎㅎㅎㅎㅎ 진행 과정 한 줄씩 살펴봤는데 너무 복잡하다ㅠㅠ



💭 지금 이 코드를 모두 이해해야 될 것 같아서 잠시 좌절했지만, 다시 생각해 보니 처음부터 다 이해하지 않아도 괜찮고 그럴 수도 없을 것 같다. 계속 공부하다 보면 나중에 왜 이런 코드를 쓰고 정확히 어떤 과정으로 실행되는지 이해하는 순간이 오리라고 믿는다 🌟

지치지 않게 지금처럼 꾸준히 하자🏊‍♀️🏊‍♂️

0개의 댓글