三子棋游戏的简单实现(C语言后附完整代码)(上)

简介: 三子棋游戏的简单实现(C语言后附完整代码)(上)

三子棋又叫井字棋,规则为在一个3*3的棋盘里对弈,最后三子一线则为赢。而接下来我们将用C语言来简单实现它。实现结果展示大概为这样,具体实现请看下文



博主使用的是VS2019进行编译,有对该编译器感兴趣或想要下载链接的可以私信博主

首先呢我们先创建一个工程,在此工程中创建三个文件为



game.h 为我们所创建的头文件,里面有我们所需要的所有函数声明

game.c 为我们三子棋游戏的具体实现

test.c 为我们的主函数所在,和实现

写一个代码,我们从它的主函数开始写起,那么我们这个主函数该怎么写呢;我们写一个游戏,首先是不是得有一个游戏界面,得让使用者知道要干些什么;而且得让他有的选择;其次呢万一玩家完了之后还要继续玩呢?当我们知道这些后就可开始test.c的实现了;


void menu()
{
  printf("********  三子棋游戏  ********\n");
  printf("******** 1 .  玩游戏   *******\n");
  printf("******** 2 . 退出游戏  *******\n");
  printf("**规则:一次一子,三子相连为赢\n");
  printf("******************************\n");
}

首先我们创建一个menu()的函数来实现菜单的打印

int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));//产生随机数,与rand()搭配使用,在game()中会用到
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);//进行选择
    switch (input)
    {
    case 1:
      game();//game()的实现后续会讲到
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择!\n");
      break;
    }
    getchar();//两个getchar(),是为了吃掉回车,后续会讲到具体用处
    getchar();
    system("cls");//清空前面输出的棋盘,使页面更加整洁(每一局结束后清理)
  } while (input);
  return 0;
}


这就是我们的主函数,因为博主觉得菜单不算game()函数的具体实现,便放在了test.c里

我们来看一下博主写的test.c


#include "game.h"//我们自己创建的头文件
void menu()
{
  printf("********  三子棋游戏  ********\n");
  printf("******** 1 .  玩游戏   *******\n");
  printf("******** 2 . 退出游戏  *******\n");
  printf("**规则:一次一子,三子相连为赢\n");
  printf("******************************\n");
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择!\n");
      break;
    }
    getchar();
    getchar();
    system("cls");
  } while (input);
  return 0;
}


接下来我们来到最难的game()函数的实现了,这里我们采用二维数组来实现

首先我们得对数组初始化,其次呢我们得有个棋盘,然后呢就是下棋过程,分为玩家下棋,和电脑下棋,而每一轮下完棋后,又需要进行判断输赢情况。

那么我们就有了思路,可分为以下几个模块来写:

       1.数组的初始化

       2.打印棋盘

       3.选手输入

       4.电脑输入

       5.判断输赢

在函数篇讲到函数:先声明后使用

则在头文件game.h里的函数声明如下


#pragma once
#include<stdio.h>
#include<time.h>
#include<windows.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()函数的实现部分;


1.数组的初始化


在这里我们从最开始结果展示可以发现,最开始是什么都没有·,所以都初始化为空格,数组初始化不懂得可以看看博主对数组篇得讲解


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] = ' ';
    }
  }
}


 2.打印棋盘

我们先来看一下我们所需要得棋盘长什么样子?



接下来我们看一下具体得代码实现


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("|");//因为最后一个字符不用打印'|',所一只用打印col-1次
    }
    printf("\n");
    for (j = 0; j < row; j++)
    {
      if (i < row - 1)//同理,后一行不打印
      {
        printf("---");//产生棋盘的分割线
        if (j < col - 1)//与上面相同,最后一个不用打印
          printf("|");
      }
    }
    printf("\n");
  }
}


关于每一步得思路和注释已经写在了代码里,有需要得宝子可以看一下


3.选手输入


选手输入时不但要做出提示,还得对输入的位置进行判断,此处是否能落子,实现代码如下


void PlayerMove(char board[ROW][COL], int row, int col)
{
  printf("玩家输入\n");
  printf("请输入一个坐标,中间用空格隔开>:");
  int x = 0;
  int y = 0;
  while (1)//若不对可循环输入
  {
    scanf("%d%d", &x, &y);
    if ((x<1 && x>row) || (x<1 && x>col))
      printf("非法输入,请重新输入\n");
    if (board[x - 1][y - 1] == ' ')//玩家输入的坐标都是从一开始的,而数组的下标是从0开始的,
    {                              //所以需要减一
      board[x - 1][y - 1] = '*';//我们让玩家下的棋子为'*';
      break;//输入正确跳出循环
    }
    else printf("此处已被占用,请重新输入\n");
  }
}


测试一下,实现成功


相关文章
|
1月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
90 0
|
9天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
21 1
|
1月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
1月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
1月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
82 1
|
1月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
1月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
35 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
机器学习/深度学习 人工智能 固态存储
C语言决赛代码
#include #include #include struct book { int num; char bname[50]; char wname[20]; char press[50]; char sort[50]; int time; float p...
853 0
|
8天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
25 6