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

《追逐胜利:编程之路上的三子棋游戏实践》

文章目录

  • 前言
  • 一、三子棋游戏规则
  • 二、步骤详解
    • 1.游戏菜单的实现
    • 2.棋盘的实现
      • 2.1 初始化棋盘
      • 2.2 打印棋盘
    • 3.游戏逻辑实现
      • 3.1 玩家下棋
      • 3.2 电脑下棋
    • 4.判断输赢
      • 4.1 win函数实现
    • 5.完整代码
  • 总结


前言

大家好!我是艾老虎尤!今天我很高兴来和大家分享我最近的一个项目——用C语言实现的三子棋小游戏。作为一个编程爱好者,我对游戏开发也比较感兴趣,而通过写这篇博客,我想向大家展示我在这个小游戏中的实践经验和收获,为了增加自己的描述和方便大家的理解,一些地方我也会画图为大家展示,话不多说,我们直接开始!


一、三子棋游戏规则

  1. 三子棋是一种在3x3的棋盘上进行的井字游戏。游戏开始时,棋盘上没有任何棋子。
  2. 两名玩家轮流执黑白棋子,黑子先行。
  3. 游戏过程中,每个玩家可以在空余的格子上放置自己的棋子。
  4. 每个玩家的目标是在棋盘上形成三颗自己的棋子连成一条线,可以是横向、纵向或对角线。
  5. 若某个玩家达成了连接三颗棋子的目标,则游戏结束,该玩家获胜。
  6. 若棋盘上的格子被填满且没有任何玩家成功连成一条线,则游戏以平局结束。

二、步骤详解

1.游戏菜单的实现

一个好的游戏菜单不光可以提高游戏的观赏性,更关键的是提示玩家如何开始游戏等等,所以我们第一步先把游戏菜单编辑出来,这一部分代码比较简单,我们只需要把游戏菜单打印在屏幕上,告知玩家选1的话就开始游戏,选0结束游戏,选其他的数字就提示他选择错误,先看代码。

代码如下:

#include<stdio.h>void menu()
{printf("********************\n");printf("***  1.开始游戏  ***\n");printf("***  0.退出游戏  ***\n");printf("********************\n");}void test()
{int input = 0;//输入值do{menu();//打印菜单printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("实现游戏\n");break;case 0:printf("退出游戏成功!\n");break;default:printf("不好意思,选择错误,请重新选择!\n");break;}} while (input);
}int main()
{test();//测试逻辑return 0;
}

这里我们使用test函数实现打印菜单和选择游戏开始的逻辑,我们再使用menu函数打印游戏的菜单,再利用do whileswith实现游戏开始的选择,这里非常巧妙地是input这个变量,它不但控制了do whiel和switch的表达式,还控制了switch的语句项,可以说一举三得。

效果展示:
在这里插入图片描述

2.棋盘的实现

在游戏的介绍中也说到过, 三子棋是一种在3x3的棋盘上进行的井字游戏,所以我们使用一个二维数组表示即可,刚好对应了棋盘上的九个位置,这时候我们就需要在上面代码中的case 1写一个函数game,我们将会在这个函数里面实现游戏。

代码如下:

void game()
{char arr[3][3];
}

为了方便,我们使用#define定义一个行ROW再定义一个列COL,它们的值为3。
然后我们就需要初始化棋盘,使里面的元素全部为空格,初始化后我们打印棋盘,看看效果。

#define ROW 3
#define COL 3void game()
{char board[ROW][COL];//初始化棋盘全为空格init_board(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);
}

2.1 初始化棋盘

初始化棋盘代码如下:

//初始化棋盘
void init_board(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++){board[i][j] = ' ';}}
}

2.2 打印棋盘

当把棋盘初始化后,我们就可以打印棋盘了

打印棋盘代码如下:

//打印棋盘
void print_board(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]);}printf("\n");}
}

逻辑是这样没错,但是我们在这个函数之前把棋盘初始化成空格了,所以我们打印出来棋盘什么都看不见,下面我们就要来实现打印出,如下图
居中的图片
想要打印,有一个方法很简单,我们把它拆分以下,如下图

在这里插入图片描述
在这里插入图片描述
代码运行效果:

在这里插入图片描述

当我们实现完代码后,发现最后面的|多了,所以我们要对它额外进行判断,就是让它少打印一次。

修改后的代码:

//打印棋盘
void print_board(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){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}

运行效果:
在这里插入图片描述


3.游戏逻辑实现

