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

C语言经典小游戏之三子棋(超详解释+源码)

“纵有疾风来,人生不言弃,风乍起,合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来?

三子棋小游戏

  • 1.游戏规则介绍
  • 2.游戏准备
  • 3.游戏的实现
    • 3.1生成菜单
    • 3.2游戏的具体实现
      • 3.2.1初始化棋盘
      • 3.2.2打印棋盘
      • 3.2.3玩家下棋(玩家下棋为O)
      • 3.2.4电脑下棋(电脑下棋为X)
      • 3.2.5判断输赢
      • 3.2.6棋盘的优化
  • 4.三子棋游戏完整的代码实现(详细源码)

1.游戏规则介绍

《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
在这里插入图片描述

2.游戏准备

这里呢,我们需要准备三个源文件,分别是test.c game.c game.h(名称随意,尽量通俗易通一些比较好)可能有疑问了,这里为什么需要三个源文件呢?会不会显得很麻烦?在前面的学习中,我们也提到了未来在工程中代码比较多,函数一般放在.h文件中声明,在.c文件中实现。
分文件书写形式的优点:1.方便多人协作 2.保护代码

这里我们给大家介绍一下在三子棋这个游戏里面,每个文件是做什么的呢?
(1)头文件game.h,头文件里是用来存放函数的声明,#define常量的定义,库函数的引用的。
(2)源文件test.c,这个文件里面放的是游戏的测试逻辑。
(3)源文件game.c,这个文件里面放的是游戏的实现逻辑(函数实现)。

3.游戏的实现

3.1生成菜单

这里呢,我们通过switch语句给用户选择,当用户输入不同的数字,我们的程序就会给出不同的功能。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void menu()//生成菜单的函数
{printf("******************************\n");printf("**********  1.play  **********\n");printf("**********  0.exit  **********\n");printf("******************************\n");
}
void game()//实现玩游戏的函数
{}
int main()
{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.2游戏的具体实现

我们发现,在上面的框架代码中缺少了游戏实现部分的代码,这里,我们在慢慢的一点点细化游戏过程。
在这里插入图片描述

首先,我们可以看到,我们需要先构造出一个3*3的棋盘。使得每个九个空位都处于空的状态。这里我们就想到了二维数组的概念,那我们一起来试试吧!

3.2.1初始化棋盘

//game.h
#pragma once
# define ROW 3
# define COL 3
//初始化棋盘的函数的声明
void InitBoard(char board[ROW][COL],int row,int col);//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
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] = ' ';}}
}//test.c
void game()
{//最开始的时候数组的内容全是空格char board[ROW][COL]; InitBoard(board, ROW, COL);
}

在这里插入图片描述

3.2.2打印棋盘

初始化棋盘之后,我们需要将棋盘打印出来才能被用户看到,那么我们同样的可以利用for循环来完成这步操作。

//game.h
//打印棋盘的函数声明
void DisplayBoard(char board[ROW][COL], int row, int col);//game.c
void DisplayBoard(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++){printf("%c", board[i][j]);}printf("\n");}
}//test.c
DisplayBoard(board, ROW, COL);

在这里插入图片描述
在这里插入图片描述
但是我们发现,这里留下了一大片空白,根本看不到棋盘,这是为什么呢?因为我们已经将棋盘初始化为空格了,显然我们是看不到的,而我们想要的是九宫格的样子,这里的话我们就可以用-和|来组成我们的棋盘了。

//game.h
//打印棋盘的函数声明
void DisplayBoard(char board[ROW][COL], int row, int col);//game.c
void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘函数的实现
{int i = 0;int j = 0;for (i = 0; i < row; i++){printf(" %c | %c | %c \n", board[i][0], board[i][1],board[i][2]);printf("---|---|---\n");}
}//test.c
DisplayBoard(board, ROW, COL);

但是,我们发现,这个棋盘还是存在不足,它的下面多了一条线,那么我们就需要调整一下for循环的循环语句了。
在这里插入图片描述
这里,我们给出修改后的代码及运行结果:

//game.h
//打印棋盘的函数声明
void DisplayBoard(char board[ROW][COL], int row, int col);//game.c
void DisplayBoard(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");}
}//test.c
DisplayBoard(board, ROW, COL);

