안녕하세요, 어서 오세요
틱택토 과제에 대한 해결책을 제시하고 싶어요
각 문제에는 많은 해결책이 필요하다는 걸 기억하세요
이게 제 해결책이 될 거예요
네 해결책이 다르다면 좋은 프로그래밍
연습과 C# 프로그래밍 언어를 올바르게 사용하는
한은 괜찮아요
해결책을 제시하는 거예요
개선할 수 있을 거예요
그럼 시작하죠
네 새 프로젝트를 만들 거예요 틱택토라는
거죠 이제 조정을 시작할 거예요
강연 때 설명한 대로 분석해 봤어요
몇 개의 모듈을 생성할 거예요 아니, 몇 가지 함수라고
해야겠네요
이 방법이 효과가 있으면 좋겠네요
작명 해독을 위해 낙타 케이스를 사용하고 있어요 익숙한 거죠
원한다면 다양한 원본 파일로 분리할 수도
있어요
메인 요리가 완성됐네요
이 printf를 제거하죠
추가 사항을 포함할 거예요
네 이렇게 하면 시스템을 지우고 몇 가지 좋은 걸 할 수 있죠
그리고 또 제 생각에는 숯덩어리를 제거할게요
이 두 가지에 더해서 conio도 포함시키죠 H요
제가 원하는 건 이 문제를 공격하는 거예요
할 수 있는 한 모듈을 많이 하고 싶어요.
네 단일 차원 배열을 사용할 거라고 말씀드렸죠
2차원 배열이 더 나을지도 몰라요
네 하지만 전 이걸 구현할 때 일차원 배열을
사용할 거예요 게임 보드를 나타내는 배열이죠 틱택토 보드요
전역 변수를 생성할 거예요
네 네 여기 전역 변수를 사용하고 있어요
C에서 참조로 데이터를 넘기는 개념을 보여드리지 않았거든요
혼란스럽게 하고 싶지 않아요
네 여기선 전역 데이터를 사용하지
않고 함수에 전달할 수 있지만 참조를 사용해야 해요
aroundpoint를 넘겨야 합니다. 아직 어떤 것도
논의하지 않았는데요.
글로벌 데이터를 사용할게요
네 외우세요, 글로벌 데이터는 좋은 것이 아닙니다
왜냐하면 다시 말씀드리지만 오늘은 학습과 정복 분할 그리고 기능 활용을
보여드리려고 합니다 글로벌 데이터는 필수죠 포인터 얘기는
아직 안 했으니까요
네 여기 있는 전역 데이터는 그리드를 나타내는 사각형이에요
틱택토 보드요
네 이건 10개의 요소로 구성된 단일차원 영역이 될
겁니다 왜냐하면 0 요소를 사용하고 싶지 않기 때문이죠
이 배열 토픽 숫자를 써서 게임을 할 거예요
포메에게 제 좌표도 알려주죠
1부터 9까지의 값으로 이걸 시작할게요
이건 애크랙터 배열이에요 x와 o를
넣어야 하거든요
캐릭터 가오리 얘기는 아직 안 했지만 이건 한 캐릭터를 넣을
수 있게 해주죠
민트 배열 개념과 같아요 문자가 있다는 것만 빼면요
등장인물들은 해싱글이 인용했어요
네 1 2 3 9 0 O 그냥 넘어갈게요 사용하지
않을 거예요 사용하고 싶으니까요
프로그래밍이 좀 더 쉬워지죠
사용자센터의 값을 유효한 인덱스로 사용할 수 있어요
플레이어 턴에서는 전역 변수 2개를
선택해야 해요
선택은 키보드를 통해 입력한 것이죠 x나 o를 어디에 놓느냐에
따라 1부터 9까지의 선택이 있어요
플레이어는 어떤 플레이어 차례인지 알려줍니다
플레이어 1 또는 플레이어 2죠
다른 글로벌 데이터는 필요 없어요
여기 함수 배상금만 있으면 돼요
먼저 3가지 함수를 만들게요
오작동 신고를 할 거예요
1포인트 승패를 확인할 거예요
데이터는 안 가져갈 거예요
int를 반환할 거예요
네 저는 어떤 데이터도 반환하지 않고 올바른 문자로
보드를 표시하는 것을 선택할게요.
데이터도 안 받아요
판을 표시할 수 있는 어프랙션도 만들 거예요
사용자 입력을 받을 거예요
그리고 그리고 뭘 입력했느냐에 따라 배열의 정확한 위치에 x나 o를 놓을 거예요
그런 다음 디스플레이 보드를 이용해 그 배열을 표시하죠
네 여기에 markboard라고 쓰면 x나 o로
된 mark를 찍을 거에요.
재사용할 수 있게요
플레이어 1이나 플레이어 2를 재사용할 수 있어요
3개의 함수 선언이요 프로그램 어디에든 함수를 둘 수
있도록요 위에 선포했어요
네 보다시피 이 함수 중 2개는 데이터를 리턴하지 않고
1개만 매개 변수를 취하죠
게임 플레이를 실행하기 전에 이 기능들을 실행해 보죠
먼저 win을 확인할게요
네 네 이 함수는 기본적으로 작동해서 win이 있는지 보드를
확인할 거예요
if문을 많이 컨테이너할 거예요
이 코드를 좀 더 향상시킬 수 있을 것 같아요
네 여기에 주석을 달게요 우리 기능 상단에
항상 주석을 달아야 하거든요
이것들은 꽤 간단해요
함수 이름이 있어야 해요
네 네 기본적으로 이 함수는 게임이
끝났을 때 게임의 상태를 1로 리턴합니다 마이너스 1이 나오면
알려주고 게임이 진행 중이면 알려주고 게임이 끝났는데 무승부면
0을 알려줍니다
이 함수 체크 forone은 int를 반환하죠
고아헤드로 가서 정의해 볼게요.
네 이렇게 하면 3x와 일치하는
부분이 있는지 배열을 살펴볼 거예요
If 문도 아주 많죠
플레이어가 플레이어인지 어떻게 알죠?
선수가 대각선이나 열 모양과 일치하는지
알 수 있어요
그런 상황들을 일일이 확인해야 해요
배열을 기반으로 테콜럼스의 행을 알 수 있죠
네 제곱 1이 제곱 2이고 제곱
2가 제곱 3이면 첫 행에 매치가 된 거예요
반환 값도 생성할 거예요
맨 위에 있는 건 회수 값이에요 0으로 초기화하죠
0으로 시작하면 게임 오버죠
첫 행에 일치하는 게 있으면 하나를 리턴할
거예요 그럼 게임 끝이죠
네 그럼 일치하는 다른 if가 일련의 더 있어야 하는데 사실 하나를 반환하고
싶진 않아요 반환값을 설정하고 싶어요
반환할 수도 있지만 그러면 프로그램을 따라가기 힘들어져요
안 그러면 다른 행도 다 체크할 거예요
코드를 복사해 붙여넣기 할 거예요 중복되는
코드가 많거든요
무승부일 때만 신테레스트링을 할 수 있어요
우승자를 위한 틸시 if를 전부 넣을게요
그런 다음 다른 값을 뒤집을 거예요
잔뜩 elseif를 쓰는 대신 ampersand를 쓸 수도
있지만 그건 읽기가 더 어렵죠
첫 번째 줄에 일치하는 게 있다면요
오인덴테이션이 맞는지 확인하죠
두 번째 줄에 일치하는 게 있으면 두 번째 줄이 그걸 하고 있어요
네 세 번째 줄에서 일치하는 게 있으면 리턴해서 가독성을 위해 새 줄을 추가해요
괄호는 필요 없어요 단일 문장이니까요
37번 라인에 4번과 7번이 일치하는 것 같아요
친선 경기 같네요 리턴 원이에요
40, 5번과 8번이 매치됐어요
중앙에 있는 게 아래로 내려간 것 같아요 두 번째 기둥요
3-6도 일치하는 게 보여요
행, 열, 대각선의 매치 포인트를 잡아야 해요.
어레이를 살펴본 결과 그런 결과가 나왔어요
네 이제 일치하는 게 없거나 무승부가 아닐 경우를 알려주는 건 모든 걸
비교하는 겁니다 기본적으로 초기화된 숫자가 아니란
걸 확인하는 거죠
네 네 배열 사각형이 있는데 1이 없다면 2 3 1 2 3 4 5 6 8 또는
9의 값이 있습니다 0이나 x를 포함하고 있기 때문에 드로우를
한다는 것입니다
할 수 있어요 할 수 있어요 다른 걸 쓸 수도
있어요 기본적으로 드로잉이고 반환 값을 0으로 설정할 수 있는 경우에요 반환 값은 0…
네 다시 한 번 이건 그냥 마지막으로 확인하는 거죠 if
숫자가 초기화된 것과 동일하면요
모두 다르다면 0개를 반환할 수 있어요
하나 세워요
안 그러면 아드로를 못 뽑고 우승자도 못 뽑을 테니 아직
끝난 게 아니에요
마지막 else문은 sayreturn 값이 마이너스 1과 같다고 할 수 있죠
네 왜냐하면 기억하세요 이 함수는 마이너스로
리턴해요 1은 진행 중 1은 게임 끝 0은 결과 없는 게임이죠
마지막으로 할 일은 반환값을 반환하는 거죠
여기서 반환, 반환값을 언급할게요
이게 그 기능을 완성할 거예요
우리가 분할하고 정복하는 걸 눈치채셨나요?
라이트나우는 누가 이겼는지 판을 확인하는 데 집중하고
있어요
이런 스몰청크로 작업하면서 계속 테스트했어요
이러면 ourdesign에 집중할 수 있고 에러를 더 쉽게 줄이거나
격리할 수 있죠
게임 보드는 끝났으니 이제 디스플레이
보드를 실행해야죠
전광판은 전광판을 보여주기 위해 그냥 두는 거예요
특정 형식으로 어레이를 불러와야 해요
디스플레이 보드라는 어프랙션을 작성할게요
데이터를 반환하지 않을 거예요 매개 변수도 안 가져갈 거고요
네 그게 함수 번호 1인 이유는 보드를
여러 번 그려야 하기 때문이죠 또한 특정 작업을 하기 때문에
더 낫기도 하고요
이제 이건 그 안에 많은 printf 함수를 갖고 있어요
포맷이 아주 많을 거예요
복사해 붙여넣기를 할게요
여기서 특이한 건 매번 스크린을 치운다는 거예요
시스템과 윈도우즈, cls라고 하면 화면이 깨끗해져요
더 깔끔하죠
그런 다음 많은 printfs를 작업하죠
게임 제목을 출력할 거예요 플레이어 1과 0을 출력할 거예요
그리고 보드를 출력할 거예요
네 보드는 평행봉으로 포맷될 거예요 그런
다음 값을 프린트하죠 배열의 모든 값이요
그 값이 x or0이면 디스플레이가 되겠죠
맞아요, 그렇지 않다면 숫자를 표시할 거예요 그 숫자로 그리기
옵션을 선택할 수 있죠 이게 다예요 이 기능은 그게 다예요
네 좋아요 이제 보드를 표시하는 걸 마쳤으니
마지막 함수를 만들게요 보드를 표시하는 거죠
네 마크 보드가 특정 값으로 배열을 설정하고
x나 o에 마크를 입력할 거예요
캐릭터가 될 거예요
이게 뭘 하느냐면 if문이
여러 개 더 있어요
네 여기 마크 보드에서 몇 가지
주석을 달 거예요 이게 보드를 올바른 문자 x나 o로
설정할 거라고 하는 거죠 배열의 올바른 위치로요
이해가 되면 좋겠네요
제 코멘트를 끝내기 위한 코드 Igot이 보이시죠
두 줄로 구성할 거예요
이 모든 게 dois가 되어 사용자가
뭘 입력했는지 확인하죠
사용자가 입력한 것에 대한 전역 데이터 값이 2개라는 걸 기억하세요
현재 플레이어를 위한 가치도 있죠
선택은 기본적으로 키보드를 통해 입력되는 거죠
이걸 구현한 적은 없어요 주요 함수에서
구현할 거니까요
플레이어가 현재 플레이어로 가네요
표시를 하려면 이 두 개가 필요해요
그래서 Else 문을 여러 개 만들 거예요
if else 문이요
선택도 확인할게요 사용자에 의한 입력이죠
선택이 1과 같다면 그 사각형 안에 있는 걸 그리세요
그 광장도 사용 가능한지 확인하고요
네 1과 동등한데 현재 1과 같지 않다면 누군가 이미
x나 o를 입력했다는 건데 그걸 쓸 수 없다는 거죠
1과 같고 1을 입력했다는 건 배열을 특정 값으로
설정할 수 있다는 뜻이죠
x표에 있는 것으로 배열을 설정할 거예요
선택을 할 때마다 반복할 거예요
2번, 3번, 4번, 5번, 6번 8번, 9번 중에 골라요
다른 녀석들도 똑같이 할 거예요
네 사용자가 선택 2를 입력하면 들여쓰기가 제대로 됐는지
사각형 2가 사용 가능한지 확인하세요 우리가 통과시킨 것으로 사각형 2를
표시합니다
어떤 플레이어 차례냐에 따라 X자를 칠할 거예요
마지막으로 해야 할 일은 유효성 검사예요
1부터 9까지보다 조금이라도 더 통과하면
무효예요
마지막 else문은 메시지를 출력합니다 무효 이동이라고요 플레이어가 1점을
잃게 됩니다
선수들은 한 명이거나 두 명이니까요
네 플레이어를 다시 표시하고 메인 함수에서 반복문에서
증가를 할 것입니다
네 마지막으로 get char는 프로그램을 일시 중지해 유효하지
않은 이동 후 사용자가 반환을 누를 수 있도록 합니다
그렇죠 그렇지 않으면 무효가 표시됐다가 바로
삭제돼요 보드를 다시 그려야 하니까요
차르가 멈추게 해요
enter 버튼을 눌러서 다른 값을 입력하도록 강요하죠
이게 3가지 기능이에요
이 기능은 아무것도 반환하지 않아요
그래야 바닥에 둘 수 있죠
이제 게임 플레이를 실제로 축소해야 해요
게임 플레이가 주된 기능을 하죠
네 게임 플레이를 위해 여기서 사용자에게 숫자를 입력하라고
할 거예요 판을 그릴 거예요 승패를 확인할 거예요
여기서 2배율 변수를 생성하겠습니다 플레이어를
초기화할 거예요
여기에 정수 I를 생성할게요.
루프에 사용될 거예요
우리 마크는 xor o일 거예요 누구 차례냐에 따라서요
마크가 x 혹은 o일 거예요
마크가 x 아니면 o예요
선택은 사용자가 키보드를 통해 입력하는 것이고요
2개의 로컬 변수죠
전역 변수인 우리 플레이어도 설정할 거예요
처음에는 1번 플레이어만 게임을 시작할 수 있어요
그런 다음 루프를 만들 거예요
기본적으로 플레이가 끝날 때까지 반복되는 거죠
do whileloop을 사용할 거예요 적어도
한 번은 실행하고 싶으니까요
한 번은 전시하고 싶어요
그래서 전 보드를 표시하고 무승부가
되거나 이길 때까지 게임을 할 거예요
I = 1로 해 볼게요
마이너스 1이 의미하는 건 게임이 진행 중이라는 거예요
우승을 확인한 보답이 될 거예요
네 잠시 후 보시겠지만 기본적으로
게임이 끝날 때까지 같은 걸 계속 반복하는 루프가 있어요
부정적이지 않으면 게임이 끝날 거예요
먼저 뭘 해야 하죠?
제일 먼저 할 일은 보드를 전시하는 거예요
기능 표시판에 전화하면 돼요
플레이어를 계산해야 해요
플레이어 1부터 시작하죠
네 여기서 하려는 건 4개
연산자를 사용할 겁니다 이렇게 말할 거예요 플레이어 모듈이 2면
플레이어는 1 플러스 버전은 2...
적절한 선수를 결정하는 방법이죠
루프의 각 반복은 1에서 2 또는 2에서 1로 바뀔 거예요
네 네 1번 플레이어로 시작하면 2번 플레이어
모듈이 나오죠 하나를 2로 나누거나 나머지를 2로 나누면 1이에요
그게 1이면 플레이어 1로 전향하는 거죠
네 다음 반복으로 돌아가면 플레이어는
2가 됩니다 증가할 테니까요
2모드는 0이에요
툰과 같지 않다면 플레이어는 플레이어 2와
같을 거예요
2번 유저가 1번이면 톱플레이어 1이 돼요
터너오퍼레이터 기억하죠?
그 다음으로 해야 할 일은 사용자로부터 입력을 받기 위해 Ineed를 하는 거죠
사용자에게 숫자를 입력하도록 요청하는 거죠
네 네 플레이어 퍼센트 d 플레이어 1이나 2에 숫자를 입력하고 그 플레이어를
입력해 1이나 2를 출력해요
그런 다음 scanf를 사용하는 사용자로부터 Theinput을 읽어요.
이건 정수예요 보드 위의 1부터
9까지를 나타내죠
my choice varable에 저장할게요
선택은 한 끗 차이니까 주소로 지나갈게요 선택이라고
해야겠네요
주소로 전달하면 안 되는 문자열이라면요
그러면 표식이 뭔지 알 수 있어요
플레이어에 따라 마크가 X인지 아닌지 결정해야 해요
그래서 인공 수정 오퍼레이터를 다시 쓰려고요
x나 o를 지정할 거예요
플레이어가 1이면 x에 대문자 x를 할당할 거예요
안 그러면 대문자 O로 바꿀 거예요
이 4행 연산자는 아주 유용해요 조건에 근거해
변수를 할당해야 할 때요
다시 말해 iISif 플레이어가 1이면 마크는
x가 된다는 거죠
그렇지 않으면, o가 되겠죠.
네 물음표는 불 평가가 사실인지를 나타내요 콜론은
거짓을 나타냅니다
네 됐어요 이제 올바른 글자를 알았으니 마크보드라고
써서 보드에 마크하는 함수를 호출할 수 있어요 x나 o를 전달하면서요
보드에 표시를 하고 그들이 선택하면
전 승자를 확인하죠
변수 I가 있는데 더 나은
이름이어야겠죠
이것을 status체크 혹은 게임체크라고 부르도록 하죠.
게임 현황은 1 마이너스나 0이 되겠죠
게임의 상태는 check for win에서 반환되는
것과 동일하죠.
이 기능은 1이 0이거나 마이너스가 1이거든요
1 1 결과로 게임이 끝났을 때 1 게임이 진행 중일 때 마이너스 1이에요
결과가 안 나오면 0
이제 Gamestatus를 저장했으니 루프의
조건도 바꿀 거예요.
게임 상태가 마이너스 1로 바뀌면 루프에서
점프하죠
그렇지 않으면 선수 순서를 바꾸기만 하면 되죠
플레이어 순서를 어떻게 바꾸죠? 플레이어를 1명 증가시키면 돼요
네 네 그렇게 하면 다음에는 2가 될 거예요 플레이어는
2가 되고 우린 다시 내려가죠
네 잘못된 시도를 하면 잘못된 템플릿은 어떻게 될까요? 플레이어
수를 줄일 수 있습니다
플레이어 수를 줄이면 올바른 플레이어로 돌아가죠
네 이게 1이면 0으로 줄여요 다음 판은 1이 되겠죠
다시 같은 턴이에요
그래서 늘리는 거예요
플레이어 2라면 1을 증가시키죠
2 나누기 2는 0이죠
그래서 플레이어가 1로 돌아가죠
그렇게 하는 거예요
다 논리적인 거예요
많은 걸 했죠
한 번에 올시스를 써서 테스트하면 안 돼요
분할 정복이죠 분할 정복으로 작업해야 했어요 코드를 실행하는 동안
지속적으로 테스트하면서요
이제 이 솔루션을 제공하겠습니다 실행하고
테스트해보죠
챌린지 강의에서 했던 것처럼 작동할 거예요
다시 말씀드리지만 이 코드를 연구하고 메이크업을 하셔야 무슨 일이 일어나는지 이해하실 수 있어요
배열 사용과 div딩conquer 접근법이요 이 주요 메서드가
얼마나 멋진지 보세요
주된 방법으로는 무슨 일이 일어나는지 알기 쉬워요
디스플레이 보드, 체인지 플레이어 여기에 코멘트를 달아주세요
회전을 바꾸면 입력값이 나오죠
그런 다음 선수 턴에 따라 커트롤레터와
캐릭터를 설정해요
함수가 서술적이라 설명이
필요 없어요
마크 보드는 사용자의 선택 또는 무효한 선택에 따라 설정해요
그리고 상태 체크 포 윈은 설명이 필요 없죠
게임이 끝났을 때 뛰쳐나가죠
만들어 보죠
실수가 없어야 할 텐데요
이제 실행해보면 우리 데모에서처럼 작동하는 게 보이실 거예요
가장 먼저 스크린을 디스플레이하죠
엔터를 출력하도록 허용하죠
그리드도 있어요 1-2-3-4-5-6-7-8-9 배열
플레이어 oneenter를 입력하고 유효한 것을
입력하라고 하네요.
그리면 화면이 깨끗해지죠
보기 좋네요
이제 3에 x가 있어요
이제 2번 플레이어 차례예요
부적절한 일을 하게 할 거예요
부적절한 동작이라고 하고 멈추죠
리턴을 누르고 플레이어 2로 넘어가죠
이제 1을 눌렀는데 한 지점에서 O를 다시 그렸어요
승자와 패자가 결정될 때까지 계속할 거예요
우승자를 발표하도록 하죠
x는 2 o가 5가 되고 x는 6이 되고
o는 9가 되죠
0점 3개를 뽑았으니 게임 끝이죠
제가 한 가지 빼먹은 게 while 루프예요 축하를
표시하려면요
거기서 우리가 할 일은 게임 상태를 확인하는 것뿐이에요
네 게임의 등급이 1과 같다면 플레이어 1이라는 뜻이고 그게 이기는 마지막
플레이어가 되겠죠
그래서 우세한 쪽이 이긴 걸 출력했죠
안 그러면 드로잉을 할 거예요
맞아요 루프에서 벗어나서 상황이 안 좋아지면 게임은
끝났고 결과가 나왔다는 걸 알 수 있으니까요 그럴 수도 있죠
그래서 마지막 if문이 있어야 결과를 보여줄 수 있어요
이제 승자로 재시험을 보죠
이제 우승자가 나오겠군요
네 여기 유효한 숫자를 입력할게요 x가 빠르게
승리할 수 있습니다 이 프로그램에서 실행을 해야 합니다
자, 플레이어 1이 이겼습니다 또 다른 멋진 사운드가 나왔네요
긴 강의가 끝났네요
설교가 너무 길었죠?
이 코드를 연구하세요 소스 파일로 프로비데이션 할게요
분할 정복에서 메토드에 대해 많이 배우면 좋겠네요
고마워요