【Python自动化】PyAutoGUI在游戏测试中的应用

python游戏自动化实战--游戏辅助软件冰山后的秘密 文章目录前言python游戏辅助制作常用方法总结 前言 本文记一次用python制作win10游戏辅助制作的实践,总结一些制作辅助常用的手段。为啥做辅助去了?这要从周末打游戏的时候说起。终于升级到90级了,可以去“考古”了,然而考古的过程枯燥无味,基本上就是重复以下过程: 找到相关npc 接取任务,放弃任务,直到找到红树林地点的任务 传送到红树林,根据任务中坐标找到地图中的相关坐标 打怪,掉落宝物 重新进入1步骤 可以看到,考古的过程的固定的模式。受到工作中自动化测试的启发,为什么不能将这一过程自动化呢 阅读详情

一、前言

在日常游戏的强化学习稳定性测试自动跑测中,发现了一些机器在长时间挂机后的崩溃现象,导致游戏进程退回桌面,或在匹配界面挂机。此时可以借助PyAutoGUI库实现自动点击开始游戏并重新匹配。

二、准备所需库

实现自动点击重开,需要监控游戏进程,需要psutil及subprocess库;实现图像自动化,需要pyautogui库;获取设备基本硬件信息,需要GPUtil、cpuinfo及socket库。如还需图像自动化的扩展性,还需用到opencv-python(即cv2)。

三、准备脚本

这里思路为,监控游戏开启时的PID,如PID为空,则重新启动游戏;其中的fight.png、start_lobby.png、start_match.png、windows.png均为预先截图,存放在脚本目录中。

这里我的全屏检测思路为检测windows10开始按钮,如存在,则判断为非全屏状态,反之则是。

这里需要注意的是,推荐使用win32库收集电脑硬件信息,其他第三方库使用可能会造成打包后的exe文件运行卡住导致后续消息信息无法发送。

import pyautogui
import subprocess
import time
import psutil
import requests
import win32com.client
import socket
import json
from py3nvml.py3nvml import *

# 任务栏游戏图标检测
def game_icon_check():
    try:
        pyautogui.locateCenterOnScreen('images\game_icon.png', confidence = 0.8)
    except Exception:
        return False
    return True

# windows开始图标检测
def is_win_icon_exsist():
    try:
        pyautogui.locateCenterOnScreen('images\win_check.png', confidence = 0.8)
    except Exception:
        return False
    return True

# 以每次游戏进程启动的PID作为检测进程是否存在的条件
def is_process_running(pid):
    return psutil.pid_exists(pid)

# 通过pid来kill后台进程
def kill_process_by_pid(process_name):
    for proc in psutil.process_iter(['pid']):
        if proc.info['pid'] == pid:
            try:
                proc.kill()
                time.sleep(1)
                print(f'此进程{process_name}-{proc.info["pid"]}已关闭。')
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                print(f'此进程{process_name}-{proc.info["pid"]}不存在。')

# 全屏使用windows开始图标和游戏任务栏图标检查(进入大厅也放在这一步)
def fullscreen_check():
    try:
        loc1 = pyautogui.locateCenterOnScreen('images\win_check.png')
        loc2 = pyautogui.locateCenterOnScreen('images\game_icon.png')
        if (loc1 is not None) and (loc2 is not None):
            print('游戏不为全屏,切换为全屏......')
            pyautogui.hotkey('alt', 'enter')  
        time.sleep(3)
    except Exception:
        print('游戏为全屏')
        time.sleep(3)      

    while True:
        try:
            loc = pyautogui.locateCenterOnScreen('images\start_lobby.png', confidence = 0.8) 
            pyautogui.click(loc, clicks = 1, interval = 0.5, duration = 1)
            if loc is not None:
                break
        except Exception:
            print('大厅连接中,请稍后......')
            time.sleep(5)

def click_to_start():
    while True:
        # 如有断线重连提示,点击确认重新加入
        try:
            # 设置建议进入大厅时间等待可以久一点
            time.sleep(10)
            loc1 = pyautogui.locateCenterOnScreen('images\\reconnet.png', confidence = 0.8)
            if loc1 is not None:
                loc2 = pyautogui.locateCenterOnScreen('images\confirm_button.png', confidence = 0.6)
                pyautogui.click(loc2, clicks = 1, interval = 0.5, duration = 1)
                break
        except Exception:
            print('无需重连') 

        try:
            for step in steps:
                loc3 = pyautogui.locateCenterOnScreen(step, confidence = 0.8) 
                print(f'点击【{step}】')
                if loc3 is not None:
                    time.sleep(1)
                    pyautogui.click(loc3, clicks = 1, interval = 0.5, duration = 1)
        except Exception:
            print('未找到按钮,请检查主屏幕显示!')
        break
    print('进入对局中......')