在这里插入图片描述
这样的话,我们通过修改# define ROW 3 # define COL 3的值来改变棋盘的大小:
在这里插入图片描述

3.2.3玩家下棋(玩家下棋为O)

//game.h
//玩家下棋函数声明
void PlayerMove(char board[ROW][COL], int row, int col);//game.c
//玩家下棋函数的实现
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] == ' ')//玩家并不会考虑到数组下标从0开始,这里我们需要考虑进去{board[x - 1][y - 1] = 'O';break;}else{printf("该坐标已被占用,请重新下棋!\n");}}else{printf("坐标非法,请重新输入!\n");}}
}//test.c
while (1){PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//将玩家下棋结果打印出来}

在这里插入图片描述

3.2.4电脑下棋(电脑下棋为X)

//game.h
//电脑下棋函数声明
void ComputerMove(char board[ROW][COL], int row, int col);//game.c
//电脑下棋函数的实现
//电脑随机下棋
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] = 'X';break;}}
}//test.c
while (1){ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//将玩家下棋结果打印出来}

在这里插入图片描述
但是,我们这里目前只考虑让这个游戏玩起来,电脑下棋只是随机产生一些值,并没有任何的逻辑在里面。

3.2.5判断输赢

输赢情况有以下几种:
1.玩家赢-返回O
2.电脑赢-返回X
3.平局-返回Q
4.游戏继续-返回C

//game.h
//判断输赢函数声明
char Is_win(char board[ROW][COL], int row, int col);//game.c
//判断棋盘是不是满了的函数
static int Is_full(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 Is_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[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 (Is_full(board, row, col)){return 'Q';}return 'C';
}//test.c
if (ret == 'O'){printf("玩家赢!\n");}else if (ret == 'X'){printf("电脑赢!\n");}else{printf("平局!\n");}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.6棋盘的优化

我们发现程序基本已经可以运行了,但是如果添加清屏的操作会不会更好呢?这里,我们可以完善一下。
这里我们就需要引入system("cls"),它就可以实现清屏的操作啦!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.三子棋游戏完整的代码实现(详细源码)

game.h文件

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

game.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
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 DisplayBoard(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");}
}
//玩家下棋函数的实现
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] = 'O';break;}else{printf("该坐标已被占用,请重新下棋!\n");}}else{printf("坐标非法,请重新输入!\n");}}
}
//电脑下棋函数的实现
//电脑随机下棋
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] = 'X';break;}}
}
//判断棋盘是不是满了的函数
static int Is_full(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 Is_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[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 (Is_full(board, row, col)){return 'Q';}return 'C';
}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
//创建菜单
void menu()
{printf("******************************\n");printf("**********  1.play  **********\n");printf("**********  0.exit  **********\n");printf("******************************\n");
}
void game()
{char ret = 0;//最开始的时候数组的内容全是空格char board[ROW][COL]; InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);while (1){PlayerMove(board, ROW, COL);//玩家下棋函数调用DisplayBoard(board, ROW, COL);//将玩家下棋结果打印出来//判断输赢ret = Is_win(board, ROW, COL);if (ret != 'C'){break;}system("cls");//清屏DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);//电脑下棋函数调用DisplayBoard(board, ROW, COL);//将电脑下棋结果打印出来ret = Is_win(board, ROW, COL);if (ret != 'C'){break;}	system("cls");//清屏DisplayBoard(board, ROW, COL);}system("cls");//清屏DisplayBoard(board, ROW, COL);if (ret == 'O'){printf("玩家赢!\n");}else if (ret == 'X'){printf("电脑赢!\n");}else{printf("平局!\n");}}
int main()
{int input = 0;srand((unsigned int)time(NULL));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;}

以上就是关于三子棋游戏的全部代码啦!当然这个程序还是存在可优化的空间(比如电脑下棋的时候能不能更加智能一点,还有待思考),欢迎大家在评论区交流。

相关文章:

C语言经典小游戏之三子棋(超详解释+源码)

“纵有疾风来&#xff0c;人生不言弃&#xff0c;风乍起&#xff0c;合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来&#xff1f; 三子棋小游戏 1.游戏规则介绍2.游戏准备3.游戏的实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2.2打印棋盘3.2…...

宝塔Linux面板点击SSL闪退打不开?怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…...

Problem: 6953. 判断是否能拆分数组

Problem: 6953. 判断是否能拆分数组 文章目录 思路解题方法复杂度Code 思路 针对题目中的以下目标&#xff0c;可以转换寻求数组中是否存在前后两个元素之和>m的情况&#xff0c;如果存在则返回ture&#xff0c;如果不存在则返回false。能这样转换的原因是&#xff0c;如果…...

MobiSys 2023 | 多用户心跳监测的双重成形声学感知

注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:<<MobiSys’23,Multi-User A…...

Netty:ChannelInitializer添加到ChannelPipeline完成任务以后会自动删除自己

说明 io.netty.channel.ChannelInitializer是一个特殊的ChannelInboundHandler。它的主要作用是向 Channel对应的ChannelPipeline中增加ChannelHandler。执行完ChannelInitializer的initChannel(C ch)函数以后&#xff0c;ChannelInitializer就会从ChannelPipeline自动删除自己…...

【VUE】项目本地开启https访问模式(vite4)

在实际开发中&#xff0c;有时候需要项目以https形式进行页面访问/调试&#xff0c;下面介绍下非vue-cli创建的vue项目如何开启https 环境 vue: ^3.2.47vite: ^4.1.4 根据官方文档&#xff1a;开发服务器选项 | Vite 官方中文文档 ps&#xff1a;首次操作&#xff0c;不要被类…...

【状态估计】一维粒子滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

设计模式-迭代器模式在Java中使用示例

场景 为开发一套销售管理系统&#xff0c;在对该系统进行分析和设计时&#xff0c;发现经常需要对系统中的商品数据、客户数据等进行遍历&#xff0c; 为了复用这些遍历代码&#xff0c;开发人员设计了一个抽象的数据集合类AbstractObjectList&#xff0c;而将存储商品和客户…...

Maven入职学习

一、什么是Maven&#xff1f; 概念&#xff1a; Maven是一种框架。它可以用作依赖管理工具、构建工具。 它可以管理jar包的规模、jar包的来源、jar包之间的依赖关系。 它的用途就是管理规模庞大的jar包&#xff0c;脱离IDE环境执行构建操作。 具体使用&#xff1a; 工作机…...

【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…...

人大金仓数据库Docker部署

docker 搭建 yum -y install yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposystemctl start docker.servicesystemctl enable docker.servicesystemctl status docker.service 配置Docker cd /etc/docker/ vi da…...

Leetcode-每日一题【剑指 Offer 07. 重建二叉树】

题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7]Output: [3,9,20,null,null,15,7] 示例 2: Input: preo…...

Shell编程快速入门

Shell编程快速入门 脚本格式要求 脚本以#!/bin/bash开头脚本需要有可执行权限 脚本的常用执行方式 方式1&#xff1a;输入脚本的绝对路径或相对路径方式2&#xff1a;sh脚本 Shell的变量 Shell变量介绍 Linux Shell中的变量分为系统变量和用户自定义变量 系统变量&#…...

wpf 3d 坐标系和基本三角形复习

wpf 3d 坐标系的描述见此&#xff0c; WPF 3d坐标系和基本三角形_wpf 坐标系_bcbobo21cn的博客-CSDN博客 X轴正向向右&#xff0c;Y轴正向向上&#xff1b;Z轴&#xff0c;正向是从屏幕里边出来&#xff0c;负向是往屏幕里边去&#xff1b;坐标原点是在呈现区域的中心&#x…...

如何安全变更亚马逊收款账户?

有太多的卖家想知道如何安全变更亚马逊收款账户&#xff0c;因为更改了第三方收款账户可能会导致二次视频认证或者增强视频。真的是这样吗&#xff1f; 其实不推荐亚马逊店铺正常运营之后去变更信用卡&#xff0c;收款账户等重要资料的&#xff0c;因为玩黑科技的卖家也真的多…...

大数据面试题:Hadoop中的几个进程和作用

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;启动Hadoop&#xff0c;都会有什么进程 参考答案&#xff1a; 1&#xff09;NameNode&#xff1a;Master&#xf…...

题解:ABC276D - Divide by 2 or 3

题解&#xff1a;ABC276D - Divide by 2 or 3 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;入门。 思维难度&#xff1a;入门。 调码难度&#xff1a;入门。 综合评价&#xff1a;极简。 算法 数论。 思路 由大脑可知&#x…...

后台管理系统

1.1 项目概述 简易后台管理系统是一个基于Vue3ElemrntPlus的后台管理系统&#xff0c;提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能&#xff0c;旨在协助管理员对特定数据进行管理和操作。 没有后台对接&#xff0c;数据源为假数据。 全部代码已上传G…...

C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig与zag/左右双旋/3+4重构)

