Cで三目並べを実現する


本論文の例では、C言語で三子棋を実現する具体的なコードを共有しました。参考にしてください。具体的な内容は以下の通りです。
三目並べの意味:
三目並べは白黒の一種です。三子棋は九宮棋、圏点チャーチ、一条竜、井字棋などとも言います。正方形の対角線をつないで、双方に対して順次3つの双方の駒を並べて、自分の3つの駒を1本の線に歩くのでさえすれば、相手は負けます。しかし、多くの場合は引き分けとなることがあります。凡例は以下の通りです

基本的な考え方:
1.ユーザーインタラクティブメニュー画面の作成
2.ボードを初期化する
3.ボードパネルを表示します。(ボードを繰り返し表示しないように、スクリーンで操作します。)
4.ユーザー落下
5.勝負を判断する
6.コンピュータがランダムで正確に落ちる
7.勝負を判断する
(プログラムを書くたびに、下図のように考えや疑似コードを書くことができます。)

複数のファイル項目を作成:
コードを書く前に、まず三つのファイルを作成して、後のコードがより完全に明確に現れやすいようにします。

1.ユーザーインタラクティブメニュー画面の作成

void Meau(){
 printf("+------ meau ----------+
"); printf("|---- 1.play --------|
"); printf("|---- 0.quit --------|
"); printf("+----------------------+
"); }
2.ボードを初期化する
マクロ定義を使用して、ボードの内容を空に初期化します。

static void InitBoard(char board[][COL], int row, int col){
 for (int i = 0; i < row; i++){
  for (int j = 0; j < col; j++){
   board[i][j] = INIT;
  }
 }
}
3.ボードパネルを表示する
ボードを繰り返し表示しないために、スクリーンを使って操作します。毎回現実的なボードは一枚だけです。
継続的な調整によって,最終インターフェースは期待される必要な界面と一致するようにした。

static void ShowBoard(char board[][COL],int row,int col){
 system("cls");//    
 printf("  ");
 for (int i = 0; i < col; i++){
  printf(" %3d", i + 1);
 }
 printf("
----------------
"); for (int i = 0; i < row; i++){ printf("%-2d", i + 1); for (int j = 0; j < col; j++){ printf("| %c ", board[i][j]); } printf("
----------------
"); } }
4.ユーザー落下
落子は空の位置にしか落ちられないので、落子の前に空を判定しなければなりません。空なら落子します。

static void PlayerMove(char board[][COL], int row, int col){
 int x = 0;
 int y = 0;
 while (1){
  printf("please enter your postion<x,y>: ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>3 || y<1 || y>3){
   printf("Postion Error!");
   continue;
  }
  if (board[x - 1][y - 1] == INIT){
   board[x - 1][y - 1] = WHITE;
   break;
  }
  else{
   printf("Postion Is Not Empty!
"); } } }
5.コンピュータがランダムで正確に落ちる
乱数を使って、正しい位置に落下します。

static void ComputerMove(char board[][COL], int row, int col){
 while (1){
  int x = rand() % row;
  int y = rand() % col;
  if (board[x][y] == INIT){
      board[x][y] = BLACK;
   break; 
  }
 }
}
6.勝負を判断する

static char IsEnd(char board[][COL], int row, int col){
 for (int i = 0; i < row; i++){
  if (board[i][0] == board[i][1] && \
   board[i][1] == board[i][2] && \
   board[i][0] != INIT){
   return board[i][0];
  }
 }
 for (int j = 0; j < col; j++){
  if (board[0][j] == board[1][j] && \
   board[1][j] == board[2][j] && \
   board[0][j] != INIT){
   return board[0][j];
  }
 }
 if (board[0][0] == board[1][1] && \
  board[1][1] == board[2][2] && \
  board[0][0] != INIT){
  return board[0][0];
 }
 if(board[0][2] == board[1][1] && \
  board[1][1] == board[2][0] && \
  board[1][1] != INIT){
  return board[1][1];
 }
 for (int i = 0; i < row; i++){
  for (int j = 0; j < col; j++){
   if (board[i][j] == INIT);
   return NEXT;
  }
 }
 return DRAW;
}
7.Gameインターフェースを作成する

void Game()
{
 char board[ROW][COL];
 InitBoard(board, ROW, COL);
 srand((unsigned long)time(NULL));
 char result = 0;
 while (1){
  ShowBoard(board, ROW, COL);
  PlayerMove(board, ROW, COL);
  result = IsEnd(board, ROW, COL);
  if (result != NEXT){
   break;
  }
 
 ShowBoard(board, ROW, COL);
 ComputerMove(board, ROW, COL);
 result = IsEnd(board, ROW, COL);
 
 if (result != NEXT){
  break;
     }
 }
 ShowBoard(board, ROW, COL);
 switch (result){
 case WHITE:
  printf("You win!
"); break; case BLACK: printf("you lose!
"); break; case DRAW: printf("it ends in a draw
"); break; defult: printf("bug
"); break; } }
完全コード

//main.c  
#include"game.h"
 
void Meau(){
 printf("+------ meau ----------+
"); printf("|---- 1.play --------|
"); printf("|---- 0.quit --------|
"); printf("+----------------------+
"); } int main(){ int select = 0; int quit = 0; while (!quit) { Meau(); printf("please enter your choose: "); scanf("%d", &select); switch (select) { case 1: Game(); break; case 0: quit = 1; break; defult: printf("Select error!Try again!
"); break; } } printf("byebye!
"); system("pause"); return 0; } //game.c #include"game.h" static void InitBoard(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ board[i][j] = INIT; } } } static void ShowBoard(char board[][COL],int row,int col){ system("cls"); printf(" "); for (int i = 0; i < col; i++){ printf(" %3d", i + 1); } printf("
----------------
"); for (int i = 0; i < row; i++){ printf("%-2d", i + 1); for (int j = 0; j < col; j++){ printf("| %c ", board[i][j]); } printf("
----------------
"); } } static char IsEnd(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ if (board[i][0] == board[i][1] && \ board[i][1] == board[i][2] && \ board[i][0] != INIT){ return board[i][0]; } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && \ board[1][j] == board[2][j] && \ board[0][j] != INIT){ return board[0][j]; } } if (board[0][0] == board[1][1] && \ board[1][1] == board[2][2] && \ board[0][0] != INIT){ return board[0][0]; } if(board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != INIT){ return board[1][1]; } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == INIT); return NEXT; } } return DRAW; } static void PlayerMove(char board[][COL], int row, int col){ int x = 0; int y = 0; while (1){ printf("please enter your postion<x,y>: "); scanf("%d %d", &x, &y); if (x<1 || x>3 || y<1 || y>3){ printf("Postion Error!"); continue; } if (board[x - 1][y - 1] == INIT){ board[x - 1][y - 1] = WHITE; break; } else{ printf("Postion Is Not Empty!
"); } } } static void ComputerMove(char board[][COL], int row, int col){ while (1){ int x = rand() % row; int y = rand() % col; if (board[x][y] == INIT){ board[x][y] = BLACK; break; } } } void Game() { char board[ROW][COL]; InitBoard(board, ROW, COL); srand((unsigned long)time(NULL)); char result = 0; while (1){ ShowBoard(board, ROW, COL); PlayerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } ShowBoard(board, ROW, COL); ComputerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } } ShowBoard(board, ROW, COL); switch (result){ case WHITE: printf("You win!
"); break; case BLACK: printf("you lose!
"); break; case DRAW: printf("it ends in a draw
"); break; defult: printf("bug
"); break; } } //game.h #ifndef __GAME_H__ #define __GAME_H__ #include<stdio.h> #include <time.h> #include <stdlib.h> #include<windows.h> #pragma warning(disable:4996) #define ROW 3 #define COL 3 #define INIT ' ' #define WHITE 'X'//player #define BLACK 'O'//computer #define DRAW 'D' #define NEXT 'N' extern void Game(); #endif
コード結果表示

以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。