首页 > 编程语言 > 用C语言实现三子棋
2021
08-08

用C语言实现三子棋

本文实例为大家分享了用C语言实现三子棋的具体代码,供大家参考,具体内容如下

三子棋含义:

三子棋是黑白棋的一种。三子棋又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。图例如下:

基本思路:

1.创建用户交互菜单界面

2.初始化棋盘

3.显示棋盘面板(为了不重复显示棋盘,使用清屏操作)

4.用户落子

5.判断胜负

6.电脑随机正确落子

7.判断胜负

(在每次写程序之前,可以向如下图所示,写出思路或伪代码

创建多文件项目:

写代码之前,首先建立三个文件,以方便后序代码更加完整清晰地呈现。

1.创建用户交互菜单界面

void Meau(){
 printf("+------ meau ----------+\n");
 printf("|----  1.play  --------|\n");
 printf("|----  0.quit  --------|\n");
 printf("+----------------------+\n");
}

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("\n----------------\n");
 for (int i = 0; i < row; i++){
  printf("%-2d", i + 1);
  for (int j = 0; j < col; j++){
   printf("| %c ", board[i][j]);
  }
  printf("\n----------------\n");
 }
}

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!\n");
  }
 }
}

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!\n");
  break;
 case BLACK:
  printf("you lose!\n");
  break;
 case DRAW:
  printf("it ends in a draw\n"); 
  break;
 defult:
  printf("bug\n");
  break;
 }
}

完整代码

//main.c文件
#include"game.h"
 
void Meau(){
 printf("+------ meau ----------+\n");
 printf("|----  1.play  --------|\n");
 printf("|----  0.quit  --------|\n");
 printf("+----------------------+\n");
}
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!\n");
    break;
      }
  }
 printf("byebye!\n");
 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("\n----------------\n");
 for (int i = 0; i < row; i++){
  printf("%-2d", i + 1);
  for (int j = 0; j < col; j++){
   printf("| %c ", board[i][j]);
  }
  printf("\n----------------\n");
 }
}
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!\n");
  }
 }
}
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!\n");
  break;
 case BLACK:
  printf("you lose!\n");
  break;
 case DRAW:
  printf("it ends in a draw\n"); 
  break;
 defult:
  printf("bug\n");
  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

代码结果显示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

编程技巧