C语言实现三子棋程序

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

先直接上代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>     //2.实现三子棋游戏。
#include<Windows.h>    //Sleep() RAND_MAX 的头文件

void menu()            //打印菜单
{
  printf("****************************\n");
  printf("**** 欢迎来到三子棋游戏 ****\n");
  printf("**** 1、  进入游戏   ****\n");
  printf("**** 0、  退出游戏   ****\n");
  printf("****************************\n");
  printf("请输入:->");
}

void print_chessboard(char coord[][3])  //打印棋盘函数
{    //多维数组在传参时,接收数组的形参最多只能是第一个方括号里没有数字(下标范围)
     //否则就会出错(因为此时编译器不知道你要把传过来的数组的元素划分成几行几列,
     //但是当除第一个方括号的其他方括号都有值时,就可以经过计算知道第一个方括号的值是多少
  int i = 0;
  int index_x = 0;
  int index_y = 0;
  for (i = 1; i <= 153; i++)
  {
    char out_ch = ' ';
    if ((i % 51 == 20) || (i % 51 == 26) || (i % 51 == 32) )
    {
      out_ch = coord[index_x][index_y];
      index_x++;
      if (index_x < 3)
      {
        index_x = 0;
        index_y++;
      }
    }
    else if ((i % 17 == 6) || (i % 17 == 12))
    {
      out_ch = '|';
    }
    else if( (i >= 35 && i <= 51 && i != 40 && i != 46) || \
         (i >= 86 && i <= 102 && i != 91 && i != 97))
    {
      out_ch = '_';
    }
    putchar(out_ch);
    if (i % 17 == 0)         //每输出 17 个字符换下一行输出
    {
      printf("\n");
    }
  }
}

void winer(char coord[][3], int *flag);   //赢家判断函数的声明

int computer(char coord[][3])                //电脑下棋
{
  int flag = 0;
  int index_x2 = 0;
  int index_y2 = 0;
  srand((unsigned)time(NULL));
  while (1)
  {
    index_x2 = 2 * rand() / RAND_MAX;         //产生 0--2 的随机数
    index_y2 = 2 * rand() / RAND_MAX;
    if ((coord[index_x2][index_y2] != '*') && (coord[index_x2][index_y2] != 'o'))
    {                         //判断该位置是否已有落子
      coord[index_x2][index_y2] = 'o';
      winer(coord, &flag);
      if (flag == 1)
      {
        return 1;
      }
      return 0;
    }
  }
}

int player(char coord[][3], int index_x1, int index_y1) //玩家下棋
{
  int flag = 0;
  int ret = 0;
  if ((coord[index_x1][index_y1] == '*') || (coord[index_x1][index_y1] == 'o'))
  {                           //判断该位置是否已有落子
    printf("此位置已有棋子,请重下!\n");
    return 0;
  }
  else
  {
    coord[index_x1][index_y1] = '*';
    winer(coord, &flag);
    if (flag == 1)
    {
      return 1;
    }
    ret = computer(coord);
    if (ret == 1)
    {
      return 1;
    }
    print_chessboard(coord);    //把打印棋盘放在是因为想在两人都走完一次后再打印当前棋盘状态
  }
  return 0;
}

void winer(char coord[][3],int *flag)      //判断是否产生赢家,赢家是谁
{
  char line_ch[8][4] = { { coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] }, \
              { coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] }, \
              { coord[0][2], coord[1][2], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] }, \
              { coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] } };
              //把所有能赢的情况定义成一个字符串数组
  int i = 0;
  for (i = 0; i < 8; i++)
  {
    if (strcmp(line_ch[i],"***") == 0)  //判断此时玩家已输入的落子能不能组成一个使玩家能赢的字符串
    {
      print_chessboard(coord);     //先打印棋盘,再判断谁胜谁负
      printf("\n恭喜您赢了!\n");
      *flag = 1;           //玩家赢,使最开始设置的赢的标志位为1,结束此次游戏
      return;
    }
    else if (strcmp(line_ch[i],"ooo") == 0)
    {
      print_chessboard(coord);
      printf("\n很遗憾,您输了!\n");
      *flag = 1;
      return;
    }
    else
    {
      ;
    }
  }
}