本文目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 06.代码注意插入算法删除算法完整代码&#xff1a…...

静态库和动态库

库文件 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接拿来用的变量、函数或类。 库是特殊的一种程序&#xff0c;编写库的程序和编写一般的程序区别不大&#xff0c;只是库不能单独运行。库文件有两种&a…...

用于Voronoi图构建的Fortune算法的C++实现

Voronoi图是一种在计算几何中广泛使用的数据结构&#xff0c;它可以用于解决最近邻搜索、路径规划等问题。在这篇文章中&#xff0c;我们将探讨一种用于构建Voronoi图的高效算法——Fortune算法&#xff0c;并提供其C实现。 一、Voronoi图简介 Voronoi图是由一组点在平面上生…...

笔记汇总 | 斯坦福 CS229 机器学习

文章目录 前言课程参考文章推荐阅读 前言 本文为斯坦福大学 CS229 机器学习课程学习笔记 本文主体部分转载自黄海广博士&#xff0c;文末已给出链接&#xff0c;大家有兴趣可以直接访问笔记首页&#xff0c;下载对应课程资料及作业代码 课程官网&#xff1a;CS229: Machine …...

git 版本管理工具 学习笔记

git 学习笔记 目录 一、git是什么 二、创建仓库 三、工作区域和文件状态 四、添加和提交文件 五、回退版本 &#xff08;了解&#xff09; 六、查看差异 七、删除文件 八、.gitignore文件&#xff08;了解&#xff09; 九、github ssh-key配置 十、本地仓库和远程仓库内…...

