当前位置: 首页 > 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>…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...