【Python游戏】一个csdn小编用Python语言写了一个足球游戏,成功模拟世界杯决赛现场

news2024/11/18 15:28:35

前言

halo,包子们下午好
最近世界杯不是很火呀
很多小伙伴应该都知道球赛反正买,别墅靠大海!
今天就给大家实现一个类似世界杯的足球小游戏,咱就说真的堪比国足了!
哈哈哈~ 好啦
直接开整!!!

相关文件

关注小编,私信小编领取哟!
当然别忘了一件三连哟~~
公众号:Python日志

源码点击蓝色字体领取
Python零基础入门到精通视频合集

【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?

开发工具

Python版本:3.7.8
相关模块:
pygame模块;
random模块;
pyttsx3模块;
以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

游戏玩法

这是一个双人小游戏,分为红蓝两方。当然每队都有三个球员和一个守门员,每个玩家可以控制一个球员,其他三个是电脑控制。红方球员是通过“W”,“A”,“S”,“D”控制球员的移动,“T”踢球。蓝方球员是通过“↑”,“↓”,“←”,“→”控制球员的移动,“K”踢球。安空格键是开始游戏,下面是整个球场的效果图。
大概了解了游戏规则之后,我们就可以开始写这个游戏啦

开始界面

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

游戏界面

在这里插入图片描述

代码展示

导入模块

from __future__ import unicode_literals
import itertools, sys, time, random, math, pygame
from pygame.locals import *
from MyLibrary import *
from football import *
from IO import*

坐标

def bias(x, y):
    x = x + 16
    y = y + 24
    x_cent = 0
    y_cent = 0
    if (x >= 100 and x <= 700):
        x_cent = -1 * x + 100
    elif (x > 700):
        x_cent = -600
    else:
        x_cent = 0
    if (y >= 75 and y <= 525):
        y_cent = -1 * y + 75
    elif (y > 525):
        y_cent = -450
    else:
        y_cent = 0
    return x_cent, y_cent

玩家类

