2012-02-12 4 views
2

나는 책을 읽고 첫 번째 프로젝트 중 하나 인 tic-tac-toe 게임을 만들려고 노력하고 있습니다. 임이 이동이 성공한 이동인지 여부를 확인하는 기능을 만드는 데 문제가 있습니다. 나는 올바른 방향으로 밀기 만하면됩니다.Tic-Tac-Toe 배열 또는 목록?

내 tic-tac-toe 보드 인 경우 3x3 배열을 사용합니다. 가능한 8 가지 조합이 있습니다. 그래서 조합의 배열을 만들고 보드의 움직임 중 하나가 승리 한 움직임에있는 것과 일치하는지 프로그램 검사를하는 것을 생각하고 있습니다.

배열이 작동하는지 또는 다른 것이 벡터 나 목록처럼 잘 작동하는지에 대한 조언이 필요합니다.

+0

배열은 tic-tac-toe 보드와 같이 고정 크기 인 것으로 사용해야합니다. 크기를 변경할 수있는 항목을 나열합니다. – Joel

+2

당신은 [this] (http://xkcd.com/832/)을 좋아할 것입니다. –

+0

좋은 매트 내가 사랑 xkcd –

답변

2

저장하려는 물건이 정적이고 변하지 않으므로이 경우 배열이 제대로 작동합니다. 이것은 그들을위한 완벽한 유스 케이스이다.

동적으로 저장할 때 목록과 벡터가 더 적합하며 크기를 미리 알지 못합니다. 귀하의 경우, 크기를 미리 알고 있으므로 작업을 완료하는 가장 간단한 데이터 구조 (배열)를 사용해야합니다.

+0

괜찮아요 그래서 배열의 배열을 만들 수 있습니다 –

+0

물론! 복잡한 일이긴하지만 분명히 할 수 있습니다. 코드를 읽는 사람들을 두려워하고 싶다면 배열 배열 배열을 가질 수 있습니다. 나는 그것을 조언하지 않을 것이다. – Oleksi

+0

배열 배열을 만드는 것보다 더 좋은 옵션이 있습니까? –

1

어 ... 정말 말하기 어렵습니다. 둘 다 확실히 사용할 수 있습니다. 나 자신은 아마도 정적 배열을 사용하지만, 정적 배열로 시작하는 것이 더 자연 스럽다. 그리고 Vector로 배열을 시도하면 차이점을 알 수있다. 또한 어쩌면 당신은 자신의 인스턴스를 비교할 수있는 클래스를 만들려고합니다. (전략이 승리하는지 확인해야하기 때문에) TicTacToeBoard입니다. 그리고 모든 메소드가있는 클래스가 있으면 배열과 Vector 사이의 구현을 변경할 수 있고 캡슐화 아이디어도보실 수 있습니다. : 외부 클래스와 클래스가 같고 내부에서 사용할 수 있습니다. 다른 솔루션.

1

3x3 어레이를 사용하여 현재 보드를 저장하는 것이 좋습니다. 배열을 사용하여 가능한 조합을 저장하는 것은 좋지 않습니다. 이것이 첫 번째 프로그램이지만 좋은 습관을 배우기 시작하는 것이 결코 아 닙니다. 이 문제로 모든 가능한 조합을 열거 할 수 있다는 것은 사실 일 것입니다. 그러나 체커를 코딩하려는 경우 어떻게합니까? 가능한 우승 시나리오의 수가 엄청납니다. 체스는 어때? 체스에 가능한 모든 승부 움직임을 저장할 수있는 충분한 컴퓨터 메모리가 오늘 없습니다.

훨씬 더 나은 방법은 해당 조건을 확인하는 기능을 작성하는 것입니다. 간단하게하기 위해, 나는 이렇게 쓰는 것이 좋습니다. 너무 간단하지, 난이 의사 코드 같은 것을 쓸 것이다 : 플레이어 후

// returns true if specified side won 
// board - a pointer to your array 
// player - specifies if you want to check if X or O is the winner 
bool game_won(board, player) 
{ 
    For each row, check if each field is equal to player. 
     if yes return true. 
    For each column, check if each field is equal to player. 
     if yes return true. 
    Check if each field on diagonal is equal to player. 
     if yes return true. 

    // winning conditions not met, let's keep playing 
    return false 
} 

각 이동합니다, 당신은 game_won()를 호출해야하고 이동 플레이어 승자를 만들 경우 당신을 위해 확인합니다.

p.s. 각 플레이어 당 8, 10의 우승 이동이 가능하지 않습니다 : 3 개의 수평, 3 개의 수직 및 2 개의 대각선.

+0

감사합니다 이것은 정말로 명확히합니다, 하하는 내가 실수를 세기를 믿지 않지만 감사합니다. –