三子棋——“C”

简介: 三子棋——“C”

         

今天,小雅兰来给大家介绍一下三子棋游戏,如果大家真的懂了三子棋的原理的话,那么以此类推,五子棋这些是完全没有问题的。


首先,我们都应该知道,利用C语言写一个代码,如果这个代码的数量比较多,仍然把这些代码放入一个.c文件中,那自然是不可取的,所以,我今天给大家介绍的用C语言写的三子棋游戏,分为三个文件来写。


test.c——这个文件是用来测试游戏逻辑的


game.c——这个文件是函数的实现


game.h——这个文件是函数的声明


然后,我还想给大家拓展一个知识点


头文件的结构


头文件开头处的版权和版本声明

预处理块

函数和类结构声明

         为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块


         用 #include filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)


         用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)


         头文件中只存放“声明”而不存放“定义”


头文件的作用


通过头文件来调用库功能

           在很多场合,源代码不便(或不准)向用户公布,只 要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库 功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。


头文件能加强类型安全检查

           如果某个接口被实现或被使用时,其方式与头文件 中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。


接下来,我们就来实现我们的小游戏啦


这是game.h的内容,也就是我刚才给大家拓展的一个小知识点,里面放有库函数的包含和函数的声明

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

这是game.c的内容,各种定义的函数的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      board[i][j] = ' ';
    }
  }
}
//初始化棋盘还有另外一种简洁的写法
//void InitBoard(char board[ROW][COL], int row, int col)
//{
//  memset(&board[0][0], ' ', row * col * sizeof(board[0][0]));
//}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++ )
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      printf(" %c ", board[i][j]);
      if (j < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("___");
        if (j < col - 1)
        {
          printf("|");
        }
      }
    }
    printf("\n");
  }
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋:>\n");
  while (1)
  {
    printf("请输入要下棋的坐标:>");
    scanf("%d %d", &x, &y);
    //玩家不是程序员
    //所以玩家并不知道数组的下标是从0开始
    //那么三子棋的第0行第0列玩家会认为这是第1行第1列
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (board[x - 1][y - 1] == ' ')
      {
        board[x - 1][y - 1] = '*';
        break;
      }
      else
      {
        printf("坐标被占用,请重新输入\n");
      }
    }
    else
    {
      printf("坐标非法,请重新输入\n");
    }
  }
}
//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("电脑下棋:>\n");
  while (1)
  {
    x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}
//判断输赢
//玩家赢,返回‘*’
//电脑赢,返回‘#’
//平局,返回‘Q’
//继续游戏,返回‘C’
int IsFull(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
      {
        return 0;
      }
    }
  }
  return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
  //行
  //列
  //对角线
  int i = 0;
  for (i = 0; i < row; i++)
  {
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    {
      return board[i][0];
    }
  }
  for (i = 0; i < col; i++)
  {
    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][i];
    }
  }
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  {
    return board[1][1];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  {
    return board[1][1];
  }
  //判断是否平局
  if (IsFull(board, ROW, COL))
  {
    return'Q';
  }
  //游戏继续
  return 'C';
}

这是test.c的内容,是来测试游戏的逻辑

1.#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//首先,打印一个简易菜单
void meun()
{
  printf("###################################################\n");
  printf("#################1.play############################\n");
  printf("#################0.exit############################\n");
  printf("###################################################\n");
}
void game()
{
  //存放数据需要一个3*3的二维数组
  char board[ROW][COL] = { 0 };
  //初始化棋盘
  InitBoard(board, ROW, COL);
  //显示棋盘
  DisplayBoard(board,ROW, COL);
  char ret = 0;
  while (1)
  {
    //玩家下棋
    PlayerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    //IsWin:玩家赢,返回‘*’
    //电脑赢,返回‘#’
    //平局,返回‘Q’
    //继续游戏,返回‘C'
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
    //电脑下棋
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
  }
  if (ret == '*')
  {
    printf("玩家赢\n");
  }
  else if (ret == '#')
  {
    printf("电脑赢\n");
  }
  else if (ret == 'Q')
  {
    printf("平局\n");
  }
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    meun();
    printf("请选择:>\n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

好啦,这就是我写的一个小小的三子棋游戏,小雅兰通过这个小游戏还是学到了很多内容的,不知道大家如何呢?接下来,我把我写的这个游戏运行一下,看最后的结果究竟是怎么样的呢?


image.png

哎呀,小雅兰不够聪明,让电脑钻了一个空子,哈哈,接下来就看大家的啦,你们的结果是电脑赢呢,还是玩家赢,亦或是平局?

敬请期待大家的结果!!!

相关文章
|
6月前
|
C语言
简易三子棋的实现
简易三子棋的实现
|
6月前
|
存储
三子棋游戏的实现
三子棋游戏的实现
59 0
三子棋的创建
三子棋的创建
82 0
|
6月前
|
人工智能 C语言
三子棋小游戏
三子棋小游戏
|
6月前
|
算法 C语言
三子棋小游戏(可改棋盘大小)
三子棋小游戏(可改棋盘大小)
76 0
|
11月前
简单三子棋的实现
简单三子棋的实现
64 0
|
程序员 C语言
三子棋(超详细)
三子棋(超详细)
|
C语言
C/【三子棋】
C/【三子棋】
三子棋的实现有这么简单吗?
三子棋的实现有这么简单吗?
50 0