当棋盘部分设计好之后,我们就需要开始游戏逻辑的实现。

3.1 玩家下棋

假设游戏中玩家是先手,我们接下来写一个函数player_move(board, ROW, COL);来实现玩家下棋的动作。

首先我们需要一条指令提醒玩家可以开始下棋了,直接用printf即可
然后让玩家输入要下棋的坐标,因为我们程序员知道数组的下标是从0开始的,但是玩家不一定知道,如下图:
在这里插入图片描述
当玩家输入坐标时,我们还要判断坐标的合法性
判断的规则就是横坐标要大于等于1,小于等于3
纵坐标要大于等于1,小于等于3
只有这样,输入的坐标才有用
具体看下面的代码和注释

//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋\n");//死循环,防止坐标被占用和非法坐标while(1){printf("请输入下棋位置坐标\n");int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x >= 1 && x <= 3 && y >= 1 && y <= 3){if (board[x - 1][y - 1] == ' ')//判断输入的坐标为不为空{board[x - 1][y - 1] = 'O';//玩家下棋用O表示break;//跳出循环}else{printf("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入!\n");}}
}

然后输入完我们再调用一下打印棋盘的函数

效果展示:
在这里插入图片描述
注意,我们这里把玩家下棋,打印棋盘的函数放到了while循环里面,让让它死循环


3.2 电脑下棋

假设游戏中电脑是后手,我们接下来写一个函数computer_move(board, ROW, COL);来实现带电脑下棋的动作。

电脑下棋的逻辑就是随机生成坐标,看下面代码和注释

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");while (1){//生成随机坐标int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'X';break;}}
}

效果展示
在这里插入图片描述
生成随机数的解释可以参考我的这篇文章:C语言实现猜数字小游戏


4.判断输赢

我们的逻辑是玩家下棋,下完了打印棋盘,然后电脑下棋,然后再打印棋盘

	while (1){//玩家下棋player_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);//电脑下棋computer_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);}

于是我们在玩家下完棋之后写一个判断输赢的函数win,在电脑下完棋之后再调用这个函数判断输赢,而判断输赢就是看横纵坐标和斜着的是不是三个相连,最后不光要判断输赢,还要看是玩家赢了还是电脑赢了,还是平局了,如果都不是,程序继续。
假设玩家赢了返回:O
电脑赢了返回:X
平局返回:Q
游戏继续返回:C

	while (1){//玩家下棋player_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);//判断输赢ret = win(board, ROW, COL);if (ret != 'C'){break;}//电脑下棋computer_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);//判断输赢ret = win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == 'O')printf("恭喜你!你赢了!\n");else if (ret == 'X')printf("电脑获胜,你失败了!\n");else if (ret == 'Q')printf("平局");
}

4.1 win函数实现

这里我们需要判断每一行和每一列,还有两个对角是不是三个是相同的元素。

//判断平局
int full(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++){if (board[i][j] == ' ')return 0;}}return 1;
}//判断输赢
char win(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][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[0][0];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){return board[0][2];}//平局if (full(board, row, col) == 1){return 'Q';}//游戏继续return 'C';
}

5.完整代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu()
{printf("********************\n");printf("***  1.开始游戏  ***\n");printf("***  0.退出游戏  ***\n");printf("********************\n");}void game()
{char ret = 0;char board[ROW][COL];//初始化棋盘全为空格init_board(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);while (1){//玩家下棋player_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);//判断输赢ret = win(board, ROW, COL);if (ret != 'C'){break;}//电脑下棋computer_move(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);//判断输赢ret = win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == 'O')printf("恭喜你!你赢了!\n");else if (ret == 'X')printf("电脑获胜,你失败了!\n");else if (ret == 'Q')printf("平局");
}void test()
{srand((unsigned int)time(NULL));int input = 0;//输入值do{menu();//打印菜单printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 2:printf("退出游戏成功!\n");break;default:printf("不好意思,选择错误,请重新选择!\n");break;}} while (input);
}int main()
{test();//测试逻辑return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//函数的实现//初始化棋盘
void init_board(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++){board[i][j] = ' ';}}
}//打印棋盘
void print_board(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){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋\n");//死循环,防止坐标被占用和非法坐标while(1){printf("请输入下棋位置坐标\n");int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x >= 1 && x <= 3 && y >= 1 && y <= 3){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'O';break;}else{printf("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入!\n");}}
}//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");//生成随机坐标while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'X';break;}}
}//判断平局
int full(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++){if (board[i][j] == ' ')return 0;}}return 1;
}//判断输赢
char win(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][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[0][0];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){return board[0][2];}//平局if (full(board, row, col) == 1){return 'Q';}//游戏继续return 'C';
}

