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

C语言实现三子棋

通过一段时间的学习,我们已经能够较为熟练地使用分支语句循环语句,创建函数,创建数组,创建随机数等。之前我们做过一个扫雷游戏,今天让我们再尝试创作一个三子棋游戏吧~

一、三子棋游戏的思路

三子棋的游戏规则很简单,游戏界面是一个3*3的棋盘,玩家双方依次向棋盘中放置棋子,我的棋子用‘X’表示,对手的棋子用‘O’表示,我们需要让自己的棋连在一起,同时还要阻拦对方的棋子组成连线,当有三个相同的棋子横向相连,纵向相连,或者交叉相连,那么这个棋子的持有者就获胜了

好了,那么既然我们已经了解了三子棋的游戏思路,那让我们试着分析一下,想要用C语言制作出三子棋的游戏,大体需要分成几个步骤?

1.游戏菜单

创造出一个比较美观的游戏菜单,可以选择开始游戏和退出游戏。

2.三子棋的棋盘

创造出一个3*3的三子棋游戏棋盘

3.双方下棋

玩家输入坐标,向三子棋棋盘中放置棋子

(玩家落子需要输入坐标,电脑落子需要srand函数创造随机数)

4.判定胜负

通过对当前棋盘中棋子的计算,来判定是,或者和棋

二、三子棋游戏的游戏文件

与之前的扫雷游戏一样,还是需要分成头文件game.h源文件game.c源文件test.c三个文件。

他们的作用分别是:

  • game.h:作为头文件,它用来存放创造游戏所需要的各种类型的全局变量,并且也用来实现编写代码使所必需的函数说明
  • game.c: 存放各种实现游戏功能所需要的函数。
  • test.c:作为编译的主程序,存放主函数,编写实现游戏功能的主要思想。

(这里使用三个文件只是为了方便,并且修改代码和改进代码时会更快捷,但其实不使用三个也是可以的)

三、实现游戏的各种函数

1.创建游戏菜单

就像我们平常打一个游戏一样,我们自己做出的三子棋游戏也是需要有选择菜单的。如果没有选择菜单就无法明确如何游戏。

void GameInte()
{printf("**************************\n");printf("----- 三 子 棋 游 戏 -----\n");printf("**************************\n");printf("*******   1.play   *******\n");printf("*******   0.quit   *******\n");printf("**************************\n");printf("是否游玩?请输入>:");
}

我们需要将菜单函数GameInte在源文件game.c中进行创建和定义,然后再在头文件game.h中对函数进行声明。就像这个样子:

2.完成棋盘初始化

因为需要创建一个3*3的棋盘,所以我们可以创建一个char型的二维数组,board[ROW][COL],(我们把ROW和COL创建成常量,因为是三子棋直接设置成ROW和COL的值都为3就好,如此一来,如果以后像制作五子棋之类的棋盘就会更加简单。像这样

我们只需要用 -- 和 | 组成一个3*3的框架,然后再把棋子依次放入里面就可以了。而放入棋子之前需要把棋子的char值设定为‘  ’,这样才算是空,往里下入棋子后随之改变在棋盘中对应坐标的符号就好了。

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

这样就能将一个二维数组的所有制都初始化为' '啦。

3.打印棋盘

打印棋盘要注意,不能直接把二维数组的所有值都输出就算成功,因为二维数组的初始化我们把所有值都定义为‘ ’了,所以打印出来是不显示的,我们可以选择用 | 和 -- 等符号进行辅助,来打印出一个美观且成型的棋盘。

void PrintBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf(" ----+---+----\n");for (i = 0; i < row; i++){printf(" | %c | %c | %c | \n", board[i][0], board[i][1], board[i][2]);printf(" ----+---+----\n");}
}

这样就能打印出一个3*3的棋盘啦,并且能够成功的将所有的元素都放进去。

棋盘样例:

4.玩家下棋

(因为玩家下棋是自动输入,而电脑下棋是随机数输出,所以需要放到两个函数中更加清晰易懂并且容易后期改良)

我们需要定义一个函数,实现玩家能够输入坐标,就能改变棋盘上的格局,比如玩家输入1,1,就能够让棋盘上多一个玩家的棋子。并且我们需要限定输入坐标的位置,不能超过也不能少于这个范围,同时也不能下到已经有棋子的位置。

