재업) C++ 배열 응용 육목 질문

조회수 509회

안녕하세요,

어제 배열 응용 관련 프로그래밍에 여쭤봤는데 작업한 코드가 잘 되지를 않네요, 한번 봐주시면 감사하겠습니다.

최근에 막 배열 배우고 배열 응용 육목 짜기 과제를 받았는데요. 처음 시작할때 임시로 const int N을 임의로 설정하고 아래 사진 같은 경우는 N = 19일 경우 2d 배열로 char board[N][N]의 경우입니다.

프로그램은 흑 백 팀으로 나뉘어 B(black)이 시작을 해서 주어진 칸 안에 자리를 입력하고 (H14 밑 사진과 같이) 그리고 W(white)가 두번 기회를 얻고, 그 후 검정이 두번 기회를 얻고 (흑 > 백 > 백 > 흑 > 흑 > 백 > 백 > 흑 > 흑 ...) 육목을 채우면 끝나는 게임입니다.

마지막 칸이 찼는데도 육목이 없을경우는 "Draw Game!"이고 아닐경우 각각 "Black wins/White wins"가 됩니다. 제한사항은 보드 사이즈를 정하는 const int N 이외에는 global variables를 사용할 수 없고 프로그램 안에 최소 4개 이상의 함수, 그리고 그 중 최소 2개의 함수는 배열 변수를 포함하고 있어햐 합니다.

이미지 이미지 이미지

코드 어떻게 짜야할지 도움 주시면 정말 감사하겠습니다 ㅠㅠ.

제가 지금 짠 코드는:

#include <iostream>
using namespace std;

const int N = 19;


void print(int arr[][N]) {

    cout << "  ";

    for (int i = 0; i < N; i++)
    {
        printf(" %c ", 65 + i);
    }
    printf("\n");

    for (int i = 0; i < N; i++)
    {
        printf(" %2d ", i);
        for (int j = 0; j < N; j++)
        {
            if (arr[i][j] == 1)
                printf(" B ");
            else if (arr[i][j] == 2)
                printf(" W ");
            else
                printf(" . ");
        }

        printf("\n");
    }
}

void input(bool turn, int arr[][N]) {
    char command[255] = { 0 };

    bool invalid = true;
    while (invalid)
    {
        if (turn)
            cout << "W";
        else
            cout << "B";
        cout << "'s turn : ";

        cin >> command;

        if (command[0] >= 65 && command[0] <= 65 + N)
        {
            // 맞음
            char c = command[0] - 65;
            int a1 = int(c);

            memmove(&command[0], &command[1], sizeof(command) - 1);

            int a2 = atoi(command);

            if (arr[a2][a1] == 0)
            {
                arr[a2][a1] = turn ? 2 : 1;
                break;
            }
            else
                cout << "Invalid move. Enter again!" << endl;


        }
        else
        {
            // 틀림
            cout << "Invalid move. Enter again!" << endl;
        }
    }
}

void turn(bool* turn, int* count) {
    if (*count == 1) {
        *turn = !(*turn);
        *count = 0;
    }
    else
    {
        (*count)++;
    }
}

bool winner(int arr[][N]) {

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (arr[i][j] == 1 && arr[i][j + 1] == 1 && arr[i][j + 2] == 1 && arr[i][j + 3] == 1 && arr[i][j + 4] == 1 && arr[i][j + 5] == 1) {
                cout << "Black wins!" << endl;
                exit(0);
            }
            else if (arr[j][i] == 1 && arr[j + 1][i] == 1 && arr[j + 2][i] == 1 && arr[j + 3][i] == 1 && arr[j + 4][i] == 1 && arr[j + 5][i] == 1) {
                cout << "Black wins!" << endl;
                exit(0);
            }
            else if (arr[i][j] == 1 && arr[i + 1][j + 1] == 1 && arr[i + 2][j + 2] == 1 && arr[i + 3][j + 3] == 1 && arr[i + 4][j + 4] == 1 && arr[i + 5][j + 5] == 1) {
                cout << "Black wins!" << endl;
                exit(0);
            }
            else if (arr[i][j] == 1 && arr[i - 1][j + 1] == 1 && arr[i - 2][j + 2] == 1 && arr[i - 3][j + 3] == 1 && arr[i - 4][j + 4] == 1 && arr[i - 5][j + 5] == 1) {
                cout << "Black wins!" << endl;
                exit(0);
            }
        }
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (arr[i][j] == 2 && arr[i][j + 1] == 2 && arr[i][j + 2] == 2 && arr[i][j + 3] == 2 && arr[i][j + 4] == 2 && arr[i][j + 5] == 2) {
                cout << "White wins!" << endl;
                exit(0);
            }
            else if (arr[j][i] == 2 && arr[j + 1][i] == 2 && arr[j + 2][i] == 2 && arr[j + 3][i] == 2 && arr[j + 4][i] == 2 && arr[j + 5][i] == 2) {
                cout << "White wins!" << endl;
                exit(0);
            }
            else if (arr[i][j] == 2 && arr[i + 1][j + 1] == 2 && arr[i + 2][j + 2] == 2 && arr[i + 3][j + 3] == 2 && arr[i + 4][j + 4] == 2 && arr[i + 5][j + 5] == 2) {
                cout << "White wins!" << endl;
                exit(0);
            }
            else if (arr[i][j] == 2 && arr[i - 1][j + 1] == 2 && arr[i - 2][j + 2] == 2 && arr[i - 3][j + 3] == 2 && arr[i - 4][j + 4] == 2 && arr[i - 5][j + 5] == 2) {
                cout << "White wins!" << endl;
                exit(0);
            }
        }
    }

}

int main() {
    int arr[N][N] = { 0 };

    bool end = false;
    bool turncheck = 0;
    int turncount = 0;

    while (!end)
    {
        print(arr);
        turn(&turncheck, &turncount);
        input(turncheck, arr);
        end = winner(arr);
    }
}
  • 글에 물음표가 안 보이는데 질문글 맞지요? 엽토군 2020.4.21 20:59
  • 코드가 이 정도로 긴데 주석도 없고... 뭘 물어보시는지도 모르겠고... 알아서 돌려보고 안 돌아가는 부분 찾아서 알려드리기에는 너무 어려운 문제인 것 같아요 HIAOAIH 2020.4.22 09:43

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)