C 언어 로 삼자 기 게임 간이 판 실현

13098 단어 C 언어삼자 장기
머리말
힌트:흑백 바둑 의 일종 이다.삼자 기 는 민간 전통 놀이 로 구 궁 기,동그라미 포크,용 한 마리,정자 기 등 이 라 고도 부른다.정사각형 대각선 을 연결 하여 양쪽 에 세 개의 바둑 알 을 차례대로 놓 고 자신의 세 개의 바둑 알 을 한 줄 로 만 들 면 상대방 이 지 는 것 이다.하지만 비 기 는 경우 가 많다.

하나,삼자 바둑 게임 규칙
자 기 는 OOXX 기,정자 기 등 이 라 고도 하 는데'정'자로 3 을 나눈다×3 의 칸 은 쌍방 이 돌아 가면 서 바둑 알 을 둔다(O 또는 X 로 구별 할 수 있다).자신의 세 바둑 알 을 한 줄 로 만 들 면 승리 한다.
2.기본 절차
삼자 기 코드 를 실현 하기 전에 이 게임 을 실현 하 는 논 리 를 살 펴 보 자.
1.게임 메뉴 를 만 듭 니 다.
2.바둑판 을 만 들 고 초기 화 합 니 다.
3.바둑판 인쇄.
4.플레이어 가 알 을 내리 고 바둑판(좌 표를 통 해)을 인쇄 할 때'o'로 플레이어 의 알 을 표시 합 니 다.
5、승 부 를 판단 합 니 다(유저 의 승 리 를 판단 합 니까?승 리 는 바로 게임 이 끝나 지 않 으 면 계속 진행 된다.
6.컴퓨터 낙 자 와 바둑판(랜 덤 낙 자)을 인쇄 할 때'x'로 컴퓨터 낙 자 를 표시 합 니 다.
7.승부 판단(컴퓨터 승리 여부?승 리 는 바로 게임 이 끝나 지 않 으 면 계속 진행 된다.
8.바둑 을 두 면 2 단계 로 돌아 가 계속 집행 한다.
절차

1.메뉴 인터페이스
1.게임 시작 0,종료:
main.c 는 프로그램의 주체 프레임 워 크 입 니 다.

void menu()
{
 printf("****************************
"); printf("********** 1、play *********
"); printf("********** 0、exit *********
"); printf("****************************
"); } int main() { int input = 0; srand((unsigned int)time(NULL)); char arr[ROW][COL]; menu(); do { printf(" ;>
"); scanf("%d", &input); switch (input) { case 1: game(arr,ROW,COL); break; case 0: break; default: printf("
"); break; } } while (input); return 0; }
인쇄 메뉴 에서 도...while 순환 으로 메뉴 를 한 번 이상 인쇄 할 수 있 습 니 다.
아래 는 인쇄 된 메뉴 인터페이스 입 니 다.

2.바둑판 만 들 기
우 리 는 메뉴 창 을 인쇄 한 후에 게임 을 시작 할 수 있 습 니 다.게임 을 하려 면 먼저 바둑판 을 만들어 야 합 니 다.
바둑판:3 줄 3 열의 2 차원 배열 을 사용 하여 요소 유형 은 char 라 고 표시 합 니 다.

#define COL 3
#define ROW 3
**매크로 정 의 를 사용 하 는 이유:
1.코드 의 가 독성 을 높이 고 후속 코드 에서 3 을 만 나 의 미 를 쉽게 이해 할 수 있 습 니 다.
2.확장 성 을 향상 시 키 고 앞으로 바둑판 사 이 즈 를 수정 하려 면 코드 수정 이 편리 할 것 입 니 다.
**
3.바둑판 초기 화
우리 가 바둑 을 둘 때,우 리 는 먼저 바둑판 위 가 비어 있다 는 것 을 보증 해 야 하기 때문에,우 리 는 빈 칸 으로 바둑판 을 초기 화 해 야 한다.

void InitBoard(char arr[ROW][COL], int row, int col) 
{
 int i = 0;
 int j = 0;

 for (i = 0; i < row; i++) 
 {
  for (j = 0; j < col; j++) 
  {
   arr[i][j] = ' ';
  }
 }

}
4.바둑판 인쇄
우리 가 바둑판 을 초기 화 한 후에 우 리 는 바둑판 이 어떤 지 인쇄 해서 다음 코드 와 출력 을 봅 시다.

void diaplayBoard(char arr[ROW][COL], int row, int col) 
{
 int i = 0;
 int j = 0;

 for (i = 0; i < row; i++) 
 {
  for (j = 0; j < col; j++) 
  {
   printf(" %c ",arr[i][j]);
   if(j < col - 1)
   printf("|");
  }
  printf("
"); if(i < col - 1) for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("
"); } }
5,유저 낙하
유 저 는 행렬 좌 표를 입력 하면 타 자 를 표시 하고'*'를 사용 하면 유저 의 타 자 를 표시 합 니 다.
유저 낙하 시 주의사항:
1.플레이어 가 떨 어 지 려 면 바둑판 범위 내 에 있어 야 합 니 다.
2.유 저 는 바둑판 위 에 앉 아야 합 니 다.
3.입력 한 좌표 가 만족 하지 않 으 면 다시 입력 해 야 합 니 다.

void playmove(char arr[ROW][COL], int row, int col) 
{
 do
 {
  int x = 0, y = 0;
  int i = 0, j = 0;
  printf("     :>");
  scanf("%d%d", &x, &y);

  if ((x > 0 && x <= row) && (y > 0 && y <= col))
  {
   if (arr[x - 1][y - 1] == ' ')
   {
    arr[x - 1][y - 1] = '*';
    break;
   }
   else
   {
    printf("      
"); } } else { printf("
"); } } while (1); }
6.컴퓨터 소켓
컴퓨터 의 랜 덤 타 자 는'X'는 컴퓨터 의 타 자 를 나타 낸다.컴퓨터 는 랜 덤 으로 떨 어 지기 때문에 우 리 는 랜 덤 좌 표를 만들어 야 하기 때문에 우 리 는 랜 덤 값 이 필요 하 다.
컴퓨터 슬롯 주의사항:
1.주 함수 에 srand(unsigned int)time(NULL)를 사용 합 니 다.
시간 스탬프 를 랜 덤 수의 시작 점(헤더 파일:\#include)으로 하여 얻 은 행렬 좌 표를 진짜 랜 덤 으로 확보 합 니 다.
2.함수 에서 rand()함 수 를 사용 하여 무 작위 좌표(헤더 파일:\#include)를 만 들 고 좌 표를 바둑판 범위 내 에 확보 해 야 합 니 다.
3.바둑판 상공 에서 바둑 을 두 어야 한다.

void computermove(char arr[ROW][COL], int row, int col) 
{
 do
 {
  int x = 0, y = 0;
  x = rand() % row;
  y = rand() % col;

  if ((x >= 0 && x <= 2) && (y >= 0 && y <= 2))
  {
   if (arr[x][y] == ' ')
   {
    arr[x][y] = '#';
    break;
   }
  }
 } while (1);
 
}
7.승부 판단
반환 결 과 를 이용 하여 승 부 를 판단 한다.
4 가지 다른 상 태 를 되 돌려 줍 니 다:
플레이어 승리->'*'
컴퓨터 승리
무승부-->'Q'
계속-->'C'
1.승리
(1)모든 줄 을 판정 합 니 다(한 줄 의 문자 가 모두 같 으 면 승리 합 니 다)
(2)모든 열 을 판정 합 니 다(한 열 문자 가 모두 같 으 면 승리 합 니 다)
(3)두 대각선 판정(한 대각선 문자 모두 동일,즉 승리)
주의:빈 바둑판 의 상황 을 제거 해 야 합 니 다.
2.무승부
(1)IsFull 함 수 를 호출 합 니 다.
(2)1 로 돌아 가면 바둑판 이 꽉 찼 음 을 나타 내 고 0 으로 돌아 가면 바둑판 이 꽉 차지 않 았 음 을 나타 낸다.
(3)바둑판 이 꽉 차 서 승 부 를 가리 지 못 하면 무승부 다.
(4)바둑판 이 채 워 지지 않 으 면 게임 을 계속 합 니 다.

int Is_Full(char arr[ROW][COL], int row, int col) 
{
 int i = 0;
 int j = 0;
 int count = 0;

 for (i = 0; i < row; i++)
 {
  for (j = 0; j < col; j++) 
  {
   if (arr[i][j] != ' ') 
   {
    count++;
   }
  }
 }

 if (count == row * col)
 {
  return 1;
 }
 return -1;
}
5.다 중 파일 형식
우리 가 평소에 코드 를 쓸 때 프로그램 이 크 면 한 파일 에 직접 포함 시 키 는 것 이 어 지 러 워 집 니 다.위 와 같이 한 파일 에 모두 넣 으 면 혼 란 스 럽 고 유지 하기 쉽 지 않 습 니 다.이 럴 때 는 여러 파일 이 필요 합 니 다.다 중 파일 을 사용 할 때 전체 프로그램 을 분리 할 수 있 습 니 다.예 를 들 어 헤더 파일,함수 파일,주 함수 파일 로 나 눌 수 있 습 니 다.물론 필요 하 다 면 계속 세분 화 할 수 있다.
다음 에 우 리 는 위의 삼자 기 코드 를 블록 으로 나 누 어 쓴다.
우선 우 리 는 세 개의 파일 을 만 들 수 있 습 니 다.하나의 헤더 파일 game.h,두 개의 원본 파일 game.c,test.c.

game.h
game.h 에서(ROW 와 COL)와 헤더 파일,그리고 정의 할 함수 에 대한 설명 을 먼저 설명 할 수 있 습 니 다.
game.h 는 각 함수 에 대한 성명 입 니 다.game.c 는 각 함수 의 코드 구현 입 니 다.test.c 는 주 함수 파일 로 각 삼자 기 에 사용 되 는 함수 호출 을 책임 집 니 다.

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define COL 3
#define ROW 3
void game(char arr[ROW][COL], int row, int col);
void InitBoard(char arr[ROW][COL],int row,int col);
void diaplayBoard(char arr[ROW][COL], int row, int col);
void playmove(char arr[ROW][COL], int row, int col);
void computermove(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);
int Is_Full(char arr[ROW][COL], int row, int col);
game.c
game.c 에서\#include"game.h"를 참조 하고 이 를 참조 하면 game.h 에서 정 의 된 변수 와 함 수 를 사용 할 수 있 습 니 다.

#include"game.h"
void game(char arr[ROW][COL], int row, int col)
{
 char ch;
 InitBoard(arr, row, col);

 diaplayBoard(arr, row, col);

 while (1) 
 {
  playmove(arr, row, col);
  diaplayBoard(arr, row, col);
  ch = IsWin(arr, row, col);
  if (ch != 'c') 
  {
   break;
  }

  computermove(arr, row, col);
  diaplayBoard(arr, row, col);
  ch = IsWin(arr, row, col);
  if (ch != 'c')
  {
   break;
  }

 }

 if (ch == '*') 
 {
  printf("   
"); } else if (ch == '#') { printf("
"); } else if (ch == 'q') { printf("
"); } } int Is_Full(char arr[ROW][COL], int row, int col) { int i = 0; int j = 0; int count = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (arr[i][j] != ' ') { count++; } } } if (count == row * col) { return 1; } return -1; } char IsWin(char arr[ROW][COL], int row, int col) { int i = 0; int j = 0; int count1 = 0; int count2 = 0; if (Is_Full(arr, row, col) == 1) { return 'q'; } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') { return arr[i][1]; } else if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') { return arr[i][1]; } else if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') { return arr[0][0]; } else if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ') { return arr[0][2]; } } } return 'c'; } void InitBoard(char arr[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { arr[i][j] = ' '; } } } void diaplayBoard(char arr[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ",arr[i][j]); if(j < col - 1) printf("|"); } printf("
"); if(i < col - 1) for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("
"); } } void playmove(char arr[ROW][COL], int row, int col) { do { int x = 0, y = 0; int i = 0, j = 0; printf(" :>"); scanf("%d%d", &x, &y); if ((x > 0 && x <= row) && (y > 0 && y <= col)) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = '*'; break; } else { printf("
"); } } else { printf("
"); } } while (1); } void computermove(char arr[ROW][COL], int row, int col) { do { int x = 0, y = 0; x = rand() % row; y = rand() % col; if ((x >= 0 && x <= 2) && (y >= 0 && y <= 2)) { if (arr[x][y] == ' ') { arr[x][y] = '#'; break; } } } while (1); }
test.c
그리고 test.c 주 함수 파일 에서\#include"game.h"를 참조 하고 이 를 참조 하면 game.h 에서 정 의 된 변수 와 함 수 를 사용 할 수 있 습 니 다.

#include"game.h"

void menu()
{
 printf("****************************
"); printf("********** 1、play *********
"); printf("********** 0、exit *********
"); printf("****************************
"); } int main() { int input = 0; srand((unsigned int)time(NULL)); char arr[ROW][COL]; menu(); do { printf(" ;>
"); scanf("%d", &input); switch (input) { case 1: game(arr,ROW,COL); break; case 0: break; default: printf("
"); break; } } while (input); return 0; }
감사합니다. 이상 은 블 로 거들 이 자신의 이해 조직의 코드 와 표현 형식 에 따라 여러분 에 게 도움 이 되 기 를 바 랍 니 다.
총결산
다 중 파일 프로 그래 밍 은 유지 와 개발 에 유리 하 므 로 여러분 들 이 가능 한 한 빨리 이런 좋 은 습관 을 기 르 시기 바 랍 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기