int main()
{
  while (1)
  {
    int num = 0;      //决定开始或退出游戏
    int x = 0;
    int y = 0;
    int i = 4;       //一次游戏最多的内层while循环可循环的次数
    int ret = 0;      //是否结束此次游戏的标志位
    int is_play = 0;    //是否再次玩游戏的标志位
    char coordinate[3][3] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
                //为了拓展游戏比较方便,可以把行和列定义成宏定义
    menu();
    scanf("%d", &num);
    if (num == 0)
    {
      printf("5秒后退出程序!\n");
      Sleep(5000);
      exit(0);
    }
    computer(coordinate);   //因为设计电脑智商低,所以游戏开始前先让电脑落一子
    print_chessboard(coordinate);
    while ((i))        //因为总共有九个位置可以落子,已用一个,还剩八个,每次循环不结束的话会用掉两个
                  //所以最多循环四次
    {
      printf("请输入 X、Y 的坐标(0--2)来确定你下棋的位置:");  //也可以加一个判断输入是否合法
      scanf("%d %d", &x, &y);
      ret = player(coordinate, x, y);
      if (ret == 1)
      {
        break;
      }
      i--;
    }
    printf("\n");
    printf("请选择接下来的操作:\n");
    printf("1、 再玩一次游戏  0、退出游戏系统\n");
    scanf("%d", &is_play);
    if(is_play == 0)
    {
      printf("5秒后退出程序!\n");
      Sleep(5000);
      exit(0);
    }
    else
    {
      system("cls");
    }
  }
  system("pause");
  return 0;
}

程序一共设计了六个函数,一个主函数,五个自定义函数— 菜单打印函数、棋盘打印函数、电脑下棋函数、玩家下棋函数、赢家判断函数。

其中最难设计的就是棋盘打印函数和赢家判断函数。这两个函数需要完成的任务多,计算量大,逻辑设计麻烦。

下面来分析一下几个函数的设计思路:

1.菜单打印函数

这个函数很简单,一看就能明白,这儿就不多说了。

2.棋盘打印函数

首先得构思一下三子棋的棋盘应该是什么样

简单点,上图就可以作为三子棋棋盘(其实就是利用 putchar() 函数和 printf() 把显示在屏幕上的字符一个个,一行行打印上去)。设计时可把其分成四部分来看,(1) 短竖杠 ; (2) 短横杠 ; (3) 棋子(用一个二维字符数组来定义每一个棋子,用二维是因为方便输入的 X 和 Y 值与数组下标对应) ; (4) 空格(一开始打印的时候,因为还没有落子,所以把棋子也设计成空格)。 先确定要输入几行几列字符,以确定循环输出的次数,还有确定每个位置该输出的字符,这样就可以依靠循环和判断打印出棋盘了。

3 . 赢家判断函数

在每次落子后都要先进行一次判断,看是否已经产生赢家了。
因为会出现赢家的情况就八种———–

{ coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] },
{ coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] }

定义一个字符串数组,里面共有八个字符串,每一个字符串就是上面的一个花括弧里的内容,当某个字符串的内容与 * 或 ooo 相等,那么说明产生赢家了,否则不会产生赢家,那么就用一个循环,遍历字符串数组里的每一个字符串,判断是否会产生赢家。

4. 玩家下棋函数

玩家通过输入 x,y 坐标来确定落子的位置, x,y 对应的就是 定义的棋子二维字符数组的下标,每次先判断输入的 x,y 值对应数组下标的元素是否是 * 或 o ,是的话就说明此处已有落子,得重新输入,不是的话就落下该棋子,接着判断是否产生赢家,是的话就结束此次游戏,不是的话就判断棋盘上是否还有空位置没落子,有的话就轮到电脑继续落子,没有的话就结束此次游戏。

5. 电脑下棋函数

因为电脑是自动落子,所以得为电脑产生一个随机的 棋子二维数组下标值,使电脑随机落子,这个用srand((unsigned)time(NULL)); index_x2 = 2 * rand() / RAND_MAX; index_y2= 2 * rand() / RAND_MAX;来实现把它们放在一个while 死循环里,因为可能产生的两个随机下标那儿已经有棋子了,需要重新产生一次随机下标,当下标值与已落棋子不冲突时,就落下该棋子,接着判断是否产生赢家,是的话,就结束此次游戏,不是的话就判断棋盘上是否还有空位置没落子,有的话就轮到玩家继续落子,没有的话就结束此次游戏。

6. 主函数

在主函数里适当调用以上定义的几个函数,实现正确的逻辑功能。

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

(0)