game.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 3
#define COL 3//函数的声名//初始化
void init_board(char board[ROW][COL], int row,int col);//打印棋盘
void print_board(char board[ROW][COL], int row, int col);//玩家下棋
void player_move(char board[ROW][COL], int row, int col);//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);//判断输赢
char win(char board[ROW][COL], int row, int col);

运行效果
在这里插入图片描述

总结

在这篇博客中,我们详细介绍了使用C语言实现三子棋游戏的过程。首先,我们了解了三子棋游戏的规则和目标。接着,我们详细讨论了程序的设计和实现过程。我们使用了多个函数来处理不同的功能,如打印游戏板、获取玩家输入、判断胜负等。并调用合适的函数来执行游戏的不同步骤,我们成功地实现了一个简单而实用的三子棋游戏,通过这个项目,我不仅深化了我对于C语言的理解和运用,还提高了我的编程技巧。在实现三子棋小游戏的过程中,我进一步加强了我的算法思维和逻辑分析能力,并通过反复调试和优化来提升程序的性能。这个项目让我得到了满满的成就感,也增加了我的编程兴趣。我相信这次实践对于未来我的编程之路会产生积极的影响,我会继续探索和挑战更多有趣且有意义的项目,希望我的文章能给大家带来帮助。

相关文章:

《追逐胜利:编程之路上的三子棋游戏实践》

文章目录 前言一、三子棋游戏规则二、步骤详解1.游戏菜单的实现2.棋盘的实现2.1 初始化棋盘2.2 打印棋盘 3.游戏逻辑实现3.1 玩家下棋3.2 电脑下棋 4.判断输赢4.1 win函数实现 5.完整代码 总结 前言 大家好&#xff01;我是艾老虎尤&#xff01;今天我很高兴来和大家分享我最近…...

身份和访问管理解决方案:混合型IAM

对于依赖于本地 IT 基础结构和传统安全模型的组织&#xff0c;可以更轻松地验证和授权企业网络内的所有内容&#xff0c;包括设备、用户、应用程序和服务器。尝试从公司网络外部获取访问权限的用户使用虚拟专用网络 &#xff08;VPN&#xff09; 和网络访问控制 &#xff08;NA…...

微信小程序动态添加表单模块

先来看看效果&#xff1a; 屏幕录制 2023-09-14 16.33.21 点击添加请假按钮&#xff0c;就会新增一个请假信息表单&#xff1b;点击左上角红色删除按钮&#xff0c;删除当前表单&#xff1b; 源码下载地址&#xff1a;https://download.csdn.net/download/xq30397022/88339822…...

HTML5+CSS3小实例:纯CSS实现彩虹倒映水面的唯美背景

实例:纯CSS实现彩虹倒映水面的唯美背景 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" …...

Beautiful Soup简介

BeautifulSoup是一个Python库&#xff0c;用于从HTML或XML文件中提取数据。它提供了一种简单而直观的方式来遍历、搜索和修改HTML或XML文档的结构。 以下是一些BeautifulSoup的主要功能&#xff1a; 解析器&#xff1a;BeautifulSoup支持多种解析器&#xff0c;包括Python的内置…...

Springboot2.7集成websocket及相关问题

1、集成websocket完整代码 导入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 服务端代码 &#xff08;1&#xff09;注入bean Configur…...

MES管理系统和ERP系统在生产制造管理中的应用

MES生产管理系统通过过程管理、质量管理、设备管理、产品跟踪和溯源、性能分析和物料管理等方面来管理生产制造&#xff0c;旨在建立规范的生产管理信息平台&#xff0c;提高企业核心竞争力。ERP系统则通过制定生产计划、细分物料需求计划、车间订单下达和生产回报等步骤进行生…...

Netty Channel 详解

优质博文&#xff1a;IT-BLOG-CN 一、Netty 服务端启动过程 【1】创建服务端Channel&#xff1b; 【2】初始化服务端Channel&#xff1b; 【3】注册Selector&#xff1b; 【4】端口绑定&#xff1a;我们分析源码的入口从端口绑定开始&#xff0c;ServerBootstrap的bind(int in…...

技师学院物联网实训室建建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…...

SpringBoot项目--电脑商城【增加/减少购物车商品数量】

