今天突发奇想,打算做一个单击模拟版的篮球经理游戏,主要功能包括随机组队、抽卡、更换阵容和模拟比赛。具体的等想到了再往里添加,目前设计的游戏流程是这样的:
今天就先来完成准备工作。
尽然是模拟抽卡的游戏,首先要有卡池,也就是数据库。我从虎扑数据库里爬取了所有现役NBA球员的姓名、位置和头像,然后再稍加处理。爬虫代码如下:
from bs4 import BeautifulSoup
import requests
'''保存图片函数'''
def saveImg(myurl):
# 1.请求页面
thtml = requests.get(myurl)
# 2.用返回内容创建soup对象
tsoup = BeautifulSoup(thtml.content, 'lxml')
# 3.获取球员名称放入 namelist
allname = tsoup.select("td.left > b > a")
namelist=[]
for tname in allname:
namelist.append(tname.text)
# 4.获取球员位置放入 loclist
loc = tsoup.select("td")
loclist=[]
for tname in loc:
if "F" in tname or "G" in tname or "C" in tname or "G-F" in tname or "F-G" in tname or "C-F" in tname or "F-C" in tname:
loclist.append(tname.text)
# 5.获取球员头像src连接放入 srclist
allsrc=tsoup.select("td.td_padding > a >img")
srclist=[]
for tsrc in allsrc:
srclist.append(tsrc.get("src"))
# 6.进行图片和球员保存
for i in range(0,len(srclist)):
data=requests.get(srclist[i])
path='image/'+namelist[i]+".jpg" #头像存储路径
path2='players.txt' #球员名单
file=open(path,"wb")
file.write(data.content)
doc=open(path2,"a")
doc.write(namelist[i]+" "+loclist[i]+"\n")
url="https://nba.hupu.com/players" #主界面网址
header={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.1.0.14126"
}
urls=[] #用来存储各个队的球员列表所在的网址
html=requests.get(url,headers=header)
soup=BeautifulSoup(html.content,"lxml")
#获取所有球队页面所在的url地址
allurl=soup.select("span.team_name > a")
for t in allurl:
urls.append(t.get("href"))
#开始爬取
for turl in urls:
saveImg(turl)
虎扑的球员数据是按照球队来分布的,每个球队的球员可以在同一个网页上获取。其中比较麻烦的是球员位置,它的标签是
,可是这个网页里有很多同名的标签,因此我们通过内容来筛选,也就是代码中的:if "F" in tname or "G" in tname or "C" in tname or "G-F" in tname or "F-G" in tname or "C-F" in tname or "F-C" in tname:
loclist.append(tname.text)
得到头像图片和球员名单后,发现其中有一些名字空白的球员,把这些球员删掉后,还剩497人。然后我们需要在txt里,在每一行的末尾手动为该球员加上能力值,分隔符是一个空格。这个工作虽然很累,但也挺有趣,毕竟是自己玩的游戏,想怎么设就怎么设吧。对于那些根本不认识的饮水机球员,我一律设为了65,其他的都跟2K20差不多。
接下来还要对球员名单做进一步处理,按照位置分成G、F、C三部分,目的是为了在模拟组队的时候,能够组出一只正常的队伍,包括两个G、两个F和一个C。同时这样一分,也会让球员名单更加清晰。
这里面有一些双位置的球员,为了避免重复,我全部按照第一位置来划分的,比如G-F就是G。切分球员名单的代码如下:
with open("players.txt", "r") as f:
data = f.readlines()
doc1 = open("G.txt",'a',encoding="utf-8")
doc2 = open("F.txt",'a',encoding="utf-8")
doc3 = open("C.txt",'a',encoding="utf-8")
for i in data:
loc=i.split()
if "G" in loc[1] and loc[1] != "F-G":
print("%s %s %s"%(loc[0],loc[1],loc[2]),file=doc1)
elif "F" in loc[1] and loc[1] != "G-F" and loc[1] != "C-F":
print("%s %s %s"%(loc[0],loc[1],loc[2]),file=doc2)
elif "C" in loc[1] and loc[1] != "F-C":
print("%s %s %s"%(loc[0],loc[1],loc[2]),file=doc3)
现在球员名单的顺序是按照球队划分的,如果想按照能力值排序也可以,但是没必要费劲巴拉写代码了,粘贴到excel里排序吧。不过直接粘进去以后,三列数据都挤在一列,只要选择“数据”中的“分列”,然后按空格分列即可,后面就能正常排序了。
下面是我们今天得到的图片:
还有三个球员名单:
明天我会用tkinter(也许用pygame更好,但最近都在研究tkinter,可以在之前做的程序上稍加改动)做一个简单的游戏界面,实现随机组队和抽卡、更换阵容的功能。