def start_process(process_name):
    global pid
    global cnt
    
    proc = subprocess.Popen(process_name, cwd = 'C:\\Windows\\System32') 
    pid = proc.pid
    print(f'游戏开启,版本为【{this_time_version}服】-【{process_name}】-【{pid}】')
    time.sleep(10)
    cnt += 1

def notice():
    global CPU
    global GPU
    global IP

    try:
        # CPU信息
        for cpu in wmi.InstancesOf("Win32_Processor"):  
            CPU = cpu.Name

        # 显卡信息
        for gpu in wmi.InstancesOf("Win32_VideoController"):
            GPU = gpu.Name

        # 内存信息
        for mem in wmi.InstancesOf("Win32_PhysicalMemory"):
            RAM = f'{int(mem.Capacity) / 1024**3:.0f}'

        # 内网IP地址
        IP = socket.gethostbyname(socket.gethostname())

        headers = {"Content-Type": "application/json; charset = utf-8"}
        message = {
            "msgtype": "markdown",
            "markdown": {
                "content": f"<font color=\"warning\">【稳定性测试中此机型游戏进程因崩溃或其他原因退出多次,请相关同学注意!】</font>\n"
                            f"> <font color=\"info\">CPU:{CPU}</font>\n"
                            f"> <font color=\"info\">显卡:{GPU}</font>\n"
                            f"> <font color=\"info\">内存:{RAM}GB</font>\n"
                            f"> <font color=\"info\">内网IP地址:{IP}</font>\n"
                            f"> <font color=\"info\">版本:{this_time_version}</font>\n"
                            f"> <font color=\"info\">Crash-Report:[点击查看]({crash_report_url})</font>\n"
            }
        }
        requests.post(notice_url, headers = headers, json = message)
    except Exception:
        print('硬件信息收集失败!')

# 上传客户端崩溃日志
def upload_log():
    # 进入客户端日志目录将最近崩溃日志拷贝至公盘61.175的崩溃日志汇总内
    command = f'New-Item -path {pub_crash_dir}\{CPU}-{GPU}-{IP} -itemtype directory -force; cd {log_dir}; Get-ChildItem -Path .\*.log | Sort-Object LastWritetime -Descending | Select-Object -First {restart_time} | Copy-Item -Destination {pub_crash_dir}\{CPU}-{GPU}'
    subprocess.run(['powershell', '-Command', command], capture_output=True, text=True)

# 未知启动问题,暂时先通过拷贝指定dll文件到游戏目录下解决
def copy_dll():
    command = f'Copy-Item -Path .\\images\\msvcp140_2.dll, .\\images\\vcruntime140_1.dll -Destination {install_dir}\\ -Force'
    subprocess.run(['powershell', '-Command', command], capture_output=True, text=True)    

