C 언어 로 오목 게임 을 하 겠 습 니 다.

7603 단어 C 언어오목
C 언어 로 오목 을 쓰 고 다 중 파일 형식 을 사용 하 며 코드 를 사용 하 는 것 이 더 보기 좋다.여기 서 제 가 실현 하 는 기능 은 2 인 게임 입 니 다.만약 에 인간 과 컴퓨터 의 대전 을 실현 하려 면 코드 가 복잡 합 니 다.
1.main.c
기조 함수 에서 먼저 사용자 에 게 선택 할 수 있 는 인 터 페 이 스 를 제공 해 야 합 니 다.여기 서 우 리 는 1 을 선택 하면 게임 을 시작 하고 2 를 선택 하면 게임 을 종료 합 니 다.코드 는 다음 과 같 습 니 다.

#include "gobang.h"
void Mean(){
 printf("-----------------------
"); printf(" 1.play 2.drop up
"); printf("-----------------------
"); } int main(){ int seclet = 0; int c = 0; while (!c){ Mean(); printf("Please choose number:
"); scanf("%d", &seclet); switch (seclet){ case 1: Game(); break; case 2: c = 1; break; default: printf("Please Enter Once:
"); break; } } printf("Byebye~
"); system("pause"); return 0; }
함수 실행 이 시작 되면 디 스 플레이 상자 에 숫자 입력 을 알려 줍 니 다.1 은 게임 에 들 어가 기 위해 Game()함 수 를 호출 합 니 다.2.게임 을 종료 하기 위해 서 입 니 다.그 중에서 while 순환 의 역할 은 사용자 가 인터페이스 에 들 어가 서 오류(0 또는 1 이 아 닌)를 입력 하거나 게임 을 한 번 완성 한 후에 옵션 을 계속 팝 업 하 는 것 입 니 다.0 을 입력 해 야 num 을 0 으로 설정 하고 순환 을 종료 합 니 다.
2.gobang.h
함수 의 헤더 파일 은 매크로 정의 와 함수 의 성명 을 포함 하고 코드 는 다음 과 같 습 니 다.

#pragma once
 
#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <windows.h>
 
 
#define ROW 10//      
#define COL 10//      
 
#define PLAYER1 1//  1    1
#define PLAYER2 2//  2    2
#define NEXT 3//NEXT    
#define DRAW 4//DRAW    
 
#define U 10// 
#define RU 11//  
#define R 12// 
#define RD 13//  
#define D 14// 
#define LD 15//  
#define L 16// 
#define LU 17//  
 
extern void Game();//     
3.gobang.c
오목 의 주요 논 리 는 먼저 바둑판 을 인쇄 한 다음 에 게이머 들 이 한 걸음 한 걸음 걸 어서 5 자(성공 하면 튀 어 나 오기)로 연결 되 는 지 판단 하 는 것 이다.출력 한 후의 바둑판 을 인쇄 하고 게이머 들 은 두 걸음 한 걸음 걸 어서 5 자 로 연결 되 는 지 다시 판단 한 다음 에 출력 한 후의 바둑판 을 인쇄 하 는 것 이다.
그래서 Game()함수 외 에 다음 과 같은 몇 개의 인 터 페 이 스 를 실현 해 야 합 니 다.

Print()//    
Player()//    
Judge//        
1.Game()
오목 의 주요 코드 는 모두 이 파일 에 쓰 여 있 습 니 다.test.c 에는 헤더 파일 test.h 가 포함 되 어야 합 니 다.Game()함 수 는 다른 함 수 를 호출 하여 전체 바둑 과정 을 실현 합 니 다.두 게이머 가 바둑 을 두 는 것 은 같은 조작 이기 때문에 같은 함 수 를 호출 합 니 다.들 어 오 는 게이머 의 매개 변수 만 다 르 고 변 수 를 정의 합 니 다.who 는 매번 while 순환 에 들 어 갈 때마다 who 의 값 이 한 번 변 합 니 다.상세 한 과정 은 다음 과 같은 코드 와 설명 을 볼 수 있 습 니 다.

void Game(){
 int checkerboard[ROW][COL] = { 0 };//        
 int result = 0;//    
 int who = PLAYER1;//    who    PLAYER1  
 while (1){//     
  Print(checkerboard);//       
  Player(checkerboard, ROW, COL, who);//      
  result = Judge(checkerboard);
  if (result != NEXT){//  result      NEXT,        
   break;
  }
  who = (who == PLAYER1 ? PLAYER2 : PLAYER1);//       who        
 }
 Print(checkerboard);//        
 switch (result){
 case PLAYER1://    PLAYLER1,     
  printf("PLALYER1 win
"); break; case PLAYER2:// PLAYER2, printf("PLAYER2 win
"); break; case DRAW:// DRAW, printf("IS DRAW"); break; } }
2.Print()
바둑판 을 인쇄 하 는 함 수 는 실현 하기 어렵 지 않 습 니 다.코드 는 다음 과 같 습 니 다.

void Print(int board[][COL]){//      
 //system("cls");
 printf(" ");
 for (int i = 0; i < ROW; i++){//     1 10
  printf(" %d ", i);
 }
 printf("
"); for (int i = 0; i < ROW; i++){ printf("%d", i); for (int j = 0; j < COL; j++){ if (board[i][j] == 0){ printf(" . ");// } else{ printf(" %d ", board[i][j]);// } } printf("
"); } }
3.Player()
이 함 수 는 board[x][y]에 x,y 좌표 에 따라 값 을 부여 하고 값 을 PLAYER 1 또는 PLAYER 2 로 부여 합 니 다.x,y 를 전역 변수 로 정의 하고 그 생명 주 기 를 연장 하 는 데 주의해 야 한다.작용 은 매번 떨 어 지 는 위 치 를 기록 하고 다섯 개의 연결 여 부 를 계산 하 는 데 편리 하 다.Player()함수 코드 는 다음 과 같 습 니 다.

int x = 0;//    x
int y = 0;//    y

void Player(int board[][COL],int row,int col,int  c){
 while (1){
  printf("Please Enter x y:
"); scanf("%d%d",&x,&y); if (x<0 || x>row - 1 || y<0 || y>col - 1){//x,y while printf("Eorr
"); continue; } if (board[x][y] == 0){// , board[x][y] = c;// board[][] PLAYER1 PLAYER2 break;// } else{ printf(" ,
:"); continue; } } }
4.Judge()
5 자 연속 여 부 를 판단 하 는 것 은 가장 어 려 운 일이 다.여기 서 8 개 방향 으로 정 의 된 것 이 바로 사용 된다.다섯 자 를 잇 는 것 은 네 가지 상황,가로,세로,사선(두 가지 상황)일 뿐 아니 라 네 방향 바둑돌 의 수량 만 통계 해 야 한다.여기 서 왜 if()판단 의 조건 은>=4 인지 설명 한다.Calculation()함수 에서 특정한 방향의 바둑 알 수(그 8 개 방향)를 통계 할 때 현재 바둑 알 의 위 치 는 이미 알 고 있 습 니 다.만약 에 그 위 에 네 개의 바둑 알 이 있다 면 다섯 알 은 이미 연결 되 었 습 니 다.그러나 계수기 의 초기 값 은 0 이기 때문에 이때 count 의 값 은 4 이 고 함수 의 반환 값 도 4 이기 때문에 Judge()함수 에서...if()의 조건 은>=4(이때>4 의 경우 일반적으로 발생 하지 않 습 니 다)입 니 다.나머지 상세 코드 는 다음 과 같다.

int Judge(int board[][COL]){
 if (Calculation(board, U) + Calculation(board, D)>=4 || \
  //         ,                 
  Calculation(board, RU) + Calculation(board, LD) >= 4 || \
  //           ,                
  Calculation(board, R) + Calculation(board, L) >= 4 || \
  //         ,               
  Calculation(board, RD) + Calculation(board, LU) >= 4){
  //           ,                 
  return board[x][y];
 }
 for (int i = 0; i < ROW; i++){//            ,    
  for (int j = 0; j < COL; j++){
   if (board[i][j] == 0){
    return NEXT;
   }
  }
 }
 return DRAW;//               ,  
}
int Calculation(int board[][COL], int direction){//       
 int _x = x;//            
 int _y = y;//            
 int count = 0;//   
 while (1){//              
  switch (direction){
  case U://   y    ,x    ,      
   _x--; break;
  case D:
   _x++; break;
  case L:
   _y--; break;
  case R:
   _y++; break;
  case RU:
   _x--; _y++; break;
  case RD:
   _x++; _y++; break;
  case LD:
   _x++; _y--; break;
  case LU:
   _x--; _y--; break;
  default:
   break;
  }
  if (_x<0 || _x>ROW - 1 || _y<0 || _y>COL - 1){//             ,        
   break;
  }
  else{
   if (board[x][y] == board[_x][_y]){//           
    count++;//     
   }
   else{
    break;//           ,    
   }
  }
 }
 return count;
}
우 리 는 또한 Print()함수 에 system("cls")을 추가 할 수 있 습 니 다.이 함 수 는 스크린 조작 입 니 다.게다가 한 장의 바둑판 에서 바둑 을 두 는 것 입 니 다.또한 바둑 알 을 출력 하 는 내용 도 개선 할 수 있 습 니 다.예 를 들 어

이렇게 하면 서로 다른 기호 로 바둑 알 을 대표 할 수 있다.최종 운행 결 과 는 다음 과 같다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기