C 언어 로 정자 기 게임 실현

7336 단어 C 언어우물 바둑
C 언어 는 간단 한'정자 바둑 게임'을 실현 합 니 다.여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
전체 구조:
1.게임 메뉴 의 논리 적 실현
2.게임 본체의 코드 구현
게임 메뉴 의 전체 논리
① 간단하게 0 과 1 을 입력 하 는 switch 함 수 를 통 해 게임 을 하 는 지,게임 을 종료 하 는 지 판단 하 는 논리
1 을 입력 하면 게임 에 들 어 갑 니 다.그리고 game()즉 게임 본 체 를 다 친 후에 도...while 함수 가 1 을 입력 하면 게임 여 부 를 계속 반복 해서 물 어 봅 니 다.
0 을 입력 하면 break 는 게임 을 종료 하고 도...while 순환 을 종료 하 며 프로그램 이 끝 납 니 다.

int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
  menu();
  printf("   >--");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   printf("    ...exit...
"); break; default: printf(" ,
"); } } while (input); return 0; }
② 간단 하고 거 친 메뉴 인쇄 함 수 는 다음 과 같다.

void menu()
{
 printf("******************************
"); printf("********** 1.play ***********
"); printf("********** 0.exit ***********
"); printf("******************************
"); }
파 트 2:게임 본체의 실현 은 다음 과 같다.
1.우 리 는 먼저 2 차원 배열 보드[ROW][COL]을 바둑판 으로 정의 합 니 다.

char Board[ROW][COL] = { 0 };
전역 변수 ROW 와 COL,즉 줄 수 와 열 수 를 3 으로 정의 합 니 다.

#define ROW 3
#define COL 3
2.바둑판 생 성 후 이 바둑판 초기 화(빌 드 함수)
이 함수 에 인삼 을 전달 하려 면 줄 과 열,2 차원 배열(바둑판)이 필요 합 니 다.

initBoard(Board, ROW, COL);
2 층 for 순환 으로 간단하게 2 차원 배열 을'빈 칸'으로 초기 화 합 니 다.

void initBoard(char Board[ROW][COL],int row,int col)
{
 int r = 0;
 int c = 0;
 for (r = 0; r < ROW; r++)
 {
  for (c = 0; c < COL; c++)
  {
   Board[r][c] = ' ';
  }
 }
}
3.초기 화 후 이 바둑판 을 인쇄 하여 인쇄 함 수 를 정의 합 니 다.

showBoard(Board,ROW,COL);
간단 한 세로 선과 빈 칸 으로 바둑판 을 인쇄 하 다.

void showBoard(char Board[ROW][COL], int row, int col)
{
 int r = 0;
 int c = 0;
 printf("
------------
"); for (r = 0; r < ROW; r++) { for (c = 0; c < COL; c++) { if (c == 2) { printf(" %c ", Board[r][c]); } else { printf(" %c ", Board[r][c]); printf("|"); } } printf("
------------
"); } printf("
"); }
4.한 유저 가 바둑 을 두 는 함 수 를 구축한다.

PlayerMove(Board, ROW, COL);
유 저 는 아래 좌 표를 입력 한 후 판단 합 니 다:
1:플레이어 가 입력 한 좌표 가 바둑판 안에 있 는 지 여부
2:유저 가 입력 한 좌 표 는 이미 하위 가 되 었 습 니까?
간단 한 for 순환 과 if 문장 으로 판단 하면 완성 할 수 있 습 니 다.
그리고 매번 다시 입력 해 야 하 는 상황 에서 바둑판 을 참고 로 인쇄 합 니 다.

void PlayerMove(char Board[ROW][COL], int row, int col)
{
 while (1)
 {
  int r = 0;
  int c = 0;
  char input = '0';
  printf("          :(  :1 2)
"); scanf("%d %d", &r, &c); if (r > 3 || r<1 || c>3 || c < 1) { system("cls"); printf(" , !
"); showBoard(Board, ROW, COL); } else if (Board[r - 1][c - 1] == 'x' || Board[r - 1][c - 1] == '0') { system("cls"); printf(" , !
"); showBoard(Board, ROW, COL); } else { system("cls"); Board[r-1][c-1] = 'x'; showBoard(Board, ROW, COL); break; } } }
5.컴퓨터 바둑 을 두 는 함수 구축

PcMove(Board, ROW, COL);
우 리 는 랜 덤 함수 로 간단하게 컴퓨터 바둑(scand()과 rand()를 둔다.
컴퓨터 의 좌표 가 이미 내 려 갔 는 지 판단 해 야 한다.

void PcMove(char Board[ROW][COL], int row, int col)
{
 int r = 0;
 int c = 0;
 while (1)
 {
   r = rand() % ROW;
   c = rand() % COL;
   if (Board[r][c] != 'x' && Board[r][c] != '0')
   {
    system("cls");
    Board[r][c] = '0';
    showBoard(Board, ROW, COL);
    break;
   }
 }
}
6.마지막 으로 승 부 를 판단 하 는 함수
여기 서 우 리 는 ret 로 함수 반환 값 을 받 습 니 다.1,2,0 은 각각 우리 가 이 기 는 것 과 컴퓨터 가 이 기 는 것 과 무승부 에 대응 합 니 다.

ret = win(Board, ROW, COL);
정자 기 가 이 기 는 규칙 은 3 행 3 세로 또는 대각선 이 같 으 면 이 기 는 것 이 며,순서대로 판단 하면 된다.

int win(char Board[ROW][COL], int row, int col)
{
 int r = 0;
 int c = 0;
 int sum = 0;
 for(r = 0; r < ROW; r++)
 {
  //     1,     2
  //       
  if (Board[r][0] == Board[r][1] && Board[r][2] == Board[r][1] && Board[r][1] == 'x' || Board[0][r] == Board[1][r] && Board[2][r] == Board[1][r] && Board[1][r] == 'x')
   return 1;
  if (Board[r][0] == Board[r][1] && Board[r][2] == Board[r][1] && Board[r][1] == '0' || Board[0][r] == Board[1][r] && Board[2][r] == Board[1][r] && Board[1][r] == '0')
   return 2;
 }
 //     
 if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] == 'x' || Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] == 'x')
  return 1;
 if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] == '0' || Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] == '0')
  return 2;
 //     
 for (r = 0; r < ROW; r++)
 {
  for (c = 0; c < COL; c++)
  {
   if (Board[r][c] == 'x'||Board[r][c]=='0')
    sum++;
  }
 }
 if (sum == 9)
  return 0;
 //  3      
 return 3;
}
7.게임 논리
게임 의 논 리 는 게이머 가 가 고 컴퓨터 가 간 후에 한 번 의 승 패 를 판단 해 야 한 다 는 것 이다.바둑 을 두 면 우 리 는 하나의 순환 while(1)로 쓸 수 있다.게임 이 결과 가 있 을 때(승 패 는 무승부)만 break 에서 순환 을 벗 어 나 게임 결 과 를 인쇄 할 수 있다.

void game()
{
 int ret = 0;
 char Board[ROW][COL] = { 0 };
 initBoard(Board, ROW, COL);
 showBoard(Board,ROW,COL);
 while (1)
 {
  PlayerMove(Board, ROW, COL);
  PcMove(Board, ROW, COL);
  ret = win(Board, ROW, COL);
  if (ret != 3)
   break;
 }
 if (ret == 1)
 {
  system("cls");
  printf("     !
"); showBoard(Board, ROW, COL); } else if (ret == 2) { system("cls"); printf(" ?
"); showBoard(Board, ROW, COL); } }
요약:
1.게임 의 논리 정리
예 를 들 어 매번 게이머 가 가 고 컴퓨터 가 간 후에 한 번 의 승 패 를 판단 해 야 한다.
예 를 들 어 게임 메뉴 의 도...while 와 switch 순환 의 역할.
2.게임 함수 구현 중 함정
예 를 들 어 좌표 가 점용 되 었 다 면 좌 표를 다시 입력 해 야 하 는 상황 을 무시 할 수 없다.
아니면 승패 함수 중 세 가지 서로 다른 승패 조건 에 대한 판단 문제.
전체적으로 말 하면 게임 은 큰 어려움 이 없고 관건 적 인 논 리 를 이해 하면 쓸 수 있 지만 부주의 해 서 는 안 되 고 놓 치기 쉬 운 점 을 놓 치기 쉽다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기