不要迷恋我,虽然我利用Python来耍植物大战僵尸
目录
前言
游戏的安装
思路
一句话总结
大概的思路
实战
确定修改哪一款游戏的数据
代码
地址的寻找
视频教程
修改数据
代码
效果
完整的源码
前言
大家好,我叫善念。上篇文章我许了一个愿,就是想让大家多多关注我,然后我的粉丝就蹭蹭的涨了好几百,谢谢大家的厚爱。可是我发现粉丝是涨了,三连变少了,谢谢大家这次给我三连,我一定再接再厉。有问题留在评论区,我会一一回复,谢谢大家!
这次要做的是修改一款单机游戏的数据,学过C语言的朋友肯定经常会看到有些老师讲这个案例,就是《植物大战僵尸》这个课题,不过此文我将带大家利用Python来实现(2019原创课题,附视频教程)。
游戏的安装
关于安装的这一块....我以前是在网站上下载的,现在再去找估计随便百度下载一个就可以了,这里就用我之前的吧
安装下载后切记要避免点到一些广告上去,和一些浏览器的锁定勾选记得取消掉。 进入游戏是全屏,不方便我们观察效果以及编写程序,可以在选项中取消勾选全屏
思路
一句话总结
我的理解就是,所有的程序的本质都是变量与数值的集合。
比如说咱们玩的游戏它也是一个程序吧,游戏的角色血量、蓝条是不是都是一个数值储存在变量内,那么如果我们找到存放这个数值的变量(也可以叫做地址),修改这个变量的值,那么是不是就可以做到给咱们得人物加血量、修改人物等级的一系列操作。
大概的思路
首先确定修改哪一款游戏的数据,然后确定修改游戏的哪一个数据,然后去寻找这个游戏内这个数据的地址,然后去修改这个数据。
听起来有点绕。好吧,是我的语文学习的太差啦
实战
确定修改哪一款游戏的数据
这里需要利用到一个句柄查看工具。
把放大镜拖动到游戏的标题上,就可以查看到这个窗口的所有信息
可以看下咱们任务管理器中的进程ID是否也是39156
代码
import win32process
# 进程模块
import win32gui
# 界面
# none 窗口的类名 窗口的ID
window_handle = win32gui.FindWindow(None, "植物大战僵尸中文版") #Pyspy++ 窗口句柄win32gui.
print(window_handle)
process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取进程ID
print(process_id)
process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#进程句柄
# 进程句柄是否可以被子进程继承,一般选false(不可被继承)
# #这种是用线程内核对象的默认安全属性, 子进程不能继承父进程的句柄,不可以继承,
# 则子进程是不可以通过句柄访问改内核对象。
print(process_handle)
关于这个代码我讲解一下 ,如何确定一款游戏是由进程的句柄来判断的,而我们手动取到游戏的窗口ID 与类名后,可以得到进程ID,由进程ID可以得到游戏句柄。
地址的寻找
阳光总值150, 种植一个豌豆需要100,非常不够用。咱们现在需要实现的功能是无限阳光,达到无限种植豌豆的效果。这里需要用到CE软件。
视频教程
Python永远的神,实战开发游戏内存辅助!
修改数据
由于咱们是用Python这门编程语言来实现的,这里需要用Python去调C,用到动态链接库,所以要配置一下内核模块(动态链接库kernel32.dll),C:\Windows\System32\kernel32.dll放到这个目录下。
代码
import win32api
# 系统模块
import win32process
# 进程模块
import win32gui
# 界面
import ctypes
# C语言调用类型
# python中使用ctypes模块可以在python中直接调用C/C++。首先要将C/C++编译成动态库
# (.dl或.so),之后python中调用即可。
# C类型 调用约定
# kernel32.WriteProcessMemory(int(process_handle),0x1C0A4F98,byref(c_int(1000)),4,byref(c_int(0)))
kernel32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll ")#加载内核模块 动态链接库
date1 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None读取的一个数据的大小 尺寸 长度
# 缓冲区,各种语言的文本要求不一样,为了兼容,那么自定义一个文本
# 地址会变,但是里面存储的数据不会变。
print(date1.value)
date2 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),date1.value+0x768,ctypes.byref(date2),4,None)
print(date2.value)
date3 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(date3),4,None)
print(date3.value)
sun = input("请输入你要改变的阳光值:")
# kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))),4,None)
kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))), 4, None)
# 关闭进程
kernel32.CloseHandle(int(process_handle))
效果
完整的源码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2019/4/30 16:00
# @Author : 善念import win32api
# 系统模块
import win32process
# 进程模块
import win32gui
# 界面
import ctypes
# C语言调用类型
# python中使用ctypes模块可以在python中直接调用C/C++。首先要将C/C++编译成动态库
# (.dl或.so),之后python中调用即可。
# none 窗口的类名 窗口的ID
window_handle = win32gui.FindWindow(None, "植物大战僵尸中文版") #Pyspy++ 窗口句柄win32gui.
print(window_handle)
process_id = win32process.GetWindowThreadProcessId(window_handle)[1] #取进程ID
print(process_id)
process_handle = win32api.OpenProcess(0x1F0FFF, False, process_id)#进程句柄
# 进程句柄是否可以被子进程继承,一般选false(不可被继承)
# #这种是用线程内核对象的默认安全属性, 子进程不能继承父进程的句柄,不可以继承,
# 则子进程是不可以通过句柄访问改内核对象。
print(process_handle)
# C类型 调用约定
# kernel32.WriteProcessMemory(int(process_handle),0x1C0A4F98,byref(c_int(1000)),4,byref(c_int(0)))
kernel32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll ")#加载内核模块 动态链接库
date1 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),0x006A9EC0,ctypes.byref(date1),4,None)#None读取的一个数据的大小 尺寸 长度
# 缓冲区,各种语言的文本要求不一样,为了兼容,那么自定义一个文本
# 地址会变,但是里面存储的数据不会变。
print(date1.value)
date2 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),date1.value+0x768,ctypes.byref(date2),4,None)
print(date2.value)
date3 = ctypes.c_long()
kernel32.ReadProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(date3),4,None)
print(date3.value)
sun = input("请输入你要改变的阳光值:")
# kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))),4,None)
kernel32.WriteProcessMemory(int(process_handle),date2.value+0x5560,ctypes.byref(ctypes.c_long(int(sun))), 4, None)
kernel32.CloseHandle(int(process_handle))
# 关闭进程
不要迷恋我,虽然我利用Python来耍植物大战僵尸相关推荐
- 不要迷恋我,虽然我利用Python来耍植物大战僵尸,威力加强版
前言 == 大家好,我叫善念.上篇文章我许了一个愿,就是想让大家多多关注我,然后我的粉丝就蹭蹭的涨了好几百,谢谢大家的厚爱.可是我发现粉丝是涨了,三连变少了,谢谢大家这次给我三连,我一定再接再厉.有问 ...
- Python应用之植物大战僵尸2-功夫世界BOSS关卡无限刷金币
植物大战僵尸2-功夫世界BOSS关卡无限刷金币 前提 思路 step 1 游戏重新开始 step 2 选择植物 step 3 放置植物 step 4 收集金币 结果 代码 树莓派开机启动设置 本人已经 ...
- python小游戏“植物大战僵尸”
python讨论qq群:996113038 导语: 这几天一直写爬虫,感觉写累了.本来准备写一个画画的程序的,但是想来想去没有想到合适的程序.后来想到好久没有给大家推送过游戏了.上次推送游戏还是两个星 ...
- 用Python写一个植物大战僵尸
上次写了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧 植物大战僵尸的话 Python源码.问题解答学习交流群:773162165 引入需要的模块 import pygame im ...
- Python可以制作植物大战僵尸,你还不知道吗?
哈喽,大家下午好,我是小圆 有谁不知道植物大战僵尸这个游戏啊,我从小就在玩 大学上课的时候,老师在上面讲课,我偷摸着在下面玩游戏,一边打僵尸,一边养植物,还是感觉挺意思的 ok,今天我们来用pytho ...
- 用Python写一个植物大战僵尸! 简直一模一样!
引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_heigh ...
- python版植物大战僵尸源码_用Python写一个植物大战僵尸! 简直一模一样!
引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_heigh ...
- Python开发简单植物大战僵尸
运行效果 1.引入需要的模块,配置图片路径,设置界面,创建游戏主入口. #1 引入需要的模块 import os import timeimport pygame import random #1 配 ...
- 基于python开发植物大战僵尸
目录 摘要 2 一, 引言 3 1.1中国游戏产业的现状 3 1.2中国游戏产业的未来发展局势 4 1.3植物大战僵尸游戏的发展状况 4 二.系统结构 5 2.1 Python3.8.2 IDLE 简 ...
最新文章
- 初步学习pg_control文件之三
- 网络编程学习笔记--1.socket可读可写条件
- Java继承Thread类创建多线程
- 表名含有后缀 mysql 怎么删除_mysql批量删除指定前缀或后缀表
- python 标准差_标准差python
- Linux vim中使用计算器
- Jquery radio选中
- 百度分布式配置管理平台-Disconf
- 深度学习Pytorch--梯度与反向传播笔记
- 【iOS开发】崩溃问题汇总
- ORACLE 12C 插入数据遇到 Error getting generated key or setting result to parameter object错误
- 阿里云虚拟机被尝试登陆多次,还好哥的密码不是一般般的
- python把空格替换成字符串,用空格替换字符串中的字符
- 大数据之-Hadoop3.x_Yarn_公平调度器---大数据之hadoop3.x工作笔记0146
- Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改
- brew切换到清华源
- 计算机考试试题大一上学期,大一第一学期期末考试计算机试题
- 「沙龙回顾」从技术演进角度看猫眼电影
- django models 数据库 update_or_create 更新或者插入
- 计算机怎样打开鼠标点的键盘,电脑软键盘怎么打?