이 프로젝트에서는 C 프로그래밍 언어를 사용하여 간단한 텍스트 기반 오목 게임을 만들 것입니다. 오목은 두 명의 플레이어가 전략적으로 진행하는 보드 게임으로, 가로, 세로 또는 대각선으로 연속된 다섯 개의 돌을 먼저 놓는 것을 목표로 합니다. 우리는 15x15 게임 보드를 사용하여 이 게임을 개발할 것입니다.
👀 미리보기
🎯 과제
이 프로젝트에서 다음을 배우게 됩니다:
C 에서 2 차원 배열을 사용하여 체스판을 설계하고 구현하는 방법.
게임의 흐름을 제어하는 main 함수를 만드는 방법.
게임을 초기화하고, 체스판을 출력하고, 플레이어가 턴을 진행할 수 있도록 하는 함수를 구현하는 방법.
게임에서 승리 조건을 확인하는 함수를 개발하는 방법.
프로그램을 컴파일하고 실행하는 방법.
🏆 성과
이 프로젝트를 완료하면 다음을 수행할 수 있습니다:
C 에서 2 차원 배열로 작업할 수 있습니다.
함수를 사용하여 게임 흐름을 설계하고 구현할 수 있습니다.
게임에서 승리 조건을 확인할 수 있습니다.
C 프로그램을 컴파일하고 실행할 수 있습니다.
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 75%입니다.학습자들로부터 80%의 긍정적인 리뷰율을 받았습니다.
먼저, 보드 위의 각 위치의 "상황"을 기록하기 위해 체스판 (15 * 15) 이 필요합니다. 따라서 chessboard[16][16] 배열을 정의할 수 있습니다. 왜 [15][15]가 아닐까요? 이렇게 하면 배열의 좌표가 체스판의 행과 열에 정확히 일치하여 이후 코드를 작성하기가 더 쉬워집니다.
#include <stdio.h>
#define N 15
// 배열을 정의하고 각 요소에 초기값 0 을 할당합니다.
int chessboard[N + 1][N + 1] = { 0 };
main 함수를 작성하기 전에, 게임의 일반적인 흐름을 간략하게 생각해 봅시다. 먼저, 게임의 메인 인터페이스에 들어가서 시작 버튼을 클릭하여 게임에 진입한 다음, 게임 화면을 표시하고 승패를 결정한 후 게임을 종료합니다. 그렇다면, 바둑과 같은 게임의 흐름은 어떨까요?
우선, 게임의 환영 화면에 들어가서 Y 를 입력하여 게임을 시작하고 (Y 가 아니면 게임 종료), 게임 보드를 표시한 다음 두 플레이어가 번갈아 가며 돌을 놓은 후 승패를 결정합니다 (5 개의 돌이 연속으로 있는지 여부).
// 플레이어 1 의 턴인지 플레이어 2 의 턴인지 추적하는 데 사용되며, 홀수는 플레이어 1 의 턴을 나타내고 짝수는 플레이어 2 의 턴을 나타냅니다.
int whoseTurn = 0;
int main(void)
{
// 게임을 초기화하는 사용자 정의 함수, 즉 환영 화면을 표시하고 게임 보드를 표시합니다.
initGame();
// 이 루프는 두 플레이어가 번갈아 가며 진행합니다.
while (1)
{
// 각 사이클은 1 씩 증가하여 두 사람이 번갈아 가며 진행할 수 있습니다.
whoseTurn++;
// 돌을 놓는 작업을 수행하는 사용자 정의 함수입니다.
playChess();
}
return 0;
}
void initGame(void)
{
char c;
printf("Please input 'y' to enter the game:");
c = getchar();
if ('y' != c && 'Y' != c)
exit(0);
//Clear
system("clear");
//Here again we call a custom function whose function is to print out the chessboard.
printChessboard();
}
initGame 함수에서 exit 및 system 함수를 사용하므로 프로그램 상단에 stdlib.h 헤더 파일을 포함해야 합니다.
void playChess(void)
{
int i, j, winner;
//Determine if it is player 1's turn or player 2's turn, and then assign the value to the corresponding element in the array.
if (1 == whoseTurn % 2)
{
printf("Turn to player 1, please input the position, the format is line number + space number + column number: ");
scanf("%d %d", &i, &j);
chessboard[i][j] = 1;
}
else
{
printf("Turn to player 2, please input the position, the format is line number + space number + column number: ");
scanf("%d %d", &i, &j);
chessboard[i][j] = 2;
}
//Print the board again.
system("clear");
printChessboard(); //This function is called again.
/*
*The following section calls the custom function (the judge function).
*It is used to determine whether the current player has won the move or not.
*/
if (judge(i, j, whoseTurn))
{
if (1 == whoseTurn % 2)
printf("Winner is player 1!\n");
else
printf("Winner is player 2!\n");
}
}
아무도 눈치채지 못했는지 모르겠지만, 저희 오목 게임에서는 이미 자리가 차지되어 있어도, 자신의 체스 말을 놓을 때 원래 있던 체스 말을 "먹을" 수 있습니다.
이는 playChess 함수를 작성할 때 체스 말을 놓을 위치를 확인하지 않았기 때문입니다. 다음과 같이 코드를 수정할 수 있습니다.
void playChess(void)
{
int i, j, winner;
if (1 == whoseTurn % 2)
{
printf("Turn to player 1, please input the position, the format is line number + space number + column number: ");
scanf("%d %d", &i, &j);
//debug
while(chessboard[i][j] != 0)
{
printf("This position has been occupied, please input the position again: ");
scanf("%d %d",&i, &j);
}
//debug
chessboard[i][j] = 1;
}
else
{
printf("Turn to player 2, please input the position, the format is line number + space number + column number: ");
scanf("%d %d", &i, &j);
//debug
while(chessboard[i][j] != 0)
{
printf("This position has been occupied, please input the position again: ");
scanf("%d %d",&i, &j);
}
//debug
chessboard[i][j] = 2;
}
system("clear");
printChessboard();
if (judge(i, j))
{
if (1 == whoseTurn % 2)
printf("The winner is player 1!\n");
else
printf("The winner is player 2!\n");
}
}
함수에 루프를 추가하여, 해당 위치가 이미 차지되어 있으면 메시지를 표시하고 새로운 입력을 요청합니다.
5 개의 돌이 일렬로 놓여 "플레이어 1" 또는 "플레이어 2"가 이겼다는 메시지가 표시된 후, "플레이어 *의 차례입니다. 돌의 위치를 입력하세요..."라는 메시지가 표시됩니다. 짜증나지 않나요? 사실, 코드 한 줄만 추가하면 됩니다!
if (judge(i, j))
{
if (1 == whoseTurn % 2)
{
printf("Winner is player 1!\n");
exit(0); //debug
}
else
{
printf("Winner is player 2!\n");
exit(0); //debug
}
}
}
승리 후 승리한 플레이어를 알리는 것 외에도, exit(0)을 사용하여 게임을 종료합니다.