class MySprite(pygame.sprite.Sprite):
    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) #extend the base Sprite class
        self.master_image = None
        self.frame = 0
        self.old_frame = -1
        self.frame_width = 1
        self.frame_height = 1
        self.first_frame = 0
        self.last_frame = 0
        self.columns = 1
        self.last_time = 0
        self.direction = list([0,0])
        self.velocity = Point(0.0,0.0) 
        self.moving = False
        self.state = None
        self.tag = None
    #X property
    def _getx(self): return self.rect.x
    def _setx(self,value): self.rect.x = value
    X = property(_getx,_setx)

    #Y property
    def _gety(self): return self.rect.y
    def _sety(self,value): self.rect.y = value
    Y = property(_gety,_sety)

    #position property
    def _getpos(self): return self.rect.topleft
    def _setpos(self,pos): self.rect.topleft = pos
    position = property(_getpos,_setpos)
        

    def load(self, filename, width, height, columns):
        self.master_image = pygame.image.load(filename).convert_alpha()
        self.frame_width = width
        self.frame_height = height
        self.rect = Rect(0,0,width,height)
        self.columns = columns
        #try to auto-calculate total frames
        rect = self.master_image.get_rect()
        self.last_frame = (rect.width // width) * (rect.height // height) - 1

    def update(self, current_time, rate=30):
        #update animation frame number
        if current_time > self.last_time + rate:
            self.frame += 1
            if self.frame > self.last_frame:
                self.frame = self.first_frame
            self.last_time = current_time

        #build current frame only if it changed
        if self.frame != self.old_frame:
            frame_x = (self.frame % self.columns) * self.frame_width
            frame_y = (self.frame // self.columns) * self.frame_height
            rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
            self.image = self.master_image.subsurface(rect)
            self.old_frame = self.frame

    def __str__(self):
        return str(self.frame) + "," + str(self.first_frame) + \
               "," + str(self.last_frame) + "," + str(self.frame_width) + \
               "," + str(self.frame_height) + "," + str(self.columns) + \
               "," + str(self.rect)

机器人A

class robot(pygame.sprite.Sprite):
    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) #extend the base Sprite class
        self.master_image = None
        self.frame = 0
        self.goal  = None
        self.old_frame = -1
        self.ball = None
        self.leader = None
        self.frame_width = 1
        self.frame_height = 1
        self.goal_pos = None
        self.first_frame = 0
        self.last_frame = 0
        self.columns = 1
        self.last_time = 0
        self.direction = list([0,0])
        self.speed = 3
        self.moving = False
        self.state = "chase"
        self.tag = None
        self.other_group = None
    #X property
    def _getx(self): return self.rect.x
    def _setx(self,value): self.rect.x = value
    X = property(_getx,_setx)

    #Y property
    def _gety(self): return self.rect.y
    def _sety(self,value): self.rect.y = value
    Y = property(_gety,_sety)

    #position property
    def _getpos(self): return self.rect.topleft
    def _setpos(self,pos): self.rect.topleft = pos
    position = property(_getpos,_setpos)
        

    def load(self, filename, width, height, columns):
        self.master_image = pygame.image.load(filename).convert_alpha()
        self.frame_width = width
        self.frame_height = height
        self.rect = Rect(0,0,width,height)
        self.columns = columns
        #try to auto-calculate total frames
        rect = self.master_image.get_rect()
        self.last_frame = (rect.width // width) * (rect.height // height) - 1

    def update(self, current_time, rate=30):
        #update animation frame number
        # print("tag :"+str(self.tag))
        # print(self.direction)
        # print(self.speed)
        self.behavior()
        if self.state == "back":
            self.state ="chase"
        if self.direction == [0,0]:
            self.still()
            return
        self.which_frame()
        if current_time > self.last_time + rate:
            self.frame += 1
            if self.frame > self.last_frame:
                self.frame = self.first_frame
            self.last_time = current_time

        #build current frame only if it changed
        if self.frame != self.old_frame:
            frame_x = (self.frame % self.columns) * self.frame_width
            frame_y = (self.frame // self.columns) * self.frame_height
            rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
            self.image = self.master_image.subsurface(rect)
            self.old_frame = self.frame

    def __str__(self):
        return str(self.frame) + "," + str(self.first_frame) + \
               "," + str(self.last_frame) + "," + str(self.frame_width) + \
               "," + str(self.frame_height) + "," + str(self.columns) + \
               "," + str(self.rect)
    def still(self):
        self.frame= self.last_frame = self.first_frame 
    def chase(self):
        self.direction = [self.ball.Y - self.Y ,self.ball.X- self.X]
    def catch(self):
        t = self.detected()
        if t == 2:
            self.direction = [self.goal[1] -self.Y+random.randint(-10,10),self.goal[0]- self.X+random.randint(-10,10)]
            self.ball.kick_off()
            self.state = "chase"
        elif t == 1:
            self.direction = [self.leader.Y -self.Y+random.randint(-10,10),self.leader.X - self.X +random.randint(-10,10)]
            self.ball.kick_off()
            self.state = "chase"
        else:
            self.direction = [self.goal_pos[1] -self.Y,self.goal_pos[0]- self.X]
    #     if detected() == 1:
    #         kick_off()
    # def kick_off(self):
    #     if random.randint(1,10) < 5:
    #         self.direction = [self.leader.Y -self.Y,self.leader.X - self.X ]
    #     self.ball.kick_off(self)
    #     self.state = "chase"
    def distant(self,p):
        return ((self.X - p.X)**2 + (self.Y - p.Y)**2)**(1/2)
    def detected(self):
        if self.X < 400 and self.tag  == 2 and self.X > 100:
            return 2;
        if self.X > 780 and self.tag == 1 and self.X < 1100:
            return 2
        for x in self.other_group:
            if self.distant(x) < 100:
                return 1;
        return 3;
    def which_frame(self):
        which_column = dict_[tuple(self.direction)]
        self.first_frame = which_column * self.columns
        self.last_frame = self.first_frame + self.columns - 1
        if self.frame < self.first_frame:
            self.frame = self.first_frame
    def run(self):
        if self.direction == [0,0]:
            return
        if self.X >=0 and self.X < 70 and self.Y >=260 and self.Y <265:
            if self.direction[0] == 1:
                self.direction[0] = 0
            if self.ball.Y >400:
                self.direction[1] = 1;
        if self.X >= 70 and self.X < 75 and self.Y >=260 and self.Y <265:
            if self.direction == [1,-1]:
                if self.ball.Y > 400:
                    self.direction = [1,0]
                else:
                    self.direction = [0,-1]
        if self.X >70 and self.X <75 and self.Y >=265 and self.Y <492:
            if self.direction[1] == -1:
                self.direction[1] =0
        if self.X >= 70 and self.X < 75 and self.Y >=492 and self.Y <497:
            if self.direction == [-1,-1]:
                if self.ball.Y > 400:
                    self.direction = [0,-1]
                else: self.direction = [-1,0]
        if self.X >=0  and self.X < 70 and self.Y >=492 and self.Y <497:
            if self.direction[0] == -1:
                self.direction[0] = 0
                if self.ball.Y<400:
                    self.direction[1] = 1;
        


        if self.X >=1080 and self.X <= 1200 and self.Y >=260 and self.Y <265:
            if self.direction[0] == 1:
                self.direction[0] = 0
            if self.ball.Y >400:
                self.direction[1] = -1;
        if self.X > 1075 and self.X <= 1080 and self.Y >=260 and self.Y <265:
            if self.direction == [1,1]:
                if self.ball.Y > 400:
                    self.direction = [1,0]
                else:
                    self.direction = [0,1]
        if self.X > 1075 and self.X <= 1080 and self.Y >=265 and self.Y <  498:
            if self.direction[1] == 1:
                self.direction[1] =0
        if self.X > 1075 and self.X<= 1080 and self.Y >=498 and self.Y <502:
            if self.direction == [-1,1]:
                if self.ball.Y > 400:
                    self.direction = [0,1]
                else: self.direction = [-1,0]
        if self.X >=1080 and self.X <= 1200 and self.Y >=498 and self.Y <502:
            if self.direction[0] == -1:
                self.direction[0] = 0
                if self.ball.Y<400:
                    self.direction[1] = -1;
        self.Y += self.direction[0]*self.speed
        self.X += self.direction[1]*self.speed
        # print(str(self.X)+"   "+str(self.Y))
    def back(self):
        self.direction = [0,600 - self.X]
    def behavior(self):
        if self.state =="back":
            self.back()
        elif self.state == "chase":
            self.chase()
        elif self.state == "catch":
            self.catch()
        if self.direction[0]>0:
            self.direction[0]=1
        elif self.direction[0]<0:
            self.direction[0] = -1
        if self.direction[1]>0:
            self.direction[1] =1
        elif self.direction[1]<0:
            self.direction[1] =-1
        # print(self.tag)
        # print(self.direction)
        self.ch_sp()
        self.run()
    def ch_sp(self):
        if self.tag == 1:
            if self.X <600:
                self.speed = 2
            else:self.speed = 1
        else:
            if self.X > 600:
                self.speed = 2
            else :
                self.speed =1

机器人B

class robot_B(robot):
    def __init__(self):
        robot.__init__(self)
        self.wonder = None
        self.speed =1
    def wondering(self):
        if self.X > self.wonder+1 or self.X <self.wonder -1 :
            self.direction = [560-self.Y,self.wonder- self.X]
        elif self.Y <280:
            self.direction = [560-self.Y,0]
        elif self.Y > 550:
            self.direction = [270-self.Y,0]
    def behavior(self):
        if self.state =="back":
            self.back()
        elif (self.ball.X > 600 and self.tag == 1) or (self.ball.X < 600 and self.tag == 2):
            self.wondering()
        else:
            if self.state == "chase":
                self.chase()
            elif self.state == "catch":
                self.catch()
        if self.direction[0]>0:
            self.direction[0]=1
        elif self.direction[0]<0:
            self.direction[0] = -1
        if self.direction[1]>0:
            self.direction[1] =1
        elif self.direction[1]<0:
            self.direction[1] =-1
        self.run()
    def catch(self):
        if random.randint(1,10)<5:
            self.direction = [self.goal[1] -self.Y,self.goal[0]- self.X]
            self.ball.kick_off()
            self.state = "chase"
        else:
            self.direction = [self.leader.Y -self.Y,self.leader.X - self.X ]
            self.ball.kick_off()
            self.state = "chase"

球类

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, time, random, math, pygame
from pygame.locals import *
from math import pow
class ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image_list = []
        self.image = None
        self.frame = 0
        self.old_frame = 0
        self.first_frame = 0
        self.last_frame = 2
        self.direction = list([0,0])
        self.speed = 0;
        self.fetch = False;
        self.f = 1.7
        self.last_time = 0;
        self.player = None
        self.cal = 0
    def _getx(self): return self.rect.x
    def _setx(self,value):self.rect.x = value
    X = property(_getx,_setx)

    #Y property
    def _gety(self):return self.rect.y
    def _sety(self,value):self.rect.y = value
    Y = property(_gety,_sety)

    #position property
    def _getpos(self): return self.rect.topleft
    def _setpos(self,pos): self.rect.topleft = pos
    position = property(_getpos,_setpos)
    def load(self):
        filename = 'ball1.png','ball2.png','ball3.png'
        for x in filename:
        	ball = pygame.image.load(x).convert_alpha()
        	self.image_list.append(ball)
        self.frame = 0;
        self.old_frame = 2;
        self.image = self.image_list[0];
        self.frame_height = self.image_list[0].get_rect().height
        self.frame_width = self.image_list[0].get_rect().width
        self.rect = Rect(0,0,self.frame_width,self.frame_height);
    def update(self,current_time,rate =30):
        if self.fetch and self.player.moving:
            self.speed = (self.player.velocity.x **2 + self.player.velocity.y **2)**(1/2)
        if self.speed == 0 or (self.fetch and self.player.moving == False):
            return
        if current_time > self.last_time + (4-self.speed//4)*20:
        	self.frame += 1
        	self.frame %= 3
        	self.last_time = current_time
        if self.frame != self.old_frame:
        	self.image = self.image_list[self.frame]
        	self.old_frame = self.frame
        # print(self.frame)
    def run(self):
        self.speed -= self.f*0.05;
        self.speed = max(0,self.speed)
        if(self.direction==[0,0]):return;
        # print(self.direction)
        # print(self.speed)
        self.X += ((self.direction[0]*self.speed)/pow((self.direction[1]**2 + self.direction[0]**2),(1/2)))
        self.Y += ((self.direction[1]*self.speed)/pow((self.direction[0]**2 + self.direction[1]**2),(1/2)))
    def fetched(self,player_):
        self.fetch = True;
        if player_ != None:
            self.player = player_
        player = self.player
        if(player.direction[1] >0):
        	self.X = self.player.X + self.player.frame_width*3/4
        else :
        	self.X = self.player.X - self.player.frame_width/3
        self.Y = self.player.Y + self.player.frame_height -self.frame_height;
    def kick_off(self):
        self.speed = 12
        self.direction[0] = self.player.direction[1]
        self.direction[1]  =self.player.direction[0]
        self.player = None
        self.fetch =False
        self.cal = 0
    def check_bound(self,width,height):
        temp = self.X,self.Y
        if self.X < 0:
            self.X =0
            self.direction[0] = abs(self.direction[0])
        if self.Y < 0:
            self.Y = 0
            self.direction[1] = abs(self.direction[1])
        if self.X >width-34:
            self.X= width-34
            self.direction[0] = -1*abs(self.direction[0])
        if self.Y > height-14:
            self.Y = height-14;
            self.direction[1] = -1*abs(self.direction[1])
        if self.X >=0 and self.X <72 and self.Y >300 - 17 and self.Y <315 - 17:
            self.Y = 300-17
            self.direction[1] = -1*abs(self.direction[1])
        if self.X >1110 and self.X <1200 and self.Y >300 - 17 and self.Y <315 - 17:
            self.Y = 300-17
            self.direction[1] = -1*abs(self.direction[1])
        if self.X >=0 and self.X <72 and self.Y >495 and self.Y <510:
            self.Y = 510 
            self.direction[1] = -1*abs(self.direction[1])
        if self.X >1110 and self.X <1200 and self.Y >495 and self.Y <510:
            self.Y = 510
            self.direction[1] = -1*abs(self.direction[1])
        if((self.X,self.Y) != temp):
            # print(str(self.X)+" "+str(self.Y))
            # print(temp)
            self.speed *= 0.8

总结

部分代码展示在上面了,因为源码太多就不一一给大家展示了
在这里插入图片描述
源码领取看相关文件哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「以代码作画」从数据角度剖析Art Blocks生成艺术

作者&#xff1a;Mia Bao, co-founder of thepass.to, chief partner of WHALE members 数据&#xff1a;Jin, data analyst of thepass.to 出品&#xff1a;ThePASS & BeepCrypto 文章数据&#xff1a;https://docs.google.com/spreadsheets/d/1zDun4eUTwA-BMU5Hl2c5EC…

基于SSM网上商城购物系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

目标检测算法——人体姿态估计数据集汇总 2(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批人体姿态估计数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 目录 一、V-COCO数据集 二、宜家 ASM 数据集 三、…

如何解决在加载、保存或覆盖项目文件时 Lumion 可能无法打开或显示错误的问题?

为什么在加载、保存或覆盖项目文件时 Lumion 可能无法打开或显示错误&#xff1f;那么这个问题大家跟着赞奇云工作站一起来解答吧。 1. 这就是为什么 如果Lumion在加载 .LS Project文件时崩溃或显示错误 &#xff0c;通常意味着 .LS Project 文件因保存错误而损坏。遗憾的是&…

电脑技巧:分享6个实用的资源网站

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

一框式检索和高级检索

0. 学习内容 2022年12月8日15:38:07CNKI学习 学会多种检索方式检索基础文献 1. 一框式检索 1.1 简单使用 左侧选择检索字段 根据需求选择 输入想要的检索词输入想要的检索范围 顾名思义&#xff1a;在检索的时候只有一个搜索框&#xff0c;从而实现对文献进行检索 2. 高级检索…

「MacOS」在MacOS中添加环境变量

背景 最近在学习cmake使用&#xff0c;官网有dmg的安装教程&#xff0c;直接下载dmg文件然后拖拽到Application文件里就好。但在终端中执行cmake命令却显示没有cmake命令。下面内容以cmake为例&#xff0c;介绍如何在环境变量中添加命令行命令&#xff0c;其他命令也是如此。 …

m分别使用Dijkstra算法和Astar算法进行刚体机器人最短路径搜索和避障算法的matlab仿真,带GUI界面

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 Dijkstra&#xff08;迪杰斯特拉&#xff09;算法是典型的最短路径路由算法&#xff0c;用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展&#xff0c;直到扩展…

图片加贴纸怎么添加?快来使用这些实用的添加方法

有时候我们需要发送一些图片给对方&#xff0c;可是图片上有自己的隐私&#xff0c;而且这些信息都显示在图片中间&#xff0c;那我们应该怎么处理这部分信息呢&#xff1f;可能有些小伙伴会使用马赛克来模糊这部分信息&#xff0c;但是马赛克不但影响图片美观&#xff0c;处理…

乐园管理系统| 乐园小程序 | 数字化门店会员管理

商场乐园总是不缺小孩子们的嬉闹&#xff0c;旁边也不缺拥挤的家长&#xff0c;不同于以前&#xff0c;现在的年轻家长&#xff0c;由于市场服务/产品多样化及思想进步&#xff0c;对自己孩子的衣食住行玩等方面非常上心&#xff0c;小孩子的天性使然&#xff0c;乐园行业在近些…

pca降维

两个矩阵相乘的意义是将右边矩阵中的每一列向量 ai 变换到左边矩阵中以每一行行向量为基所表示的空间中去 选择不同的基可以对同样一组数据给出不同的表示&#xff0c;如果基的数量少于向量本身的维数&#xff0c;则可以达到降维的效果。 将一组 N 维向量降为 K 维&#xff0…

SpringCloud-Ribbon负载均衡

关于Ribbon负载均衡 1.什么是Ribbon Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将 Netflix的中间层服务连接在一起。…

智慧工地管理系统解决方案厂商-喜讯科技

智慧工地是建筑行业管理结合互联网的一种新的管理系统&#xff0c;应用最新的大数据、云计算和物联网的技术&#xff0c;对施工现场的人、机、料、法、环等资源进行集中管理&#xff0c;以可控化、数据化以及可视化的智能系统对项目管理进行全方位立体化的实时监管。 喜讯科技智…

elasticsearch8.5体验(docker部署)

服务部署 拉取elasticsearch镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.5.0拉取kibana镜像 docker pull docker.elastic.co/kibana/kibana:8.5.0创建docker网络 docker network create elastic启动elasticsearch docker run --name es01 --net el…

使用固定的公网TCP端口地址远程桌面【内网穿透】

文章目录1. 为远程桌面保留一个TCP地址2. 配置远程桌面隧道2.1 登录cpolar web ui2.2 修改远程桌面隧道信息2.3 查看公网地址3. 使用固定TCP地址远程桌面总结在上一篇文章中&#xff0c;我们通过cpolar映射远程桌面3389端口&#xff0c;成功实现了在外远程桌面控制家里/公司的W…

万字干货|Synchronized关键字详解

文章目录前言线程安全什么是synchronized关键字&#xff1f;synchronized实现方式1.修饰实例方法2.修饰静态方法3.修饰代码块synchronized关键字底层原理synchronized修饰实例方法monitor锁是什么&#xff1f;Java对象内存布局synchronized修饰代码块锁优化自旋锁锁粗化锁消除锁…

服务器硬件规格常用查看命令——通用命令

1. lshw 使用lshw命令可以查看服务器硬件配置的详细信息。使用它可以在支持DMI的x86或IA-64系统以及某些PowerPC机器上打印内存配置、固件版本、主板配置、CPU版本、G4可以工作&#xff09;。目前该命令支持 CPU频率、缓存、总线速度等信息&#xff08;已知PowerMac DMI&#…

[附源码]JAVA毕业设计同德佳苑物业信息(系统+LW)

[附源码]JAVA毕业设计同德佳苑物业信息&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Java正则表达式

Java正则表达式正则表达式概述、初体验正则表达式的匹配规则正则表达式的常见案例正则表达式在方法中的应用正则表达式爬取信息正则表达式概述、初体验 正则表示&#xff1a; 正则表达式可以用一些规定的字符来制定规则&#xff0c;并用来校验数据格式的合法性。 正则表达式初…

为远程群辉NAS配置固定二级子域名【内网穿透】

由于使用免费的cpolar内网穿透&#xff0c;所生成的公网地址为随机临时的公网地址&#xff0c;24小时内会发生变化。对于需要长期访问的用户来讲&#xff0c;我们可以为其配置固定的二级子域名&#xff0c;同时提高带宽&#xff0c;实现更为高效流畅的访问。 配置固定的二级子…