相关推荐

  • C语言实现三子棋

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 题目:C语言实现三子棋 问题分析:首先用到数组,存储信息.棋盘的信息和棋子的信息 打印棋盘 读取棋子的位置 判断是否连子 打印棋盘 然后重复 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //数组沙盘 char Global_Gobang[10][10]; int Global_line, Global_p

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现简单三子棋程序

    使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr,

  • C语言实现三子棋小游戏

    在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能. 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_board(char arr[ROW][COL]) { int i=0; int j=0; for

  • C语言实现三子棋程序

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 先直接上代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //2.实现三子棋游戏. #include<Windows.h> //Sleep() RAND_MAX 的头文件 void menu() //打印菜单 { printf("****************************\n"); printf("***

  • 用C语言实现三子棋

    本文实例为大家分享了用C语言实现三子棋的具体代码,供大家参考,具体内容如下 三子棋含义: 三子棋是黑白棋的一种.三子棋又叫九宫棋.圈圈叉叉.一条龙.井字棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了.但是,有很多时候会出现和棋的情况.图例如下: 基本思路: 1.创建用户交互菜单界面 2.初始化棋盘 3.显示棋盘面板(为了不重复显示棋盘,使用清屏操作) 4.用户落子 5.判断胜负 6.电脑随机正确落子 7.判断胜负 (在每次写程序之前,可以向

  • 用C语言实现三子棋小游戏

    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1. 规则介绍 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了.但是,有很多时候会出现和棋的情况. 2. 编写思路 2.1 选择界面的编写 提供选择界面(设计者可根据自己的喜好设定棋盘的大小:输入何种数字或者符号开始或者退出游戏也可由设计者自己确定数字) static void Menu() { pri

  • C语言版三子棋小游戏

    本文实例为大家分享了C语言版三子棋小游戏的具体代码,供大家参考,具体内容如下 ①游戏效果 有一个3*3的棋盘 每次下棋后(电脑和玩家),棋盘会更新数据 会有菜单提示相关命令进行相关操作 下棋方法是输入坐标 每一局游戏结束后,会询问是否继续. ②主函数逻辑搭建 任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分. 所以我们需要搭建逻辑,那么逻辑结构是啥呢? 首先会跳出提示菜单,内容为 0退出游戏,1开始/继续游戏,其他键提示错误,并重新输入 按0后提示 "

  • 用C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 初始工作,通过#define 定义一个标识符来表示一个常量(棋盘的横纵坐标) (因为在代码的编写中,会有多处需要用到坐标.那么,在阅读代码时就可能会导致读者疲于理解当前的值到底是代表什么,即会对代码的解读造成困扰.所以,在该代码中通过使用宏定义解决了这个问题,同时也方便后续更改棋盘的大小.) #define MAX_ROW 3 #define MAX_COL 3 游戏创建流程 1. 创建棋盘 创建棋盘(二维数组),并将

  • 利用C语言实现三子棋(井字棋)小游戏

    本文实例为大家分享了C语言实现三子棋(井字棋)小游戏的具体代码,供大家参考,具体内容如下 推荐阅读顺序(不建议跳过) 先看实现之后的界面 -- 然后看分析程序要实现的步骤 -- 之后在看翻到test.c部分 -- 在test.c中找到main()函数 -- 从main函数的第一步开始看 -- 遇到自定义函数请到game.h源文件中找到相应函数的详情 辅助阅读: game.h文件中放的是函数的声明(引用头文件) game.c文件中放的是函数的详情(怎么用代码实现相应步骤的) test.c文件中放的

  • C语言版三子棋游戏实现代码

    本文实例为大家分享了C语言版三子棋游戏的具体代码,供大家参考,具体内容如下 实现一个三子棋小游戏 下面是实现步骤: 总共有需要三个文件 第一,test.c 我们要在这个文件里面实现游戏的主体流程 第二,game.c 在这个文件里我们可以实现各个游戏函数的分装 第三,game.h 在这个文件里我们实现的是各个函数的声明 test.c 1.首先要有一个菜单 让玩家可以做出选择 2.接着对玩家做出的不同选择进行实现 选1就是开始游戏,所以我们进入到game函数里就好了 选0就是退出游戏, 其他选择的话

  • 适合初学者练习的C语言实现三子棋小游戏

    目录 一.写代码前明确下棋时的步骤与顺序 二 根据初步的主函数完成想要的代码 1.写一个函数来初始化棋盘 2.打印棋盘 3.玩家落子 4.电脑落子 5.判断胜负 三.三子棋实现代码 用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能 一.写代码前明确下棋时的步骤与顺序 1.创建一个3*3的棋盘. 2.将上面创建的棋盘中每个格初始化成' '状态. 3.打印出初始化完成的棋盘 4.玩家落子 5.电脑落子 6.判断胜负 写代码之前梳理好大概的思路,

  • 详解用C语言实现三子棋游戏流程

    目录 三子棋游戏简介 一.分析及实现 1.棋盘 2.落子 3.判断输赢 二.程序演示 三.完整代码 1.main.c 2.game.c 3.game.h 总结 三子棋游戏简介 这是一个简单的三子棋小游戏,估计大家小时候都玩儿过,只要能连成三个,无论是行,列还是对角线,就可以胜利了.是不是很简单呢,那我们来尝试一下用C语言来写一个简单的三子棋游戏. 一.分析及实现 1.棋盘 想要玩游戏,那首先应该有一个棋盘吧.因为我们玩儿的是三子棋,所以来说一个3X3的棋盘应该可以满足要求.这里使用了一个三行三列

随机推荐