A. 利用python进行《野蛮时代》游戏数据分析
数据包含近229万条记录,109个字段,以下取较重要的字段进行说明。
字段说明:user_id:用户编码,用户唯一标识
bd_stronghold_level:要塞等级,相当于游戏账号等级
wood_rece_value:木头消耗数量
stone_rece_value:石头消耗数量
ivory_rece_value:象牙消耗数量
meat_rece_value:肉消耗数量
magic_rece_value:魔法消耗数量
general_acceleration_rece_value:通用加速消耗数量
building_acceleration_rece_value:建筑加速消耗数量
reaserch_acceleration_rece_value:科研加速消耗数量
training_acceleration_rece_value:训练加速消耗数量
treatment_acceleration_rece_value:治疗加速消耗数量
pvp_battle_count:玩家对玩家次数
pve_battle_count:玩家对机器次数
avg_online_minutes:日均在线时间
pay_price: 消费金额
pay_count:消费次数
分析思路:用户注册时间分布情况?
用户的付费情况(付费率,ARPU,ARPPU)?
各等级用户的付费情况?
用户的消费习惯?
可视化数据
分析过程:
①导入数据
import numpy as np
import pandas as pd
from pandas import read_csv
from sklearn.cluster import KMeans
import matplotlib.pyplotas plt
import pylab as pl
from matplotlib.font_managerimport FontManager, FontProperties
pd.set_option('display.max_columns',None)
#为了数据安全,一份数据
df=df0
#检查是否有空值
print(df.isnull().any().any())
#观察数据构成
print(df.head())
②清洗数据
#以user_id为维度,删除重复数据,并查看用户总数
df=df.drop_plicates(subset='user_id')
print('用户总数:',len(df['user_id']))
→用户总数:2288007
③计算用户注册时间分布
#首先将注册时间精确到天
register_date=[]
for i in df['register_time']:
date=i[5:10]
register_date.append(date)
df['register_time']=register_date
#计算每天的注册人数
df_register=df.groupby('register_time').size()
df_register.columns=['日期','注册人数']
print(df_register)
(可视化)
plt.plot(df_register)
plt.grid(True)
pl.xticks(rotation=90)
font=FontProperties(fname='/System/Library/Fonts/PingFang.ttc')
plt.title('用户注册分布图',fontproperties=font)
plt.show()
△可以看出,用户注册数在2月19日有一次的大的高峰,其他时间也分别有几次小高峰,且高峰的持续时间很短,可以推测是因为游戏推出一些奖励活动或公司对游戏的推广取得了效果进而使注册用户激增。
④用户的付费情况(付费率,ARPU,ARPPU)
#付费率(付费人数/活跃人数)
df_pay_user=df[(df['pay_price']>0)]
pay_rate=df_pay_user['user_id'].count()/df_active_user['user_id'].count()
print('付费率:%.2f'%(pay_rate))
#ARPU(总付费金额/活跃人数)
arpu=df_pay_user['pay_price'].sum()/df_active_user['user_id'].count()
print('ARPU:%.2f'%(arpu))
#ARPPU(总付费金额/付费人数)
arppu=df_pay_user['pay_price'].sum()/df_pay_user['user_id'].count()
print('ARPPU:%.2f'%(arppu))
△目前盈利较好的手游的ARPU超过5元,一般手游在3~5元之间,盈利较差的低于3元,该游戏的ARPU为8.55元,说明盈利水平较高。
⑤不同等级用户的付费情况
df_user=df[['user_id','bd_stronghold_level','pay_price','pay_count']]
df_table=pd.pivot_table(df_user,index=['bd_stronghold_level'],
values=['user_id','pay_price','pay_count'],
aggfunc={'user_id':'count','pay_price':'sum','pay_count':'sum'})
df_stronghold_pay=pd.DataFrame(df_table.to_records())
#各等级付费人数
df_stronghold_pay['pay_num']=df_user[(df_user['pay_price']>0)].groupby('bd_stronghold_level').user_id.count()
#各等级付费转化率
df_stronghold_pay['pay_rate']=df_stronghold_pay['pay_num']/df_stronghold_pay['user_id']
#各等级平均付费金额
df_stronghold_pay['avg_pay_price']=df_stronghold_pay['pay_price']/df_stronghold_pay['user_id']
#各等级平均付费次数
df_stronghold_pay['avg_pay_count']=df_stronghold_pay['pay_count']/df_stronghold_pay['user_id']
#重命名列名
df_stronghold_pay.columns=['要塞等级','总付费次数','总付费金额','总人数',
'付费人数','付费转化率','人均付费金额','人均付费次数']
df_stronghold_pay=df_stronghold_pay[['要塞等级','总人数','付费人数','付费转化率',
'总付费金额','人均付费金额','总付费次数','人均付费次数']]
df_stronghold_pay=df_stronghold_pay.round(2)
print(df_stronghold_pay)
(可视化)
#要塞等级—付费转化率
x=df_stronghold_pay['要塞等级']
y=df_stronghold_pay['付费转化率']
plt.xticks(x,range(0,len(x),1))
plt.plot(x,y)
plt.grid(True)
plt.title('不同等级用户付费转化率',fontproperties=font)
plt.show()
#要塞等级-人均付费金额
x=df_stronghold_pay['要塞等级']
y=df_stronghold_pay['人均付费金额']
plt.xticks(x,range(0,len(x),1))
plt.plot(x,y)
plt.grid(True)
plt.title('不同等级用户人均付费jine',fontproperties=font)
plt.show()
x=df_stronghold_pay['要塞等级']
y=df_stronghold_pay['人均付费金额']
plt.xticks(x,range(0,len(x),1))
plt.plot(x,y)
plt.grid(True)
plt.title('不同等级用户人均付费jine',fontproperties=font)
plt.show()
#要塞等级-人均付费次数
x=df_stronghold_pay['要塞等级']
y=df_stronghold_pay['人均付费次数']
plt.xticks(x,range(0,len(x),1))
plt.plot(x,y)
plt.grid(True)
plt.title('不同等级用户人均付费次数',fontproperties=font)
plt.show()
△用户等级到达10级时,付费率接近60%,等级到达13级时,付费率接近100%,且人均付费金额和次数两项指标也在用户达到10级后增长迅速,因此可以认定10级以上用户为游戏的核心用户。
△但是观察用户等级分布,发现绝大部分用户还是处在10级以下的水平,因此如何使用户达到10级是游戏运营接下来需要考虑的事。
⑥不同玩家的消费习惯
该游戏充值主要可以获得道具类(木头、石头、象牙、肉、魔法)和加速券类(通用、建筑、科研、训练、医疗)。根据用户的充值金额大小,分别分析两类消费品的消耗情况。
#将等级>=10级的玩家划分为:消费>=500为高消费玩家,<500为普通玩家
df_eli_user=df[(df['pay_price']>=500)&(df['bd_stronghold_level']>=10)]
df_nor_user=df[(df['pay_price']<500)&(df['bd_stronghold_level']>10)]
#不同玩家的道具消耗情况
wood_avg=[df_eli_user['wood_rece_value'].mean(),df_nor_user['wood_rece_value'].mean()]
stone_avg=[df_eli_user['stone_rece_value'].mean(),df_nor_user['stone_rece_value'].mean()]
ivory_avg=[df_eli_user['ivory_rece_value'].mean(),df_nor_user['ivory_rece_value'].mean()]
meat_avg=[df_eli_user['meat_rece_value'].mean(),df_nor_user['meat_rece_value'].mean()]
magic_avg=[df_eli_user['magic_rece_value'].mean(),df_nor_user['magic_rece_value'].mean()]
props_data={'high_value_player':[wood_avg[0],stone_avg[0],ivory_avg[0],meat_avg[0],magic_avg[0]],
'normal_player':[wood_avg[1],stone_avg[1],ivory_avg[1],meat_avg[1],magic_avg[1]]}
df_props=pd.DataFrame(props_data,index=['wood','stone','ivory','meat','magic'])
df_props=df_props.round(2)
print(df_props)
#可视化
ax=df_props.plot(kind='bar',title='Props Rece',
grid=True,legend=True)
plt.show()
△普通玩家和高消费玩家对木头、石头、肉的消耗都较大,魔法的消耗都较小,而在象牙的消耗上,高消费玩家和普通玩家的消耗差距较大。
#不同玩家的加速券消耗情况
general_avg=[df_eli_user['general_acceleration_rece_value'].mean(),
df_nor_user['general_acceleration_rece_value'].mean()]
building_avg=[df_eli_user['building_acceleration_rece_value'].mean(),
df_nor_user['building_acceleration_rece_value'].mean()]
research_avg=[df_eli_user['reaserch_acceleration_rece_value'].mean(),
df_nor_user['reaserch_acceleration_rece_value'].mean()]
training_avg=[df_eli_user['training_acceleration_rece_value'].mean(),
df_nor_user['training_acceleration_rece_value'].mean()]
treatment_avg=[df_eli_user['treatment_acceleration_rece_value'].mean(),
df_nor_user['treatment_acceleration_rece_value'].mean()]
acceleration_data={'high_value_player':[general_avg[0],building_avg[0],research_avg[0],
training_avg[0],treatment_avg[0]],
'normal_player':[general_avg[1],building_avg[1],research_avg[1],
training_avg[1],treatment_avg[1]]}
df_acceleration=pd.DataFrame(acceleration_data,index=['general','building','researching','training','treatment'])
print(df_acceleration.round(2))
#可视化
ax=df_acceleration.plot(kind='bar',title='Acceleration Rece',
grid=True,legend=True)
plt.show()
△两类玩家对对治疗加速券消耗都很小,对通用加速券的消耗差异较大,其他三种加速券消耗差别不大。
结论:1.该游戏具有较大的用户基数,且新用户注册受游戏活动、新版本等因素影响较大。
2.该游戏的ARPU为8.55,说明该游戏的盈利能力较高。
3.用户等级达到10级后,付费意愿明显上升,且达到13级时付费率将近100%。但是绝大多数用户仍然停留在10级以下,如何使用户平滑升至10级尤为重要。
4.消费习惯上,高消费玩家对象牙和通用加速券的需求远多于一般玩家。
B. python做的游戏有哪些
比较大型的,使用Python的游戏有两个,一个是《EVE》,还有一个是《文明》。另外GitHub上有很多开源的小游戏,下面给大家介绍一下:
1. Github上面有个项目Free Python Games,里面集合了不少的Python开发的小游戏,能玩,也适合新手用来练练手,另外 PyGame 这个网站里面里面集合了很多Python开发的小游戏。
2. Python版本的 Flapy Bird 简化版,但是感觉更加难玩了。当然你也可以尝试用Python开发原版的 Flapy Bird,涵盖了颜色图像等:Flappy Block - 1.0。
相关推荐:《Python教程》
3. 小时候经常在手机上玩的一个游戏,也是一款经典的街机游戏,这款游戏进化之后其实就是一个打乒乓的小游戏,这里同样有一个进化版本,图形设计的更加好看:Ping Pong。
4. 以前初高中在学校很无聊的时候跟同桌或者前后桌玩的游戏,你还记得么?
5. 同样一款小时候在小霸王上玩的游戏:Junk Jungle。
6. 除此之外,一款比较有名基于Pyhton的战争的游戏:Home - TaleWorlds Entertainment。
7. 一款看起来非常有趣的3D游戏:Galcon。
C. Python下Pywin32的使用教程
你可以直接到lib的site-packages下面的win32目录下,有一个demos。另外几个win32开头的目录里也有demos子目录。进去看他们写好的例子。
D. 自动玩游戏,手游脚本究竟是怎么做的
手游现在已经成为大家打发碎片化时间的一种很普遍的方式了,而有的人会由于种种愿意不能自己去玩,就希望有什么办法或者工具能帮助我们解决这个问题,不用人收着也能完成任务。
实现原理:
比如一个 游戏 的任务,你需要在不同的手机屏幕上进行一系列点击,滑动,甚至输入文本,发送语音等动作后才能完成,而这一切操作其实就是手机中会记录这些动作的文件,文件存储的是一个又一个的信号量,这些信号然后根据不同厂商的设定反馈给上层,而上层会根据反馈的信息转换成统一识别的事件,事件最后响应给应用,并对信息进行相应的处理,最后呈现给用户并实现它,这一些列的动作都是可以通过一些现有的工具或者说解决方案来帮我们实现自动 游戏 的功能。
一般实现的方式 :
1.通过USB连接电脑,然后通过ADB(一种android的调试工具,当然iOS也有类似的工具一个原理)对手机进行远程的控制;
2.通过在手机中安装一个控制其它app的app来控制,说简单点就是生成一个手机应用,在手机中运行后,直接通过这个应用对其它应用进行操作;
实现方式我们明白了,那么要借助哪些工具或者说哪些解决方案来帮我们进行实现呢。
易语言解决方案:
首先我们来说一说这个被大多数人所知道的,但是又被"正统"程序员所抵触的编程语言。
这是一款运用中文进行编程的语言,可以说它让大多数人摆脱了"英文魔咒",很多人认为学习编程其实就是学英语,或者英语不好没办法学习编程,这其实是错误的理解,这个后话了,等我有空了再为大家分享下如何摆脱这个魔咒。
优势:
1. 中文化编程,中文毕竟是我们的母语,在更加让人容易理解;
2. 在 游戏 相关领域有非常成熟的框架,或者中支持库;
3. 使用这种解决方案的人群非常多,当你遇到问题时很容易找到解决办法;
劣势:
1. 代码的编译速度相对其他语言来说很慢;(对于现在的电脑硬件来说其实已经没啥大碍)
2. 会被其他编程语言鄙视,太local化了,没有那种国际感;
3. 收费;(虽然作者初衷是推广中文编程,但是推广也是要钱的嘛,能理解)
4. 易语言需要进行一定的学习,相对其他几个解决方案来说难度略高;
易语言解决方案总的来说,由于是中文的并且有大量现成知识库做支撑,很容易就能实现功能,所以一直被用来作为中控型的脚本来编写,不大会被用来进行生成app的方式来进行(有app化的解决办法,但是不稳定不讨论)
按键精灵解决方案:
案件精灵可以说是这个领域里, 历史 悠久且非常出色的一位前辈。非常简单就能上手,甚至有通过录像然后转成脚本的录制功能,当然要制作出优秀的脚本也需要进行一定的学习;
优势:
1. 非常简单,容易上手,有非常丰富的快捷方式;
2. 有录制功能,更进一步降低了制作门槛;
3. 历史 悠久人群稳定,所以社区也很稳定,遇到问题很容易找到解决办法(注意我说的是群体,不是按键精灵的论坛。)
4. 按键精灵非常良好的提供了解决方案,即可生成app直接手机中运行,也可以通过安装按键的android版然后传送脚本进行运行。
劣势:
1. 付费,且不便宜;
2. 代码框架实现是基于英文实现;
3. 无法进行分文件管理,就是说所有业务要写进一个文本里,这其实非常不方便管理和维护;
按键精灵解决方案,比较适合对编程没有什么基础的朋友上手。网络上也有非常多的免费教程可以进行学习。
触动精灵解决方案:
触动精灵是近几年新启一个新的平台,是基于lua语言来进行编写开发的,与按键精灵类似,不过相对按键的名声赫赫,就有点显得小很多。
优势:
1. 支持文件化管理开发;(这点其实非常棒,对于后期的代码开发或者维护来说都很棒)
2. 基于lua开发,所以可以完美利用lua的原表特性来进行一些框架搭建,更加适用于负责的点击事件;
3. 拥有一套完善的支持自动化的库,可以直接拿来使用;
4. 支持远程调试,脚本传到手机中运行,也可以生成app进行控制;
劣势:
1. 需要学习lua语言,对小白来说有点不友好;
2. 需要付费,相对按键来说比较便宜;
3. 偏小众,出问题想找解决办法非常难找;
4. 对于android和iOS系统收取不同的费用来打包生成apk;
5. 代码框架也是基于英文进行实现的;
触动精灵的解决方案,好于能利用lua的原表特性来进行自定义框架开发,方便自己的后续的多次开发。网络上也有很多的教程来进行学习,就是遇到问题需要解决的时候,总会找不到办法,这里有点难受。
Auto.js解决方案:
这套方案是借助于android手机的无障碍服务进行实现的,根据控件的id进行一系列的事件响应,精准度更高。
优势:
1. 无需root就可以实现控制手机;
2. 可在手机中运行,也可以打包成apk运行;
3. 通过控件id进行控制,准确度非常高,并且自适应分辨率;
劣势:
1. 对 游戏 不大友好,因为 游戏 很多时候控件都不规则,都是一个个画布;
2. 需要学习js;
3. 基于英文实现的代码框架;
Auto.js这个解决方案,对于 游戏 来说并不大友好,虽然也有找图找色等功能,但是使用起来并没有按键或者触动那么方便,并且由于是基于空间id进行控制,并不大适合 游戏 。
其他解决方案:
其实还有其他非常多的类似的解决方案,但是大多数都没上面列举的这些被人熟知。
举个例子像python也拥有非常丰富的类库,但是只能适应使用usb连接手机的通过adb进行控制这样的操作,无法生成一个apk来安装到手机中进行操作,我也曾尝试过在手机中模拟一个python环境,但是依赖的类库无法非常方便的移植到手机中,就算静态编译过去也非常的耗时,所以python也能实现但是他很不友好,也很不方便,学习成本也非常高。