1.持久层[Mapper] 1.1规划需要执行的SQL语句 1.更新该商品的数量.此SQL语句无需重复开发 update t_cart set num?,modified_user?,modified_time? where cid? 2.首先进行查询需要操作的购物车数据信息【查看该条数据是否存在】 SELECT * FROM t_cart WHERE cid?2.接口…...

CSS元素浮动

概述 浮动简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff0c;默认宽与高都是被内容撑开的&#xff08;尽可能小&#xff09;&am…...

MATLAB中islocalmin函数用法

目录 语法 说明 示例 向量中的局部最小值 矩阵行中的最小值 相隔最小值 最小值平台区 突出最小值 islocalmin函数的功能是计算局部最小值。 语法 TF islocalmin(A) TF islocalmin(A,dim) TF islocalmin(___,Name,Value) [TF,P] islocalmin(___) 说明 ​当在 A 的…...

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型&#xff1a;PythonRequestsPytestYAMLAllure &#xff0c;主要是针对之前开发的一个接口项目来进行学习&#xff0c;通过 PythonRequests 来发送和处理HTTP协议的请求接口&#xff0c;使用 Pytest 作为测试执行器&#xff0c;使用 YAML 来管理测…...

双视觉Transformer(Dual Vision Transformer)

摘要 已经提出了几种策略来减轻具有高分辨率输入的自注意机制的计算&#xff1a;比如将图像补丁上的全局自注意过程分解成区域和局部特征提取过程&#xff0c;每个过程都招致较小的计算复杂度。尽管效率良好&#xff0c;这些方法很少探索所有补丁之间的整体交互&#xff0c;因…...

MES系统成为工业4.0首选,制造业真正数字化车间你看过吗?

在日益激烈的市场竞争中&#xff0c;MES管理系统已经成为企业提升生产效率、降低成本、提高竞争力的关键。通过MES管理系统实现数据集成和分析&#xff0c;能够对产品制造过程的各个环节进行可视化控制&#xff0c;从设计、制造、质量、物流等环节全面掌控信息&#xff0c;实现…...

Vuex有几种属性以及它们的意义

有五种&#xff0c;分别是 State、 Getter、Mutation 、Action、 Module。 一、State Vuex 使用单一状态树——是的&#xff0c;用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着&#xff0c;每个应用将仅仅包含一个 store 实…...

PRBP20P-10/250C-EB、PRDP6G-10/30-CB电液比例直动式先导减压阀放大板

PRDP6P-10/30-CB、PRDP6R-10/50-DC、PRDP6G-10/30-CC、PRDP6P-10/50-CB、PRDP6R-10/30-CC、PRDP6G-10/30-CB电液比例直动式先导减压阀 PRBP10P-10/50C-EB、PRBP20P-10/100C-EC、PRBP30P-10/150C-EB、PRBP20P-10/250C-EB、PRBP10P-10/315C-EC、PRBP30P-10/350C-EB电液比例柱塞平…...

