当前位置: 首页 > news >正文

【C语言】三子棋游戏——超细教学

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言

🔥该篇将结合之前的知识来实现 三子棋游戏。

目录:

  • 🌟思路框架:
    • 测试
    • 游戏
  • 🌟测试部分函数实现
  • 🌟游戏部分函数实现
  • 🌟完整的代码:
  • ❤️ 结语

🌟思路框架:

测试

通过迭代保证每次玩完游戏后可以再来一局或者退出。

游戏

博主将会对上图每一个板块进行函数实现。


🌟测试部分函数实现

  • 选择是否玩游戏

该板块的循环部分将会使用do while 循环来实现(保证一开始可以选择,运行完游戏部分后还可以继续选择)。

#include"game.h"int main()
{int input = 0;do{menu();//菜单printf("请选择:> ");scanf("%d", &input);switch (input){case 1:printf("三子棋游戏:\n");game();//游戏部分break;case 0:printf("退出游戏\n");break;default:printf("输入非法,请重新输入\n");break;}} while (input);return 0;
}

🌟游戏部分函数实现

在玩三子棋游戏中,每一步棋下完之后的状态需要保存,即需要数据的保存,所以可以创建一个3X3的数组,之后的数据操作就可以针对数组进行操作。

  • 菜单
void menu()
{printf("**************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("**************************\n");
}
  • 初始化棋盘

定义一个 3X3 数组后,我们将数组的元素都赋为 空格,这样就可以保证打印出来的效果是空的棋盘。

void BoardInit(char board[][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] = ' ';}}
}
  • 打印棋盘

需要产生的效果:

实现上述的效果,只需要两步拆解:
1.
将这样的棋盘首先分为三部分,每一个部分由数据部分分割线部分构成,分割线部分在最后一部分没有(只需要加一个限制条件即可)

    int i = 0;for (i = 0; i < row; i++){//打印数据printf("\n");//打印后换行//打印分割线if (i < row - 1)//保证最后一部分不打印分割线{}printf("\n");//打印后换行}


每个部分内部又可以划分为三部分,与第一次拆解逻辑一摸一样,注意第三部分没有 | 即可

void DisplayBoard(char board[][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){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}
}
  • 玩家下棋:

这里需要注意 检查玩家输入的坐标是否合法,以及该坐标下是否已经有棋子。而且,在写条件的时候,需要代入玩家视角,输入区间为 1 —— 3,但访问区间为 0——2 。

void PlayerMove(char board[][Col], int row, int col)
{printf("玩家下棋:\n");printf("请输入下棋的坐标,中间使用空格:>");while (1){int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >=1 && y <= col)//保证棋子能落入棋盘{if (board[x - 1][y - 1] == ' ')//该坐标下无棋子{board[x - 1][y - 1] = 'X';//落子break;}else{printf("该位置已有棋子,请重新输入:>");}}else{printf("输入非法,请重新输入:>");}}
}
  • 电脑下棋
    这里需要使用伪随机数,并且直接将范围锁定在 0——2,可以直接访问数组元素。完成该功能只需要判断 坐标下是否有棋子,若有棋子,则重新生成随机数。若要了解随机数,可以参考——随机数 。
void ComputerMove(char board[][Col], int row, int col)
{printf("电脑下棋:\n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'O';break;}}
}
  • 判断输赢

只需要从4种方向遍历数组,有符合获胜条件的直接返回数组元素,如果没有获胜,则需要判断是否棋盘已满(平局),除此之外就是未完成该局,继续下棋。

所以返回值 有四种情况:
电脑赢 —— 返回 ‘O’
玩家赢 —— 返回 ‘X’
平局 —— 返回 ‘P’
继续 —— 返回 ‘C’

int IsFull(char board[][Col], int row, int col)//判断是否已满,已满返回1
{//遍历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[][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[0][0] != ' '){return board[1][1];}//左下至右上if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '){return board[1][1];}//平局if (IsFull(board,row,col)){return 'P';}return 'C';}
  • 游戏逻辑部分

我们已经有了所有的功能函数,按照思路框架直接写出来即可。

void game()
{char board[Row][Col] = { 0 };BoardInit(board, Row, Col);DisplayBoard(board, Row, Col);//先手判断//假设玩家先手void(*Fir)(char board[][Col], int, int) = PlayerMove;void(*Sec)(char board[][Col], int, int) = ComputerMove;int flag = rand()%2; //1——玩家先手,0——电脑先手if (flag == 0){printf("电脑先手\n");Fir = ComputerMove;Sec = PlayerMove;}else{printf("玩家先手\n");}//char ret = 0;while (1){Fir(board, Row, Col);DisplayBoard(board, Row, Col);ret = IsWin(board, Row, Col);if (ret != 'C')break;Sec(board, Row, Col);DisplayBoard(board, Row, Col);ret = IsWin(board, Row, Col);if (ret != 'C')break;}if (ret == 'X'){printf("玩家获胜\n");}else if (ret == 'O'){printf("电脑获胜\n");}else{printf("平局\n");}
}

首先假设玩家是先手,如果flag =1,则照旧进行,如果flag = 0,就直接交换先后手。

🌟完整的代码:

test.c :

请记得设置随机数起点srand。

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"int main()
{int input = 0;srand((unsigned int)time(NULL));//起点do{menu();//菜单printf("请选择:> ");scanf("%d", &input);switch (input){case 1:printf("三子棋游戏:\n");game();//游戏部分break;case 0:printf("退出游戏\n");break;default:printf("输入非法,请重新输入\n");break;}} while (input);return 0;
}

game.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Row 3
#define Col 3
//菜单
void menu();
//游戏(逻辑)
void game();
//初始化棋盘
void BoardInit(char board[][Col], int row, int col);
//打印棋盘
void DisplayBoard(char board[][Col], int row, int col);
//玩家下棋
void PlayerMove(char board[][Col], int row, int col);
//电脑下棋
void ComputerMove(char board[][Col], int row, int col);
//判断输赢
char IsWin(char board[][Col], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void menu()
{printf("**************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("**************************\n");
}void BoardInit(char board[][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 DisplayBoard(char board[][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){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}
}void PlayerMove(char board[][Col], int row, int col)
{printf("玩家下棋:\n");printf("请输入下棋的坐标,中间使用空格:>");while (1){int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >=1 && y <= col)//保证棋子能落入棋盘{if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'X';//落子break;}else{printf("该位置已有棋子,请重新输入:>");}}else{printf("输入非法,请重新输入:>");}}
}void ComputerMove(char board[][Col], int row, int col)
{printf("电脑下棋:\n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'O';break;}}
}int IsFull(char board[][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[][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[0][0] != ' '){return board[1][1];}//左下至右上if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '){return board[1][1];}//平局if (IsFull(board,row,col)){return 'P';}return 'C';}void game()
{char board[Row][Col] = { 0 };BoardInit(board, Row, Col);DisplayBoard(board, Row, Col);//先手判断//假设玩家先手void(*Fir)(char board[][Col], int, int) = PlayerMove;void(*Sec)(char board[][Col], int, int) = ComputerMove;int flag = rand()%2; //1——玩家先手,0——电脑先手if (flag == 0){printf("电脑先手\n");Fir = ComputerMove;Sec = PlayerMove;}else{printf("玩家先手\n");}//char ret = 0;while (1){Fir(board, Row, Col);DisplayBoard(board, Row, Col);ret = IsWin(board, Row, Col);if (ret != 'C')break;Sec(board, Row, Col);DisplayBoard(board, Row, Col);ret = IsWin(board, Row, Col);if (ret != 'C')break;}if (ret == 'X'){printf("玩家获胜\n");}else if (ret == 'O'){printf("电脑获胜\n");}else{printf("平局\n");}
}

❤️ 结语

文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

相关文章:

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…...

redux的介绍、安装、三大核心与执行流程

redux的介绍、安装、三大核心与执行流程 一、redux的基本介绍二、redux的安装三、redux核心概念3.1 action3.2 reducer3.3 store 四、Redux代码执行流程五、加减案例练习 一、redux的基本介绍 redux中文官网Redux 是 React 中最常用的状态管理工具&#xff08;状态容器&#x…...

Redis 5环境搭建

一、环境搭建 如果是Centos8&#xff0c;yum 仓库中默认的 Redis版本就是5&#xff0c;直接yum install即可。如果是Centos7&#xff0c;yum 仓库中默认的 Redis版本是3系列&#xff0c;比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…...

stm32红绿灯源代码示例(附带Proteus电路图)

本代码不能直接用于红路灯&#xff0c;只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…...

Qt与电脑管家4

折线图&#xff1a; #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…...

使用css美化gradio界面

基本方法 在默认的前端页面中使用检查工具确定要修改的部分的选择器名称&#xff0c;然后在block_css中对其修改&#xff0c;并在启动网页时传入参数&#xff1a;with gr.Blocks(cssblock_css, thememy_theme) as demo: 禁止修改下拉框文字 input.border-none.svelte-c0u3f0…...

Flink流批一体计算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment 创建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…...

java笔试手写算法面试题大全含答案

1.统计一篇英文文章单词个数。 public class WordCounting { public static void main(String[] args) { try(FileReader fr new FileReader("a.txt")) { int counter 0; boolean state false; int currentChar; while((currentChar fr.read()) ! -1) { i…...

点云平面拟合和球面拟合

一、介绍 In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model. 二、代码 #include <iostream> #include <thread> #include <pcl/point_types.h> #include <pcl/common/io.…...

部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)

前言 因为不想每次启动虚拟机都要手动启动一遍这些东西&#xff0c;所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容&#xff0c;注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…...

视觉SLAM:一直在入门,如何能精通,CV领域的绝境长城,

目录 前言 福利&#xff1a;文末有chat-gpt纯分享&#xff0c;无魔法&#xff0c;无限制 1 什么是SLAM&#xff1f; 2 为什么用SLAM&#xff1f; 3 视觉SLAM怎么实现&#xff1f; 4 前端视觉里程计 5 后端优化 6 回环检测 7 地图构建 8 结语 前言 上周的组会上&…...

【报错】yarn --version Unrecognized option: --version Error...

文章目录 问题分析解决问题 在使用 npm install -g yarn 全局安装 yarn 后,查看yarn 的版本号,报错如下 PS D:\global-data-display> yarn --version Unrecognized option: --version Error: Could...

二叉搜索树的(查找、插入、删除)

一、二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1、若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值&#xff1b; 2、若它的右子树不为空&#xff0c;则右子树上所有节点的值都…...

电力虚拟仿真 | 高压电气试验VR教学系统

在科技进步的推动下&#xff0c;我们的教育方式也在发生着翻天覆地的变化。其中&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的出现&#xff0c;为我们提供了一种全新的、富有沉浸感的学习和培训方式。特别是在电力行业领域&#xff0c;例如&#xff0c;电力系统的维护…...

innovus如何设置size only

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 给instance设置size only属性命令如下: dbset [dbGet top.inst.name aa/bb -p] .dontTouch sizeOk 给一个module设置size only需要foreach循环一下: foreach inst [dbGet top.…...

Java之继承详解二

3.7 方法重写 3.7.1 概念 方法重写 &#xff1a;子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 3.7.2 使用场景与案例…...

国内常见的几款可视化Web组态软件

组态软件是一种用于控制和监控各种设备的软件&#xff0c;也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制&#xff0c;自动…...

通过 git上传到 gitee 仓库

介绍 Git是目前世界上最先进的分布式版本控制系统&#xff0c;有这么几个特点&#xff1a; 分布式 &#xff1a;是用来保存工程源代码历史状态的命令行工具。保存点 &#xff1a;保存点可以追溯源码中的文件&#xff0c;并能得到某个时间点上的整个工程项目额状态&#xff1b;…...

设置Windows主机的浏览器为wls2的默认浏览器

1. 准备工作 wsl是可以使用Windows主机上安装的exe程序&#xff0c;出于安全考虑&#xff0c;默认情况下改功能是无法使用。要使用的话&#xff0c;终端需要以管理员权限启动。 我这里以Windows Terminal为例&#xff0c;介绍如何默认使用管理员权限打开终端&#xff0c;具体…...

森林生物量(蓄积量)估算全流程

python森林生物量&#xff08;蓄积量&#xff09;估算全流程 一.哨兵2号获取/去云处理/提取参数1.1 影像处理与下载1.2 导入2A级产品1.3导入我们在第1步生成的云掩膜文件1.4.SNAP掩膜操作1.5采用gdal计算各类植被指数1.6 纹理特征参数提取 二.哨兵1号获取/处理/提取数据2.1 纹理…...

MySQL数据库概述

MySQL数据库概述 1 SQL SQL语句大小写不敏感。 SQL语句末尾应该使用分号结束。 1.1 SQL语句及相关操作示例 DDL&#xff1a;数据定义语言&#xff0c;负责数据库定义、数据库对象定义&#xff0c;由CREATE、ALTER与DROP三个语法所组成DML&#xff1a;数据操作语言&#xff…...

2023年国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…...

怎么借助ChatGPT处理数据结构的问题

目录 使用ChatGPT进行数据格式化转换 代码示例 ChatGPT格式化数据提示语 代码示例 批量格式化数据提示语 代码示例 ChatGPT生成的格式化批处理代码 使用ChatGPT合并不同数据源的数据 合并数据提示语 自动合并数据提示语 ChatGPT生成的自动合并代码 结论 数据合并是…...

Docker容器无法启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh

报错信息如下 解决办法 权限不够 加上--privileged 获取最大权限 docker run --privileged --name lenglianerqi -p 9266:8080 -v /opt/docker/lenglianerqi/webapps:/usr/local/tomcat/webapps/ -v /opt/docker/lenglianerqi/webapps/userfile:/usr/local/tomcat/webapps/u…...

Pytorch-day08-模型进阶训练技巧-checkpoint

PyTorch 模型进阶训练技巧 自定义损失函数动态调整学习率 典型案例&#xff1a;loss上下震荡 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BndMyRX0-1692613806232)(attachment:image-2.png)] 1、自定义损失函数 1、PyTorch已经提供了很多常用…...

【ArcGIS Pro二次开发】(61):样式(Style)和符号(Symbol)

在 ArcGIS Pro SDK 中&#xff0c;地图要素符号&#xff08;Symbol&#xff09;和符号样式&#xff08;Style&#xff09;是2个很重要的概念。 【Symbol】是用于表示地图上不同类型的要素&#xff08;如点、线、面&#xff09;的图形化表示。 在地图中&#xff0c;各种要素都…...

深入理解 HTTP/2:提升 Web 性能的秘密

HTTP/2 是一项重大的网络协议升级&#xff0c;旨在提升 Web 页面加载速度和性能。在这篇博客中&#xff0c;我们将深入探讨 HTTP/2 的核心概念以及如何使用它来加速网站。 什么是 HTTP/2&#xff1f; HTTP/2 是 HTTP 协议的下一个版本&#xff0c;旨在解决 HTTP/1.1 中的性能…...

800V高压电驱动系统架构分析

需要电驱竞品样件请联&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 过去一年是新能源汽车市场爆发的一年&#xff0c;据中汽协数据&#xff0c;2021年新能源汽车销售352万辆&#xff0c;同比大幅增长157.5%。新能源汽车技术发展迅速&#xff0c;畅销车辆在动力性能…...

Camunda_3:主动撤回

貌似国际主流认知工作流通常不支持撤回/驳回&#xff0c;流程只能向前进行。而撤回/驳回算是一种中国特色吧。 因此Camunda对于流程修改也仅仅提供了runtimeService.createProcessInstanceModification(instanceId)来修改流程。对于撤回/驳回这种操作得自己想办法。通常的撤回/…...

ClickHouse(二十三):Java Spark读写ClickHouse API

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…...

动漫一级a做爰片免费网站/肇庆网站建设制作

一、NDK中获取android设备ID的方式Java代码如下(获取设备ANDROID_ID)&#xff1a;final String androidId Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);对应的c代码(相当蛋疼)&#xff0c;注意如果是C&#xff0c;需要把所有的(*env)->替换成env-&…...

免费网站打包app/网站建设网络营销

Simple Tabs OneTwoThree 新增的tab会闪烁 $(#container).tabs(); 新增的Tab可关闭 新增的tab点击后不再闪烁 样式有干扰&#xff0c;还是下载自己打开看吧&#xff1a;download 新增了闪烁同步和不同步两种实现&#xff1a;download...

湖北做网站的公司/如何做好推广工作

一、No module ‘xformers’. Proceeding without it. 这是因为没有安装xformers导致的。 解决办法&#xff1a; 在webui-user.bat文件这添加一行&#xff1a; set COMMANDLINE_ARGS--xformers如下图所示&#xff1a; 试着点击webui-user.bat&#xff0c;看能否下载&#xff…...

网站域名年龄/万网域名查询注册商

U盘是一种使用USB接口来连接电脑的储存工具&#xff0c;使用方法快捷有效&#xff0c;携带也很方便。但是最近有一位小伙伴反馈说U盘插入电脑后发现无法访问U盘&#xff0c;这是怎么回事呢&#xff1f;作为专业的IT外包服务商&#xff0c;IT外包小编就跟大家解答U盘插进电脑无法…...

济南软件优化网站/口碑营销方案

这篇文章主要介绍了pygame开发&#xff0c;通过本文&#xff0c;您可以使用pygame开发一个马赛逻辑小游戏~有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助 一、游戏简介 马赛逻辑&#xff0c;是一个类似数独和扫雷的逻辑小游戏&#xff0c;根据棋盘周围的数据提示点…...

四川 法治政府建设 网站/长沙网络推广小公司

北上广深等一线城市的人口日益增多&#xff0c;职场白领群体增加&#xff0c;而办公软件的使用&#xff0c;更是帮助白领们提高效率、企业节省运营成本的有效方式&#xff0c;而对于个人邮箱品牌的选择上&#xff0c;更是有种选优&#xff0c;TOM VIP邮箱凭借独特的优势&#x…...