if __name__ == '__main__':
    wmi = win32com.client.GetObject("winmgmts:")
    notice_url= '******************************'
    crash_report_url = '***********************'
    dgs_dir = r'*************\*********\******.json'
    steps = ['images\\fight.png', 'images\\start_match.png']
    pub_crash_dir = '*************'
    cnt = 0

    # 初始化参数
    with open('config.json', 'r', encoding = 'utf-8') as t:
        this_time = json.load(t)    
        this_time_version = this_time.get('Version')
        restart_time = int(this_time.get('RT'))
        wait_time = int(this_time.get('WT'))
        params = this_time.get('Params')

    # 读取对应DGS目录json文件以获取游戏安装目录并启动
    with open(dgs_dir, 'r', encoding = 'utf-8') as f:
        configs = json.load(f)
    for config in configs:
        if config['GameVersionName'] == this_time_version:
            install_dir = config['InstallDirectory']
            break

    process_name = f'{install_dir}\*****.exe'
    log_dir = f'{install_dir}'

    copy_dll()

    while True:
        # 首次开始游戏
        if cnt == 0:
            start_process(process_name)
            fullscreen_check()
            click_to_start()

        # 进程未运行且能检测到windows图标,判断为游戏进程结束
        if (not is_process_running(pid)) and is_win_icon_exsist():
            print('游戏意外退出,进程重启中......当前时间:', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
            if cnt == restart_time:
                print(f'严重问题!取消重启!崩溃次数:【{cnt}次】 当前时间:', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
                kill_process_by_pid(process_name)
                notice()
                upload_log()
                break
            start_process(process_name)
            fullscreen_check()
            click_to_start()
        # 退到桌面可以检测到windows图标但进程仍然存在,仍判断为游戏进程结束
        elif is_process_running(pid) and is_win_icon_exsist() and not game_icon_check():
            # 等待尽可能长让进程自行销毁
            time.sleep(30)
            print('游戏意外退出,进程重启中......当前时间:', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
            if cnt == restart_time:
                print(f'严重问题!取消重启!崩溃次数:【{cnt}次】 当前时间:', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
                kill_process_by_pid(process_name)
                notice()
                upload_log()
                break
            kill_process_by_pid(process_name)
            time.sleep(1) 
            start_process(process_name)
            fullscreen_check()
            click_to_start()

        # 检测游戏对局是否结束,如结束重新点击进行匹配
        try:
            loc1 = pyautogui.locateCenterOnScreen('images\\fight.png', confidence = 0.8)
            # 检测正常对局结束退到大厅后短暂等待10s
            time.sleep(10)
            pyautogui.click(loc1, clicks = 1, interval = 0.5, duration = 1)
            time.sleep(3)
            loc2 = pyautogui.locateCenterOnScreen('images\start_match.png', confidence = 0.8)
            pyautogui.click(loc2, clicks = 1, interval = 0.5, duration = 1)
            print('重新开始匹配......')
        except Exception:
            print('游戏对局进行中......')

        # 进程循环检测
        time.sleep(wait_time) 

四、使用Pyinstaller打包并发布

pyinstaller --onefile .\auto_restart.py

PS:可以编写一个Bat脚本去执行exe文件,在exe文件退出后,保持命令窗口可见,方便后续收集相关打印信息。(Bat脚本应与exe文件在同一目录下)

@echo off
path = .\;
auto_restart.exe
pause

【Game Of AutoTest】2、游戏自动化测试的技术选型 要做游戏自动化测试,首先需要了解游戏自动化技术。因此,本文详细讲解下游戏自动化测试领域可能用到的一些技术以及对应的场景,为自动化测试落地的技术选型提供参考。 阅读详情

相关推荐

【Python-游戏测试工程师 】8个高实用性的 Python 游戏测试框架

Python游戏测试框架精选:8款工具覆盖自动化、性能、兼容性测试需求。PyAutoGUI适合键鼠模拟操作,Pywinauto提供精准Windows窗口控制;OpenCV和SikuliX处理图像识别测试;Psutil监控游戏资源占用,Py-Spy分析性能瓶颈;Requests用于服务端接口测试。每款框架均提供核心功能说明、适用场景和代码示例,帮助快速搭建专业游戏测试体系,满足不同维度的测试需求。

u013625540的博客 1825

【极客日常】游戏测试开发干货——Python进阶与游戏自动化测试攻略

在互联网上,关于游戏测试(开发)领域的技术分享,实际是非常稀少。为此,针对游戏测试(开发)的工作特性,笔者根据自己以前的博客整合了两个文集:《HiKari为了拿捏Python整理的技术笔记》与《HiKari的游戏自动化测试笔记》

HiKariのTechLab 2660

利用pyautogui实现自动化屏幕识图与精准点击

本文详细介绍了如何利用pyautogui库实现自动化屏幕识图与精准点击。通过核心函数locateCenterOnScreen,程序能模拟人类视觉,自动寻找屏幕上的特定图标并执行点击操作。文章从环境搭建、核心原理、实战脚本编写到进阶调优,提供了完整的指南,帮助游戏玩家、办公人员和测试人员高效处理重复性图形界面任务,并强调了参数调试与异常处理的关键技巧。

y7z8a9的博客 1211

制作自动化游戏脚本:使用Python实现游戏自动化控制

在游戏世界中,自动化脚本可以帮助玩家执行重复性任务,从而节省大量时间和精力。Python作为一种强大且易于学习的编程语言,非常适合用于编写这些自动化脚本。本文将详细介绍如何使用Python制作一个基本的游戏自动化脚本,从环境准备到脚本编写,每一步都清晰明了。

2301_78150559的博客 2万+

8个Python游戏测试框架深度解析与选型实践

游戏测试作为自动化测试中复杂度最高的场景之一,涉及功能、表现、数值、稳定性、性能与兼容性等多维度验证。Python凭借其生态优势,成为游戏测试工程师最常用的语言,而pytest、unittest、Airtest、Poco、pyautogui、behave、Hypothesis、Locust等工具则分别覆盖逻辑测试、UI自动化、控件识别、键鼠模拟、BDD用例、属性测试与性能压测等不同层级。理解各框架的原理与适用边界,才能避免“单打独斗”的误区。例如Airtest解决跨平台游戏UI黑盒操作,Poco通过控件树提

weixin_28842367的博客 119

Python实现游戏按键监听与模拟:操控游戏的新维度

PyUserInput是一个用于跨平台(Windows, Linux, macOS)的Python库,它允许程序监听和模拟用户输入,包括键盘和鼠标事件。虽然这个库目前维护较少,但它为理解底层原理提供了很好的基础。Python在游戏按键监听与模拟方面的应用,不仅简化了自动化测试的过程,也为游戏辅助工具的开发提供了便利。虽然存在兼容性、稳定性等挑战,但通过合理的策略选择和优化,可以有效克服这些难题。

master_chenchen的博客 1391

PyDirectInput终极指南:如何在DirectX游戏中实现完美自动化

如果你曾经尝试使用Python自动化工具来控制视频游戏或DirectX应用程序,可能会遇到一个令人沮丧的问题:鼠标和键盘输入完全不起作用!😫 这正是PyDirectInput要解决的痛点——它为Windows上的DirectX应用提供了真正的鼠标和键盘输入自动化解决方案。 ## 为什么传统自动化工具在游戏中失效? 大多数Python自动化库(如PyAutoGUI)使用的是传统的Virtual

gitblog_00014的博客 443

从游戏脚本到合法自动化:Python图像识别与模拟输入技术解析

自动化技术通过模拟人类操作实现任务执行,其核心原理基于环境感知与指令执行两大模块。在技术实现层面,图像识别作为环境感知的关键手段,能够通过模板匹配、特征检测等方法解析屏幕信息;而模拟输入则通过系统API生成鼠标键盘事件,完成操作闭环。这项技术的工程价值在于提升软件测试效率、实现流程自动化,广泛应用于GUI测试、RPA开发等领域。以游戏脚本为例,其背后正是图像识别与模拟输入的典型应用,但需严格区分合法学习与作弊行为的边界。本文聚焦于使用Python的OpenCV和PyAutoGUI库,构建一个合法的桌面自动化

weixin_34355559的博客 389

游戏测试必知:8个Python测试框架的实战组合

游戏测试与普通软件测试截然不同,UI频繁变动、状态机复杂、随机数值多,且性能问题常驻。传统测试工具难以应对这些场景,而Python生态提供了灵活的解决方案。从用例组织到客户端自动化,再到服务端压测,pytest凭借强大的fixture机制管理多环境用例,Hypothesis通过属性测试自动生成海量边界数据校验数值公式;Airtest与Poco互补,以图像识别和控件树定位解决游戏UI自动化难题;PyAutoGUI兜底桌面端,Appium覆盖真机分发,Selenium处理H5活动页,Locust以协程模拟真实玩

weixin_28839629的博客 164

【Python】自动化神器PyAutoGUI —告别手动操作,一键模拟鼠标键盘,玩转微信及各种软件自动化

PyAutoGUI 是一个 Python 库,主要用于 GUI(图形用户界面)自动化。它允许你通过编程方式控制鼠标和键盘,模拟人类操作,如移动鼠标、点击鼠标按钮、滚动鼠标滚轮、键入键盘按键等。这使得 PyAutoGUI 成为自动化重复性 GUI 任务的强大工具,比如自动化测试、批量处理文件、游戏脚本编写等场景。

墩墩分墩 5697

基于PyAutoGUI和OpenCV的桌面自动化Python源码

项目概述:本项目是一款基于Python语言的桌面自动化工具,结合了PyAutoGUI和OpenCV库,共包含26个文件。其中,Python源代码文件(.py)有9个,配置文件(.xml)6个,数据表格(.xls)3个,版本控制忽略文件(.gitignore)2个,日志文件(.log)2个,以及其他类型的文件,包括项目模块文件(.iml)、Markdown文档(.MD)、图像文件(.png)和文本文件(.txt)。该程序旨在通过自动化脚本简化桌面操作流程,提高工作效率。

PyDirectInput终极指南:5步解决游戏自动化输入难题的完整方案

还在为Python自动化脚本在游戏中失效而烦恼吗?PyDirectInput正是你需要的解决方案!这个专为Windows平台设计的Python库,通过DirectInput扫描码技术,完美解决了PyAutoGUI在游戏和DirectX应用中无法正常工作的痛点。无论你是游戏开发者、自动化测试工程师,还是需要精确输入控制的用户,PyDirectInput都能提供稳定可靠的鼠标键盘输入自动化功能。 #

gitblog_00549的博客 719

学习STM32的无人机控制

下面是一个基于STM32的无人机控制的简单示例代码,包括四旋翼的PID控制、遥控器信号解析和电机控制。本示例以STM32F103系列为例,使用Keil C编译器进行开发。

qq_67153941的博客 702

Python自动化测试高手进阶(PyAutoGUI游戏测试全攻略)

掌握游戏自动化测试PyAutoGUI,高效解决重复操作与兼容性验证难题。适用于PC客户端游戏、模拟器等场景,基于图像识别与鼠标键盘控制实现精准自动化。支持跨平台运行,无需源码即可快速部署测试脚本,大幅提升测试效率。游戏测试新思路,值得收藏。

CodeNexus的博客 696

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 986

程序自动化填写网页表单数据

如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。

Y 2415

8个高实用性的 Python 游戏测试框架

框架类型适合pytest单元测试游戏逻辑unittest单元测试基础测试自动化测试QABehaveBDD测试功能测试Locust性能测试服务器压力Airtest游戏自动化手游PyAutoGUIGUI自动化简单操作SeleniumWeb自动化Web游戏。

likuolei的博客 317

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1081

【PyAutoGUI游戏自动化测试实战】:从零搭建高效自动化测试框架

掌握游戏自动化测试PyAutoGUI实战技巧,从零搭建高效测试框架,适用于PC端游戏功能验证与回归测试。通过图像识别与鼠标键盘模拟实现精准操作,提升测试效率。方法简单易上手,值得收藏。

Algorhythm的博客 1244

成本150元的高性能RDP协议瘦客户机

云终端市场是一个跨度很大的市场。既有数千元的品牌的瘦客户机,也有几百元的瘦客户机,还有200-300元的支持RDP协议的多用户云终端。但是200-300元的多用户终端,在显示性能上不尽人意,一般用于地产中介门店,工厂产线的电子看板等场合。有没有性能更好,价格更低的方案呢? 答案是有。 这个方案就是 二手的x86 瘦客户机 + DoraOS瘦客户机系统免费版(仅支持RDP)。 首先我们看硬件,在某宝搜索 升腾C92 ,找到最低配置的( CPU:J1800,内存:2G,硬盘:8G)。价格都在150以内。

云飞扬的桌面云 7400

PX4从放弃到精通(二十二):日志

文章目录前言一、下载日志二、ulog转CSV三、利用flightplot软件分析PX4的ulog日志1 windos安装2 ubuntu18.04安装四、使用PlotJuggler分析PX4日志五、设置日志记录条件六、添加自定义日志消息 前言 PX4 1.10以上固件 QGC 一、下载日志 将飞控链接地面站,在下图页面点击“刷新”,即可看到保存的日志(前提是要有TF卡) 选择需要下载的日志,点击右侧的“下载”,然后选择目录即可进行下载,如果想擦除所有的日志,可以点击右侧的“擦除全部” 二、ulog转CS

超维空间科技的博客 6768

为什么顶尖游戏公司都在用PyAutoGUI做回归测试?真相曝光

掌握游戏自动化测试PyAutoGUI,高效解决回归测试耗时难题。适用于UI检测、多场景自动执行,结合图像识别精准定位元素,大幅提升测试效率与稳定性。跨平台易集成,值得收藏,点击了解实战技巧。

PoliSeed的博客 754

车载以太网-组播

车载以太网-组播

天赐好车的博客 247

【Python自动化】PyAutoGUI构建游戏稳定性测试守护脚本

本文详细介绍了如何使用PyAutoGUI构建Python自动化脚本进行游戏稳定性测试。通过模拟鼠标键盘操作、图像识别和进程监控,实现7×24小时无人值守测试环境,有效捕捉内存泄漏等罕见问题。文章包含环境搭建、关键技术选型、脚本架构设计及实战避坑指南,帮助开发者提升游戏测试效率。

weixin_30279315的博客 426

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6747

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python AI自动编程:从基础自动化到脚本生成的技术实践

AI自动编程是基于大语言模型的代码生成技术,通过学习海量代码库掌握编程语法和逻辑规则。其核心原理是利用深度学习模型理解自然语言需求并转化为可执行代码,在提升开发效率方面具有重要价值。该技术广泛应用于办公自动化、软件测试、业务流程优化等合法场景。在实际工程实践中,Python凭借丰富的库生态成为AI自动编程的首选语言,结合PyAutoGUI、OpenCV等工具可实现鼠标键盘模拟、图像识别等自动化操作。本文聚焦Python AI自动编程的技术实现,特别探讨了在游戏辅助脚本生成等热门应用中的可行性与安全边界,为开

weixin_34127717的博客 352

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 【Jenkins自动化】不依赖Jenkins插件读取配置文件
Lukewassup
博客等级 码龄8年 35粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值