void PlyaChess(char board[ROW][COL], int row, int col)
{int a;int b;while (1){printf("请输入下棋的坐标:>");scanf("%d %d", &a, &b);int m = a - 1;int n = b - 1;if(a<=0||a>=row+1||b<=0||b>=col+1){printf("输入错误,请重新输入:>");continue;}else if(board[m][n]!=' '){printf("你是想叠罗汉吗?\n");printf("请重新输入:>\n");continue;}board[m][n] = 'X';PrintBoard(board, ROW, COL);break;}
}

像这样设定两个分支条件语句就能分别控制,制止两种的发生。

5.电脑下棋

电脑下棋就需要用到我们之前所提到的srand()函数和rand来创造随机数,还是在主函数输入srand((unsigned int)time(NULL))这串代码来使随机数rand的种子随时间变化而变化,让它成为真正的随机数,然后使用rand()%rowrand()%col来创造出两个随机数,让电脑在棋子上下棋,遇到有棋子的地方就goto到上面重新生成随机数。

void ComputerChess(char board[ROW][COL], int row, int col)
{again:int m = rand() % row;int n = rand() % col;Sleep(1000);if (board[m][n] == ' '){board[m][n] = 'O';}else {goto again;}PrintBoard(board, ROW, COL);
}

(我们可以利用sleep函数添加一个让电脑思考的时间(只是假思考~),这样能让游戏更加带有真实性和参与的感觉。注:需要添加#include <windows.h>头文件

这就是成功的制作出让电脑下棋的步骤啦。

6.判断赢输与和棋

我们可以通过计算棋盘上的行,列,以及交叉的区域中,是否有相连的三个相同符号来确定这局三子棋的最终结果。而对于行,列的计算其实还是比较简单的,我们只需要用两个for循环的嵌套,因为两个嵌套来表示board数组的话,正好是一排一排定义的,所以我们可以第一次用for(i=0;i<row;i++),先在外层循环里定义两个初始值为0的变量分别作为'X'和'O'的计数器,内层嵌套for(j=0;j<col;j++),然后判定每一行的各个元素是否为'X'或'O',如果是'X'则对应的计数器+1,如果是'O'也同理,如果判定出有一行中都为'X'或'O'则宣布谁获胜,游戏结束。

(将两个计数器放在外层循环的目的是:每次外层循环,i变化时都会进入第二列/行的输出,此时需要重新从0开始记起)

接下来让我们再思考一下如何判定交叉区域的输赢:因为定义的是3*3的棋盘,所以只有[1][1]到[3][3]坐标和[1][3]到[3][1]这两种情况,我们仍然可以用for循环来解决。

思路有了,敲代码吧~

判断行获胜:

int WinChess(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++)//判断行获胜{int Asum = 0;int Bsum = 0;for (j = 0; j < col; j++){if (board[i][j] == 'X'){++Asum;if (Asum == 3)return 1;}else if(board[i][j] == 'O'){++Bsum;if (Bsum == 3)return 2;}}}

判断列获胜:

for (i = 0; i < row; i++)//判断列获胜{int Asum = 0;int Bsum = 0;for (j = 0; j < col; j++){if (board[j][i] == 'X'){++Asum;if (Asum == 3)return 1;}else if (board[j][i] == 'O'){++Bsum;if (Bsum == 3)return 2;}}}

判断交叉获胜:

int Asum = 0;int Bsum = 0;for (i = 0; i < row; i++)//判断交叉获胜{if ((board[i][i] == 'X') || (board[i][row - 1 - i] == 'X')){++Asum;if (Asum == 3)return 1;}else if ((board[i][i] == 'O') || (board[i][row - 1 - i] == 'O')){++Bsum;if (Bsum == 3)return 2;}}

那么接下来我们要来判断和棋的时候是什么情况,因为判断输赢已经使这个函数变得比较复杂了,所以我们再定义一个新的函数Full,用来判断棋盘是否已经满了,如果满了则返回1,没满则返回0。

int Full(char chessBoard[ROW][COL])
{for (int row = 0; row < ROW; row++){for (int col = 0; col < COL; col++){if (chessBoard[row][col] == ' '){return 0;}}}return 1;
}

我们需要利用Full函数的返回值确定是否为满,并且在判断获胜或者失败之前,如果函数已为满,则先判断是否为和棋,这样能够防止程序因为判断不出获胜或失败则return0导致程序继续进行(而此时电脑已经没有地方可以下棋了,会导致游戏终止)

好啦~这次我们已经把所有的准备工作都完成啦,让我们来看一下主函数main是什么样子的吧~

#include"game.h"
int game()
{//棋盘初始化BoardCreate(board, ROW, COL);//打印棋盘PrintBoard(board, ROW, COL);while (1){//玩家下棋PlyaChess(board, ROW, COL);if (Full(board) == 1){if ((WinChess(board, ROW, COL)) == 1){printf("恭喜玩家获胜!!!");break;}if ((WinChess(board, ROW, COL)) == 0){printf("你和人机势均力敌,你是人机嘛");break;}}//电脑下棋ComputerChess(board, ROW, COL);if ((WinChess(board, ROW, COL)) == 1){printf("恭喜玩家获胜!!!");break;}if ((WinChess(board, ROW, COL)) == 2){printf("你被人机打败了!");break;}}
}
int main()
{srand((unsigned int)time(NULL));int a;do{//创造菜单GameInte();scanf("%d", &a);if (a == 1){game();break;}else if (a == 0){printf("退出游戏");break;}else {printf("输入错误,请重新输入:\n");}} while (a);
}

注意,此时我们在主函数中在判断胜利或失败之前加入的,判断是否为和棋的代码中,又加入了判断玩家是否胜利,因为可能玩家最后下的这一枚棋正好导致了棋子填满并且玩家获胜。加入这段判断就不会导致明明在最后一刻棋子满的时候胜利了,却被说是和棋了。

好了,这次已经解决了所有的函数了,让我们运行一下代码看看也没有什么问题~

行相连胜利:

列相连胜利:

交叉相连胜利:

和棋:

落子最后一枚获胜:

嘿嘿,游戏运行完整无误呢,给大家分享一下完整代码吧~

四、游戏完整代码

1.game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 3
#define COL 3
char board[ROW][COL];//创造菜单
void GameInte();//棋盘初始化
void BoardCreate(char board[ROW][COL], int row, int col);//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col);//玩家下棋
void PlyaChess(char board[ROW][COL], int row, int col);//电脑下棋
void ComputerChess(char board[ROW][COL],int row, int col);//判断棋盘是否已满
int Full(char chessBoard[ROW][COL]);//判断赢输与和棋
int WinChess(char board[ROW][COL], int row, int col);
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void GameInte()
{printf("**************************\n");printf("----- 三 子 棋 游 戏 -----\n");printf("**************************\n");printf("*******   1.play   *******\n");printf("*******   0.quit   *******\n");printf("**************************\n");printf("是否游玩?请输入>:");
}char BoardCreate(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 PrintBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf(" ----+---+----\n");for (i = 0; i < row; i++){printf(" | %c | %c | %c | \n", board[i][0], board[i][1], board[i][2]);printf(" ----+---+----\n");}
}void PlyaChess(char board[ROW][COL], int row, int col)
{int a;int b;while (1){printf("请输入下棋的坐标:>");scanf("%d %d", &a, &b);int m = a - 1;int n = b - 1;if(a<=0||a>=row+1||b<=0||b>=col+1){printf("输入错误,请重新输入:>");continue;}else if(board[m][n]!=' '){printf("你是想叠罗汉吗?\n");printf("请重新输入:>\n");continue;}board[m][n] = 'X';PrintBoard(board, ROW, COL);break;}
}int Full(char chessBoard[ROW][COL])
{for (int row = 0; row < ROW; row++){for (int col = 0; col < COL; col++){if (chessBoard[row][col] == ' '){return 0;}}}return 1;
}void ComputerChess(char board[ROW][COL], int row,int col)
{again:int m = rand() % row;int n = rand() % col;int i = 0;int j = 0;int sum = 0;Sleep(500);if (board[m][n] == ' '){board[m][n] = 'O';}else {goto again;}PrintBoard(board, ROW, COL);
}int WinChess(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++)//判断行获胜{int Asum = 0;int Bsum = 0;for (j = 0; j < col; j++){if (board[i][j] == 'X'){++Asum;if (Asum == 3)return 1;}else if(board[i][j] == 'O'){++Bsum;if (Bsum == 3)return 2;}}}for (i = 0; i < row; i++)//判断列获胜{int Asum = 0;int Bsum = 0;for (j = 0; j < col; j++){if (board[j][i] == 'X'){++Asum;if (Asum == 3)return 1;}else if (board[j][i] == 'O'){++Bsum;if (Bsum == 3)return 2;}}}int Asum = 0;int Bsum = 0;for (i = 0; i < row; i++)//判断交叉获胜{if ((board[i][i] == 'X') || (board[i][row - 1 - i] == 'X')){++Asum;if (Asum == 3)return 1;}else if ((board[i][i] == 'O') || (board[i][row - 1 - i] == 'O')){++Bsum;if (Bsum == 3)return 2;}}return 0;
}
3.test.c
#include"game.h"
int game()
{//棋盘初始化BoardCreate(board, ROW, COL);//打印棋盘PrintBoard(board, ROW, COL);while (1){//玩家下棋PlyaChess(board, ROW, COL);if (Full(board) == 1){if ((WinChess(board, ROW, COL)) == 1){printf("恭喜玩家获胜!!!");break;}if ((WinChess(board, ROW, COL)) == 0){printf("你和人机势均力敌,你是人机嘛");break;}}//电脑下棋ComputerChess(board, ROW, COL);if ((WinChess(board, ROW, COL)) == 1){printf("恭喜玩家获胜!!!");break;}if ((WinChess(board, ROW, COL)) == 2){printf("你被人机打败了!");break;}}
}
int main()
{srand((unsigned int)time(NULL));int a;do{//创造菜单GameInte();scanf("%d", &a);if (a == 1){game();break;}else if (a == 0){printf("退出游戏");break;}else {printf("输入错误,请重新输入:\n");}} while (a);
}

相关文章:

C语言实现三子棋

通过一段时间的学习&#xff0c;我们已经能够较为熟练地使用分支语句&#xff0c;循环语句&#xff0c;创建函数&#xff0c;创建数组&#xff0c;创建随机数等。之前我们做过一个扫雷游戏&#xff0c;今天让我们再尝试创作一个三子棋游戏吧~ 一、三子棋游戏的思路 三子棋的游…...

昇思25天学习打卡营第XX天|RNN实现情感分类

希望代码能维持开源维护状态hhh&#xff0c;要是再文件整理下就更好了&#xff0c;现在好乱&#xff0c;不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com...

linux深度学习环境配置(cuda,pytorch)

显卡驱动 首先查看linux服务器是否存在显卡驱动&#xff0c;可以输入以下命令 nvidia-smi如果没有直接显示下面的画面 则进行下面的步骤&#xff1a; ubuntu-drivers devices sudo ubuntu-drivers autoinstall上述步骤的意思是直接在线安装 然后重启linux服务器 reboot发现…...

SpringBoot教程(十九) | SpringBoot集成Slf4j日志门面

SpringBoot教程&#xff08;十九&#xff09; | SpringBoot集成Slf4j日志门面 一、概述二、前言三、引入依赖 (不需要额外引入了)四、自定义Logback的配置文件&#xff08;一般都需配置&#xff09;情况一&#xff1a;不配置任何关于logback的配置文件情况二&#xff1a;配置关…...

科普文:深入理解ElasticSearch体系结构

概叙 Elasticsearch是什么&#xff1f; Elasticsearch&#xff08;简称ES&#xff09;是一个分布式、可扩展、实时的搜索与数据分析引擎。ES不仅仅只是全文搜索&#xff0c;还支持结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等。 官网地址&#xff1a;…...

极限学习机(ELM)预测模型及其Python和MATLAB实现

### 一、背景 在机器学习和数据挖掘领域&#xff0c;预测模型旨在从过往数据中学习规律&#xff0c;以便对未知数据进行预测。随着数据量的激增和计算能力的提升&#xff0c;各种算法不断涌现。其中&#xff0c;极限学习机&#xff08;Extreme Learning Machine, ELM&#xff0…...

基于Python的哔哩哔哩国产动画排行数据分析系统

需要本项目的可以私信博主&#xff0c;提供完整的部署、讲解、文档、代码服务 随着经济社会的快速发展&#xff0c;中国影视产业迎来了蓬勃发展的契机&#xff0c;其中动漫产业发展尤为突出。中国拥有古老而又璀璨的文明&#xff0c;仅仅从中提取一部分就足以催生出大量精彩的…...

Java导出Excel给每一列设置不同样式示例

Excel导出这里不讲&#xff0c;方法很多&#xff0c;原生的POI可以参照 Java原生POI实现的Excel导入导出&#xff08;简单易懂&#xff09; 这里只说怎么给Excel每一列设置不同的样式&#xff0c;比如下面这样的 直接上代码 Overridepublic void exportTemplate(HttpServletRe…...

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作,可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能,用户可以创建各种类型的图形,包括线图、散点图、柱状图、曲线图等,以及三维图形、动画等复杂的可视化效果。 在绘图之前,通常需要先准备好要…...

Datawhale AI夏令营 AI+逻辑推理 Task2总结

Datawhale AI夏令营 AI逻辑推理 Task2总结 一、大语言模型解题方案介绍 1.1 大模型推理介绍 ​ 推理是建立在训练完成的基础上&#xff0c;将训练好的模型应用于新的、未见过的数据&#xff0c;模型利用先前学到的规律进行预测、分类和生成新内容&#xff0c;使得AI在实际应…...

linux常使用的命令

关机命令 shutdown halt poweroff reboot grep 选项 参数 -l 显示所有包含关键字的文件名 -n 在匹配之前加上行号 -c 只显示匹配的行数 -v 显示不匹配的行 管道符 “|” 左边的输出作为右边的输入 例如&#xff1a;我们找个文件包含abc 但是不含有def的文件 grep …...

Ubuntu系统U盘安装与虚拟机安装

一、Ubuntu系统U盘安装 准备工作 下载Ubuntu镜像文件:从Ubuntu官方网站下载最新的LTS(长期支持)版本镜像文件(ISO),以确保系统的稳定性和长期支持。准备U盘:选择一个容量至少为8GB的U盘,并确保U盘中的数据已备份,因为接下来的操作会格式化U盘。制作启动U盘: Windows…...

FastDDS中的线程梳理

目录 线程预览 我们承担ROS&#xff0c;FastDDS&#xff0c;C&#xff0c;cmake等技术的项目开发和专业指导和培训&#xff0c;有10年相关工作经验&#xff0c;质量有保证&#xff0c;如有需要请私信联系。 线程预览 NameTypeCardinality线程名DescriptionEventGeneral每个Dom…...

Signac包-1.Analyzing PBMC scATAC-seq

–https://stuartlab.org/signac/articles/pbmc_vignette 好的&#xff0c;开始学习scATAC-seq的数据是怎么玩的了&#xff0c;先跑完Signac的教程&#xff0c;边跑边思考怎么跟自己的课题相结合。 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 数据和R…...

使用指定版本python创建虚拟机环境

安装python3.9 对于 Ubuntu/Debian&#xff0c;可以使用以下命令&#xff1a; sudo apt update sudo apt install python3.9 对于 CentOS&#xff0c;可能需要先启用 EPEL 存储库&#xff0c;然后使用以下命令&#xff1a; sudo yum install https://dl.fedoraproject.org/…...

【git】git常用命令提交规范

Git 是程序员工作中不可或缺的版本控制工具&#xff0c;以下是一些优化后的常用 Git 命令列表&#xff0c;旨在帮助你更高效地使用 Git 进行版本控制。 基础操作 拉取代码 git clone xxx.git创建分支 git branch dev切换分支 git checkout dev # 或者 git switch dev创建并切换…...

第一个Python Web程序

1、离线安装Django 由于Python是3.7版本,Django选择2.2.4版本,并且中间需要安装依赖包。全部安装包如下: 打开Anaconda Prompt,先进入Python3.7环境,然后依次安装各个包: 至此,Django离线安装成功。 2、编写第一个Django程序 2.1 创建Django项目 创建项目welcome时…...

vector深度剖析及模拟实现

目录 前言vector核心框架模拟实现1. 前期准备2. 构造和销毁补充: 隐式类型转换和多参数构造的区别 3. 迭代器相关4. 容器相关补充: memcpy拷贝问题 5. 元素访问6. vector的修改测试代码 总结 前言 本文重点模拟实现vector的核心接口, 帮助我们更好的理解底层逻辑, 以及对vecto…...

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…...

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...