GDB之常见缩写命令(十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

MarkText快捷键(随时补充中)

MarkText快捷键 ctrl1&#xff1a;一号标题 &#xff08;需要手动在【左上角】-【file】-【preferences】-【Key Bindings】-【 Transform into Heading 1】手动调整&#xff0c;先将【Switch tab to the 1st】占用快捷键删除才能在下面添加&#xff09; ctrlg&#xff1a;添加…...

每日一题 1601最多可达成的换楼请求数目(子集模版)

题目 1601 我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。 给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 fromi 的楼搬到编号为…...

排序算法-归并排序

属性 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#…...

vue3 整合 springboot 打完整jar包

前端 .env.developmen VITE_APP_BASE_URL/api.env.production VITE_APP_BASE_URL/axios 配置 axios.defaults.baseURL import.meta.env.VITE_APP_BASE_URLpackage.json "scripts": {"dev": "vite --mode development","build": &…...

依赖倒转原则是什么?

依赖倒转原则&#xff08;Dependency Inversion Principle&#xff09;是面向对象设计中的另一个基本原则&#xff0c;它是由Robert C. Martin提出的&#xff0c;它的中心思想是面向接口编程&#xff0c;该原则指出高层模块不应该依赖于低层模块&#xff0c;两者都应该依赖于抽…...

什么是GPT与MBR

GPT&#xff08;GUID Partition Table&#xff09;和MBR&#xff08;Master Boot Record&#xff09;是两种不同的磁盘分区表格式。 MBR是一种较早的磁盘分区表格式&#xff0c;它使用512字节的扇区作为存储空间。MBR分区表可以定义最多4个主分区&#xff0c;每个主分区都可以…...

前后端开发接口联调对接参数

前言 一个完整的互联网系统项目,需要前后端配合,进行上线,针对前端开发者,现在互联网主流的项目都是前后端分离 也就是后端负责提供数据接口,前端负责UI界面数据渲染 凡是在前台数据展示与用户交互的,都是由前端来实现的,而数据来源是由后台服务提供的 在浏览器c端能够发送后端…...

定时任务框架-xxljob

1.定时任务 spring传统的定时任务Scheduled&#xff0c;但是这样存在这一些问题 &#xff1a; 做集群任务的重复执行问题 cron表达式定义在代码之中&#xff0c;修改不方便 定时任务失败了&#xff0c;无法重试也没有统计 如果任务量过大&#xff0c;不能有效的分片执行 …...

idea项目配置三大步

场景&#xff1a; 使用 idea 打开一个新项目的时候&#xff0c;想让项目迅速跑起来&#xff0c; 其实只需要下面简单三步&#xff1a; 1. 首先&#xff0c;配maven 2. 其次&#xff0c;配置 jdk 这里配置 project 就行了&#xff0c;不用管Modules中的配置。 3. 最后&#…...

学会SpringMVC之自定义注解各种场景应用,提高开发效率及代码质量

目录 一、简介 ( 1 ) 是什么 ( 2 ) 分类 ( 3 ) 作用 二、自定义注解 ( 1 ) 如何自定义注解 ( 2 ) 场景演示 场景一&#xff08;获取类与方法上的注解值&#xff09; 场景二&#xff08; 获取类属性上的注解属性值 &#xff09; 场景三&#xff08; 获取参数修…...

步态识别常见模块解读及代码实现:基于OpenGait框架

步态识别常见模块解读及代码实现&#xff1a;基于OpenGait框架 最近在看步态识别相关论文&#xff0c;但是因为记忆力下降的原因&#xff0c;老是忘记一些内容。因此记录下来方便以后查阅&#xff0c;仅供自己学习参考&#xff0c;没有背景知识和论文介绍。 目录 步态识别常见…...

前端八股文之“闭包”

一、定义 一句话概括闭包&#xff1a;能够访问函数内部变量的函数与这个变量的组合构成了闭包结构。如下代码 function fuc1(){let num 999return function fuc2(){console.log(num)}}fuc1()(); 如代码所示&#xff0c;fuc2和父级变量num构成了一个闭包环境。 二、原理 子…...

微信网站推广/推广赚佣金的软件排名

select select_list [ into new_table ] from table_source [ where search_condition ] [ group by broup_by_expression ] [ having search_condition ] [order by order_by_expression [ asc | desc ] select查询语句中的主要参数说明如下 select_list:查询的列或者表达式的…...

网站建设框架/体验式营销案例

本来指望着&#xff0c;清明节期间&#xff0c;把c语言相关的&#xff0c;自己还记得的知识做一下整理&#xff0c;现在刚整理到40篇&#xff0c;就已经有点耐不住了。 太着急了&#xff0c;这样着急去做一件事儿&#xff0c;没用。 有时候&#xff0c;想着能制定schedule&…...

贵阳市 网站建设/10000个免费货源网站

当需要将第三方代码加入我们的android工程时&#xff0c;或者为了增加反编译难度等原因需要编译动态库.so文件&#xff0c;就要注意以下几点&#xff1a; 首先是编译出.so &#xff0c;这时其实也可以编译成静态库然后链入最终的.so中。 编译.so需要在android工程的jni中放入源…...

上海房屋装修公司实力排名/优化营商环境心得体会1000字

在逛知乎时&#xff0c;偶然看到一个问题&#xff1a;并联电容器组集中补偿中熔断器的作用是什么&#xff1f;那么要回答这个问题&#xff0c;首先来看下什么是熔断器——熔断器是指当电流超过规定值时&#xff0c;以本身产生的热量使熔体熔断&#xff0c;断开电路的一种电器。…...

cpa推广app赚钱联盟平台/北京网站建设东轩seo

帮粉丝找问题&#xff0c;卧推半年多了&#xff0c;还是没找到胸肌发力的感觉&#xff0c;看看你是否跟他一样。一位好友的微信截图一个好友的求助前几天&#xff0c;一个微信上的粉丝给我发消息说&#xff1a;自己卧推已经半年多了&#xff0c;可还是找不到好的胸肌发力感觉&a…...

做网站需要虚拟主机还是服务器/5118和百度指数

...