Bean基本注解开发和Bean依赖注入注解开发

目录 1.Bean基本注解开发 Component Scorelazy PostConstruct和PreDestroy RepositoryServiceController 2.Bean依赖注入注解开发 Value Autowired Qualifier Resource 扩展AutoWired 1.Bean基本注解开发 基本Bean注解&#xff0c;主要是使用注释的方式替代原有xml的…...

使用IIS服务器搭建一个网站

参考文章 使用IIS&#xff08;Internet Information Services&#xff09;服务器搭建一个网站相对来说是比较简单的。以下是基本的步骤&#xff1a; 安装IIS&#xff1a; 首先&#xff0c;确保你的操作系统已经安装了IIS。在大多数Windows版本中&#xff0c;IIS都是可选安装项…...

HCIP 三层交换机

一、实现VLAN间通信 在传统的交换机组网中&#xff0c;默认所有网络都处于同一个广播域&#xff0c;带来了许多问题&#xff0c;VLAN技术的提出&#xff0c;满足了二层组网隔离广播域需求&#xff0c;使得属于不同的VLAN间网络无法通信&#xff0c;但不同VLAN之间又存在着互相…...

利用python 进行数据分析(第三版)第二章小结

利用python 进行数据分析&#xff08;第三版&#xff09;第二章小结 由于是闲暇时间看的&#xff0c;且为读书笔记&#xff0c;所以只会写一些心得和容易混淆的知识&#xff0c;简单知识将不在重复 在变量或者函数后使用?可以查看详细信息。?还有最后一个用途&#xff0c;即…...

【ASP.NET MVC】使用动软(四)(12)

一、筛选器类和Cookie实现路由 需解决的问题&#xff1a; 网站登录往往需要用户名密码验证&#xff0c;为避免重复验证&#xff0c;一般采用Cookie 、Session等技术来保持用户的登录状态&#xff1a; Session是在服务端保存的一个数据结构&#xff0c;用来跟踪用户的状态&…...

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…...