C语言---井字棋(三子棋)
Tic-Tac-Toe
- 1 游戏介绍和随机数
- 1.1 游戏介绍
- 1.2 随机数的生成
- 1.3 棋盘大小和符号
- 2 设计游戏
- 2.1 初始化棋盘
- 2.2 打印棋盘
- 2.3 玩家下棋
- 2.4 电脑下棋
- 2.5 判断输赢
- 2.6 game()函数
- 2.7 main()函数
- 3 完整三子棋代码
- 3.1 Tic_Tac_Toe.h
- 3.2 Tic_Tac_Toe.c
- 3.3 Test.c
- 4 游戏代码的缺陷
1 游戏介绍和随机数
1.1 游戏介绍
井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。
点此进入井字棋链接
1.2 随机数的生成
- 1 rand()函数
int rand(void)
生成随机数
返回0到RAND_MAX之间的伪随机整数。(RAND_MAX是32767,二进制原码最大为0111111111111111=215-1=32767)
这个数字是由一个算法生成的,该算法每次被调用时都会返回一个明显不相关的数字序列。该算法使用种子来生成序列,该序列应使用函数srand初始化为某个独特的值。
RAND_MAX是中定义的常数。
使用rand在确定的范围内生成平凡伪随机数的典型方法是使用返回值乘以范围跨度的模,并添加范围的初始值:
v1 = rand() % 100; // v1 范围 0 to 99
v2 = rand() % 100 + 1; // v2 范围 1 to 100
v3 = rand() % 30 + 1985; // v3 范围 1985-2014
请注意,这种取模运算并不会在跨度中生成均匀分布的随机数。
- 2 sand函数是用来初始化随机数生成器的
void srand(unsigned int seed);
- 在调用rand前调用srand,修改seed参数生成随机数种子
int main()
{void srand(unsigned int seed);return 0;
}
- 3 time()
time函数可以获得时间,需要引用头文件time.h
time_t time(time_t* timer);
- 生成真的随机数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{srand((unsigned int)time(NULL));//srand 的参数是unsigned int 类型,强制转换,//time(NULL)返回一段时间戳printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}
1.3 棋盘大小和符号
在
Tic-Tac-Toe.h
中定义棋盘行列大小,玩家和电脑的符号,方便后续修改
#define ROW 3
#define COL 3#define Player_Choice 'X'
#define Computer_Choice 'O'
//#define Player_Choice '√'
//#define Computer_Choice '×'
2 设计游戏
2.1 初始化棋盘
将二维数组的所有元素定义为“空”,等待后续放入
Player_Choice
和Computer_Choice
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
2.2 打印棋盘
我们朝向这个
%c | %c | %c \n
和---|---|---\n
打印,设计棋盘形状。
后续改变棋盘大小可以通过更改ROW
和COL
快速更改。
我们以%c |
为一组,在最后一组是没有|
的,---|
也是同理。需要单独判断
//2 打印棋盘
void DispalyBoard(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){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}
2.3 玩家下棋
有以下3点要注意
1 输入的坐标格式
2 输入的坐标是否被占用
3 输入的坐标范围是否正确
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);//坐标范围合法的判断if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = Player_Choice;break;}else{printf("坐标被占用,不能下棋,请选择其他位置\n");}}else{printf("坐标非法,请重新输入\n");}}
}
2.4 电脑下棋
为了让电脑生产真正的随机数,我们前面已经讲了如何做。
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋:\n");int x = 0;int y = 0;while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = Computer_Choice;break;}}
}
2.5 判断输赢
判断输赢要从三方面,行,列,对角线。分三种情况判定。
先判断棋盘是否填满。
棋盘满了返回1,判断平局和胜负,
棋盘不满返回0,游戏继续进行,知道决出结局。
int IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' '){return 0;}}}return 1;
}
我们规定
玩家赢的时候,IsWin
函数返回符号'*'
,
电脑赢的时候,IsWin
函数返回符号'#'
,
平局的时候,IsWin
函数返回符号'Q'
,
没结果还要继续时候,IsWin
函数返回符号'C'
因此,规定IsWin
函数返回类型是char
。
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][1] != ' '){return board[i][1];}}//列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//对角线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';
}
2.6 game()函数
game()
函数放在Test.c
中。一旦选择了1 开始游戏
,启动game()
函数。
一定注意下棋的逻辑顺序。
初始化棋盘后,放置“空”元素进去。
开始下棋后,我们规定玩家先走,电脑后走。
玩家走一步,判断输赢,展示棋盘,电脑再走,再判断输赢。
第一回合是没必要输赢。但是不妨碍游戏逻辑。
玩家赢 -
IsWin
函数返回 -Player_Choice
电脑赢 -IsWin
函数返回 -Computer_Choice
平局 -IsWin
函数返回 -'Q'
void game()
{char result = 0;char board[ROW][COL] = { 0 };//初始化棋盘的函数InitBoard(board, ROW, COL);DispalyBoard(board, ROW, COL);//下棋while (1){PlayerMove(board, ROW, COL);//判断输赢result = IsWin(board, ROW, COL);if (result != 'C'){break;}DispalyBoard(board, ROW, COL);ComputerMove(board, ROW, COL);//判断输赢result = IsWin(board, ROW, COL);if (result != 'C'){break;}DispalyBoard(board, ROW, COL);}if (result == Player_Choice){printf("你赢了\n");}else if (result == Computer_Choice){printf("电脑赢了\n");}else{printf("你和电脑打成平局\n");}DispalyBoard(board, ROW, COL);
}
2.7 main()函数
其实main()函数一开始就写了,笔者最后以是修改
main()
结尾的,就把它放最后了。
设置随机数的生成起点的。srand((unsigned int)time(NULL));
我忘了这个逻辑。电脑生产伪随机数。
每次进行游戏时,电脑都是固定位置,没有意义。
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误!\n");break;}} while (input);return 0;
}
3 完整三子棋代码
主要利用二维数组实现井字棋,主要分以下三个模块。
Test.c
负责测试游戏的逻辑
Tic_Tac_Toe.c
负责游戏代码的实现
Tic_Tac_Toe.h
负责游戏代码的声明
3.1 Tic_Tac_Toe.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 3
#define COL 3#define Player_Choice 'X'
#define Computer_Choice 'O'//#define Player_Choice '√'
//#define Computer_Choice '×'//1 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);//2 打印棋盘
void DispalyBoard(char board[ROW][COL], int row, int col);//3 玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);//4 电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);//5 判断输赢
char IsWin(char board[ROW][COL], int row, int col);
3.2 Tic_Tac_Toe.c
#include "Tic_Tac_Toe.h"//1 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}//第一个版本
//void DispalyBoard(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// for (i = 0; i < row; i++)
// {
// //打印数据
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// //打印分割信息
// if(i<row-1)
// printf("---|---|---\n");
// }
//}//2 打印棋盘
void DispalyBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){//打印数据//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");//打印分割信息//printf("---|---|---\n");if (i < row - 1){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}//3 玩家下棋
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);//坐标范围合法的判断if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = Player_Choice;break;}else{printf("坐标被占用,不能下棋,请选择其他位置\n");}}else{printf("坐标非法,请重新输入\n");}}
}//4 电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋:\n");int x = 0;int y = 0;while (1){x = rand() % row;//0~2y = rand() % col;//0~2if (board[x][y] == ' '){board[x][y] = Computer_Choice;break;}}
}//5 判断输赢
//棋盘满了就返回1
//棋盘不满返回0
int IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){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][1] != ' '){return board[i][1];}}//列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//对角线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';
}//返回 Player_Choice 玩家赢
//返回 Computer_Choice 玩家赢
//返回 Q 平局
//返回 C 继续
3.3 Test.c
#include "Tic_Tac_Toe.h"void menu()
{printf("*****************************\n");printf("***********1 开始游戏*********\n");printf("***********0 退出游戏*********\n");printf("*****************************\n");
}void game()
{char result = 0;char board[ROW][COL] = { 0 };//初始化棋盘的函数InitBoard(board, ROW, COL);DispalyBoard(board, ROW, COL);//下棋while (1){PlayerMove(board, ROW, COL);//判断输赢result = IsWin(board, ROW, COL);if (result != 'C'){break;}DispalyBoard(board, ROW, COL);ComputerMove(board, ROW, COL);//判断输赢result = IsWin(board, ROW, COL);if (result != 'C'){break;}DispalyBoard(board, ROW, COL);}if (result == Player_Choice){printf("----------你赢了----------\n");}else if (result == Computer_Choice){printf("----------电脑赢了----------\n");}else{printf("----------平局----------\n");}DispalyBoard(board, ROW, COL);
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();//打印菜单printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误!\n");break;}} while (input);return 0;
}
4 游戏代码的缺陷
这个电脑是随便下棋的,它没有动脑子,每次生产随机的坐标,不把我们放心上。不追求矢量直线。
你说如果棋盘再大一带你的,电脑也知道适量原则。人下棋的胜率会低多少呢?
不过想要和电脑下平局还是很难的。因为我总要电脑让着我。
相关文章:
C语言---井字棋(三子棋)
Tic-Tac-Toe 1 游戏介绍和随机数1.1 游戏介绍1.2 随机数的生成1.3 棋盘大小和符号 2 设计游戏2.1 初始化棋盘2.2 打印棋盘2.3 玩家下棋2.4 电脑下棋2.5 判断输赢2.6 game()函数2.7 main()函数 3 完整三子棋代码3.1 Tic_Tac_Toe.h3.2 Tic_Tac_Toe.c3.3 Test.c 4 游戏代码的缺陷 …...
[Kubernetes]3. k8s集群Service详解
在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…...
C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))
通过lambda表达式 std::iota()实现: template <typename Tp> inline void print_vec(const std::vector<Tp>& vec) {fmt::print("[{}]\n", fmt::join(vec, ", ")); }// 相当于Python的lst list(range(31, 90))const std::ve…...
【Java之数据结构与算法】
选择排序 package Code01;public class Code01_SelectionSort {public static void selectionSort(int[] arr) {if(arrnull||arr.length<2) {return;}for(int i0;i<arr.length;i) {int minIndex i;for(int ji1;j<arr.length;j) {minIndex arr[minIndex] > arr[j…...
爬虫scrapy中间件的使用
爬虫scrapy中间件的使用 学习目标: 应用 scrapy中使用间件使用随机UA的方法应用 scrapy中使用代理ip的的方法应用 scrapy与selenium配合使用 1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为: 下载中间件…...
普冉(PUYA)单片机开发笔记 [完结篇]:使用体会
失败的移植:FreeRTOS 当使用了 PY32F003 的各种接口和功能后,手痒痒想把 FreeRTOS 也搬到这个 MCU 上,参考 STM32 和 GD32 对 FreeRTOS 的移植步骤,把 FreeRTOS v202212.00 版本的源码搬到了 Keil 工程中,编译倒是通过…...
Elasticsearch:生成 AI 中的微调与 RAG
在自然语言处理 (NLP) 领域,出现了两种卓越的技术,每种技术都有其独特的功能:微调大型语言模型 (LLM) 和 RAG(检索增强生成)。 这些方法极大地影响了我们利用语言模型的方式,使它们更加通用和有效。 在本文…...
ip静态好还是dhcp好?
选择使用静态 IP 还是 DHCP(动态主机配置协议)取决于您的网络需求和环境。下面是它们的一些特点和适用场景: 静态 IP: 固定的 IP 地址:静态 IP 是手动配置在设备上的固定 IP 地址,不会随时间或网络变化而改…...
PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评
为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中,从使用体验的角度看…...
Convolutional Neural Network(CNN)——卷积神经网络
1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…...
鸿蒙开发基本概念
1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…...
Open CV 图像处理基础:(二)从基本概念到实践操作
Open CV 图像处理基础:从基本概念到实践操作 一、引言 图像处理是计算机视觉领域的一个重要分支,它涉及对图像的各种操作和处理。了解图像的基本概念、读取和显示方法以及基本操作是图像处理的基础。本文将通过示例文章的形式,帮助初学者逐…...
【MAC】M2 安装docker 与 mysql
一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作: sudo dock…...
轻量级web开发框架Flask本地部署及无公网ip远程访问界面
文章目录 前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,采用P…...
用最通俗的语言讲解 TCP “三次握手,四次挥手”
目录 一. 前言 二. TCP 报文的头部结构 三. 三次握手 3.1. 三次握手过程 3.2. 为什么要三次握手 四. 四次挥手 4.1. 四次挥手过程 4.2. 为什么要四次挥手 五. 大白话说 5.1. 大白话说三次握手 5.2. 大白话说四次挥手 六. 总结 一. 前言 TCP 是一种面向连接的、可靠…...
使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis
1.背景 生产环境,某云的某个业务Redis实例,触发内存使用率,连续 3 次 平均值 > 85 %告警。 运维同学告知,看看需要怎么优化或者升级配置?分享了其实例RDB的内存剖析链接。 通过内存剖析详情发现,存在某…...
机器视觉:AI赋能缺陷检测,铸就芯片产品的大算力与高能效
导言:近年来,国内芯片行业快速发展,市场对芯片需求的不断增大,芯片的缺陷检测压力也越来越大。芯片产品在生产制造过程中,需要经历数道工序,每个生产环节的材料、环境、工艺参数等都有可能造成产品缺陷。不…...
(9)Linux Git的介绍以及缓冲区
💭 前言 本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 "进度条" 小程序。最后我们来介绍一下 Git,着重讲解一下 Git 三板斧,一般只要掌握三板斧就基本够用了。 缓冲区ÿ…...
华为云之ECS云产品快速入门
华为云之ECS云产品快速入门 一、ECS云服务器介绍二、本次实践目标三、创建虚拟私有云VPC1.虚拟私有云VPC介绍2.进入虚拟私有云VPC管理页面3.创建虚拟私有云4.查看创建的VPC 四、创建弹性云服务器ECS——Linux1.进入ECS购买界面2.创建弹性云服务器(Linux)——基础配置步骤3.创建…...
tcp 的限制 (TCP_WRAPPERS)
#江南的江 #每日鸡汤:青春是打开了就合不上的书,人生是踏上了就回不了头的路,爱情是扔出了就收不回的赌注。 #初心和目标:拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具,他…...
如何保证架构的质量
1. 如何保证架构的质量: ①. 稳定性、健壮性(1). 系统稳定性: ①. 定义:a. 当一个实际的系统处于一个平衡的状态时,如果受到外来作用的影响时,系统经过一个过渡过程仍然能够回到原来的平衡状态.b. 可以说这个系统是稳定的,否则系统不稳定c. 如一根绳子绑着小球,处于垂直状态,…...
JavaWeb笔记之前端开发JavaScript
一、引言 1.1 简介 JavaScript一种解释性脚本语言,是一种动态类型、弱类型、基于原型继承的语言,内置支持类型。 它的解释器被称为JavaScript引擎,作为浏览器的一部分,广泛用于客户端的脚本语言,用来给HTML网页增加…...
SCAU:18063 圈中的游戏
18063 圈中的游戏 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。输入格式 输入一个数n&a…...
.NET Core中鉴权 Authentication Authorization
Authentication: 鉴定身份信息,例如用户有没有登录,用户基本信息 Authorization: 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1.首先在服务容器注入鉴权服务和Cookie服务支持 services.AddAuthentication(options > {options.DefaultAuthe…...
PyTorch深度学习实战(26)——卷积自编码器(Convolutional Autoencoder)
PyTorch深度学习实战(26)——卷积自编码器 0. 前言1. 卷积自编码器2. 使用 t-SNE 对相似图像进行分组小结系列链接 0. 前言 我们已经学习了自编码器 (AutoEncoder) 的原理,并使用 PyTorch 搭建了全连接自编码器,但我们使用的数据…...
Milvus实战:构建QA系统及推荐系统
Milvus简介 全民AI的时代已经在趋势之中,各类应用层出不穷,而想要构建一个完善的AI应用/系统,底层存储是不可缺少的一个组件。 与传统数据库或大数据存储不同的是,这种场景下则需要选择向量数据库,是专门用来存储和查…...
使用Docker部署Nexus Maven私有仓库并结合Cpolar实现远程访问
文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具,用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关,可…...
GEE-Sentinel-2月度时间序列数据合成并导出
系列文章目录 第一章:时间序列数据合成 文章目录 系列文章目录前言时间序列数据合成总结 前言 利用每个月可获取植被指数数据取均值,合成月度平均植被指数,然后将12个月中的数据合成一个12波段的时间数据合成数据。 时间序列数据合成 代码…...
【深度学习】语言模型与注意力机制以及Bert实战指引之二
文章目录 前言 前言 这一篇是bert实战的完结篇,准备中。...
计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签
文章目录 5 IPv65.1 组成5.2 IPv6地址5.3 从IPv4向IPv6过渡5.3.1 双协议栈5.3.2 隧道技术 6 因特网的路由选择协议6.1 内部网关协议RIP6.2 内部网关协议 OSPF基本特点 6.3 外部网关协议 BGP6.3.1 路由选择 6.4 路由器组成6.4.1 基本了解6.4.2 结构 7 IP多播7.1 硬件多播7.2 IP多…...
区块链网站怎么做/培训教育机构
2019独角兽企业重金招聘Python工程师标准>>> yum clean metadata yum clean dbcache yum makecache 转载于:https://my.oschina.net/u/2009816/blog/864641...
柳州网站建设价格/内蒙古网站seo
说到原型法,首先应该想到原型模型,20 世纪 80 年代中期推出一种新的开发模式,弥补了传统结构化生命周期法的不足,缩短了开发周期,减少了开发风险,这种开发模型叫作原型模型。原型模型是先借用已有软件系统作…...
深圳 高端 建站公司/模板建站的网站
我有一台部署在 AWS 上的 Ubuntu 系统,在它的里面有一个脚本,这个脚本的原有目的是以一定间隔(准确来说是每隔 1 分钟)去检查某个特定服务是否正在运行,如果这个服务因为某些原因停止了,就自动重启这个服务…...
黄骅市领导班子最新调整/百度seo招聘
Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法&…...
口碑营销的策略技巧/seo是搜索引擎营销吗
yum -y install screen screen -S lnmp 记录session会话 ssh客户端中断再连接后 screen -r lnmp 恢复会话转载于:https://blog.51cto.com/kongdq/967746...
网站浏览器/苏州seo建站
题干: 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: List Merge( List L1, List L2 );其中List结构定义如下: typedef struct Node *PtrToNode; struct Node {ElementType …...