三子棋 (C语言)【超详解】

简介: 三子棋 (C语言)【超详解】

项目的创建:

test.c:用于代码的测试;

game.h:用于宏定义,头文件,和函数声明;

game.c:用于函数功能的实现;

(1)菜单的实现:

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
  printf("***************************************\n");
  printf("*********1.PLAY      0.EXIT   *********\n");
  printf("***************************************\n");
  printf("***************************************\n");
}
int main()
{
  int input = 0;
  do
  {
    menu();
    srand((unsigned int)time(NULL));
    printf("请选择:>");
    scanf_s("%d", &input);
    switch (input)
    {
      case 1:
        game();
        break;
      case 0:
        printf("游戏退出!");
        break;
      default:
        printf("输入错误,请重新输入!");
        break;
    }
  } while (input);
  return 0;
}

使用do - while switch语句实现一个简单的菜单显示;

效果如下:


(2)game函数的实现:

1.棋盘的打印:

代码:

//打印棋盘
void display(char arr[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      printf(" %c ", arr[i][j]);
      if (j < col - 1)
        printf("|");
    }
    printf("\n");
    if (i < row - 1)
    {
      for (int j = 0; j < col; j++)
      {
        printf("---");
        if (j < col - 1)
          printf("|");
      }
      printf("\n");
    }
  }
}

运行效果:

2.玩家下棋:

代码:

首先判定x y的合法性,和坐标是否有被落子,如果均符合要求 ,玩家就落子,否则重新输入坐标。      

//玩家下棋
void player(char arr[ROW][COL])
{
  int x = 0, y = 0;
  while (1)
  {
    printf("输入坐标:>");
    scanf_s("%d %d", &x, &y);
    if (x <= ROW && y <= COL && x > 0 && y > 0  && arr[x - 1][y - 1] == ' ')
    {
      arr[x - 1][y - 1] = '*';
      break;
    }
    else 
    {
      printf("输入错误,请重新输入:\n");
    }
  }
}

运行效果:

3.电脑下棋

代码:

使用随机数生成函数生成电脑的即将要落子的坐标;

//电脑下棋
void computer(char arr[ROW][COL])
{
  while (1)
  {
    int x = rand() % 3;
    int y = rand() % 3;
    if (arr[x][y] == ' ' && arr[x][y] != '*')
    {
      arr[x][y] = '#';
      break;
    }
  }
}

运行效果:

4.判断胜负:

代码:

其中要对每一行,每一列,斜线进行判断,是玩家赢还是电脑赢,如果棋子落满都没有分出胜负就判断为平局;

//判断输赢
int dgame(char arr[ROW][COL])//和局
{
  for (int i = 0; i < ROW; i++)
  {
    for (int j = 0; j < COL; j++)
    {
      if (arr[i][j] == ' ')
        return 0;
    }
  }
  return 1;
}
int judge(char arr[ROW][COL])
{
  //判断行
  for (int i = 0; i < ROW; i++)
  {
    if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] == '*')
    {
      printf("玩家赢!\n");
      return 1;
      break;
    }
    if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] == '#')
    {
      printf("电脑赢!\n");
      return 1;
      break;
    }
  }
  //判断列
   for (int i = 0; i < COL; i++)
  {
    if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] == '*')
    {
      printf("玩家赢!\n");
      return 1;
      break;
    }
    if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] == '#')
    {
      printf("电脑赢!\n");
      return 1;
      break;
    }
  }
  //判断斜线
   if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
   {
     if (arr[1][1] == '#')
     {
       printf("电脑赢!\n");
       return 1;
     }
     else if (arr[1][1] == '*')
     {
       printf("玩家赢!\n");
       return 1;
     }
   }
   else if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
   {
     if (arr[1][1] == '#')
     {
       printf("电脑赢!\n");
       return 1;
     }
     else if (arr[1][1] == '*')
     {
       printf("玩家赢!\n");
       return 1;
     }
   }
   else if (1 == dgame(arr))
   {
     printf("和局 \n");
     return 1;
   }
   return 0;
}

运行效果:

电脑赢:

玩家赢:


以上就是三子棋的基本实现了,如果帮到你请你带那个赞吧👍

相关文章
|
6月前
|
传感器 人工智能 搜索推荐
教育随身而行——可穿戴设备如何赋能未来课堂?
教育随身而行——可穿戴设备如何赋能未来课堂?
167 16
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
378 3
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
754 0
|
存储 数据采集 运维
日志服务(SLS)使用体验
通过参加配置SLS来实现Nginx日志的采集的实验,以及参与了数据洞察创新挑战赛之智能运维赛,来谈谈自己的体验感受。
1932 55
|
应用服务中间件 PHP 数据库
【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问
现在的手机越来越先进,功能也越来越多,而手机的摄像功能也愈发强大,所拍摄的照片越来越清晰,但也让数码照片的体积暴涨。对于像笔者这样经常拍照的人来说,手机容量经常告警,因此笔者将家里的电脑改造成能随时上传下载和访问的图片服务器。今天,笔者就为大家展示,如何使用Cpolar内网穿透与Lightpicture组合,将个人电脑改造成能随时上传、下载或访问,并能生成外链的图床服务器。
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的高校毕业与学位资格审核系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的高校毕业与学位资格审核系统附带文章源码部署视频讲解等
126 2
|
传感器 编解码 机器人
Sony BRC-300P 三个1/4英寸7型高级CCD传感器一体式标清机器人紧凑型摄像机
Sony BRC-300P 三个1/4英寸7型高级CCD传感器一体式标清机器人紧凑型摄像机
125 1
|
编解码 开发工具 Android开发
【技术分享】无纸化会议|智慧教室同屏走RTSP组播还是RTMP?
我们在做内网多人同屏(比如无纸化会议、智慧教室同屏)技术方案的时候,遇到个问题:到底使用轻量级RTSP服务实现组播,还是基于RTMP的解决方案?
386 0
|
分布式计算 Hadoop API
Hadoop中HDFS的API操作、HDFS文件上传(测试参数优先级)、copyFromLocalFile参数解读、HDFS文件下载、文件更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断
Hadoop中HDFS的API操作、HDFS文件上传(测试参数优先级)、copyFromLocalFile参数解读、HDFS文件下载、文件更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断
Hadoop中HDFS的API操作、HDFS文件上传(测试参数优先级)、copyFromLocalFile参数解读、HDFS文件下载、文件更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断
|
存储 JavaScript 前端开发
JavaScript 基本语法
JavaScript 基本语法
84 0