首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python单机游戏—乱世君临

上一篇我们实现了英雄的自动生成与手动创建,接下来我们就应该将生成的英雄属性存入到我们的mysql数据库中。

首先我们在配置文件conf.cfg中写入mysql信息

# MysqlDB配置文件

[MYSQL_DB]

host =127.0.0.1

port =3306

user =username

passwd =password

charset =utf8

按照各自的mysql地址、端口、用户名和密码进行修改,之后我们打开GetConn中的get_conn()方法进行数据库连接。

defget_conn(db):

"""

获取配置文件的内容来创建数据库连接

@ cp 读取配置文件

@ host 数据库地址

@ port 数据库端口

@ user 数据库用户名

@ passwd 数据库密码

@ charset 数据库编码

@ conn 创建数据库连接

:paramdb: 需要连接的数据库名称

:return: conn 数据库连接

"""

# 分别从配置文件中读入mysql配置信息

cp = configparser.ConfigParser()

cp.read('./conf.cfg',encoding='utf-8')

host = cp.get('MYSQL_DB','host')

port =int(cp.get('MYSQL_DB','port'))

user = cp.get('MYSQL_DB','user')

passwd = cp.get('MYSQL_DB','passwd')

charset = cp.get('MYSQL_DB','charset')

# 异常控制

try:

# 创建数据库连接

conn = pymysql.connect(

host=host,

port=port,

user=user,

passwd=passwd,

db=db,

charset=charset

)

# 返回数据库连接对象

returnconn

exceptExceptionase:

print(e)

我们从配置文件conf.cfg中读入mysql的配置信息,然后使用pymysql(python2中使用MySQL-python)来创建数据库连接,并定义conn来接收创建的数据库连接对象并返回,因为后面的所有数据库操作都将使用这个conn来完成。

接下来我们在mysql数据库中使用'create database hero_era_2;'命令创建一个数据库,这个数据库名将作为我们创建数据库连接时传入的参数db。

# 调用GetConn中的get_conn()方法获取一个数据库连接对象

self.conn = Conn.get_conn('hero_era_2')

然后我们需要创建heroes表,用于存储所有英雄信息

defcreate_hero_table(conn):

"""

重建英雄数据表

用于新游戏时,清空上一场游戏数据内容,重新生成英雄数据表

:paramconn: 数据库连接对象

:return: None

"""

# 获取数据库操作游标

cursor = conn.cursor()

# SQL删除英雄表

drop_sql ='DROP TABLE IF EXISTS heroes;'

# SQL创建英雄表

create_sql ='''

CREATE TABLE heroes (

h_idINT(10) NOT NULL AUTO_INCREMENT COMMENT '英雄ID',

h_groupINT(10) DEFAULT 0 COMMENT '所属势力ID',

h_nameVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄姓名',

h_genderVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄性别',

h_ageINT(10) DEFAULT NULL COMMENT '英雄年龄',

h_identityVARCHAR(10) COLLATE utf8_bin DEFAULT NULL COMMENT '英雄身份',

h_leadINT(10) DEFAULT NULL COMMENT '英雄统率',

h_forceINT(10) DEFAULT NULL COMMENT '英雄武力',

h_brainINT(10) DEFAULT NULL COMMENT '英雄智力',

h_politicsINT(10) DEFAULT NULL COMMENT '英雄政治',

h_charmINT(10) DEFAULT NULL COMMENT '英雄魅力',

h_statusINT(10) DEFAULT 1 COMMENT '英雄状态',

PRIMARY KEY (h_id),

KEY (h_group)

) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

'''

try:

# 执行SQL

cursor.execute(drop_sql)

cursor.execute(create_sql)

exceptExceptionase:

print(e)

# 事务回滚

conn.rollback()

这里使用到了SQL语句创建表,并设定h_id作为主键,序列自增;设定英雄势力h_group默认值为0,即未加入任何势力;设定英雄状态h_status默认值为1,即在野状态;设定外键为h_group;设定编码为utf-8。

另外使用了事务回滚rollback()函数,其作用是在数据库执行操作出错时保证数据库不做更改,这样能很好地保护数据库中的数据不会受到错误操作的影响。

最后我们还需要实现将数据插入到数据库表,同样在GetConn中找到insert_data()方法

definsert_data(data,t_name,conn):

"""

向数据库中插入数据

@ conn 接收由get_conn()返回的conn这个数据库连接

@ cursor 数据库操作游标,用于数据库操作

@ keys 拼接SQL语句,值是student字典中所有的key

@ values 拼接SQL语句,值是student字典中所有的value

@ sql 拼接需要执行的SQL语句

:paramdata: 插入数据字典

:paramt_name: 操作表名称

:paramconn: 数据库连接对象

:return: None

"""

keys =''

values =''

cursor = conn.cursor()

# 遍历字典中所有的key和value并分别接收拼接

forkey,valueindata.items():

keys = keys +'{},'.format(key)

values = values +'"{}",'.format(value)

sql ='INSERT INTO () VALUES()'.format(

t_name,keys[:-1],values[:-1]

)

# 异常控制

try:

# 执行SQL语句并提交事务

cursor.execute(sql)

conn.commit()

exceptExceptionase:

print(e)

# 事务回滚

conn.rollback()

在这里我们定义了一个keys用来接收拼接数据库字段,values用来接收拼接数据的值,因为我们传过来的hero_data是一个字典,且字典的key和heroes表中的字段一一对应,所以我们以这样的方式减少了SQL语句的复杂度,且可以通用于整个程序的数据插入操作。

该方法需要传入一个t_name参数,作为连接的数据库中需要操作的数据表名,并使用了commit()函数进行事务提交。这里需要注意的是,如果我们不使用整个commit()函数,则数据不会被写入数据表中。

到这里我们的数据库英雄部分的入库准备已经完成,那么接下来我们就回到Hero_Era去将这几个部分结合起来,实现英雄的自动创建与入库。

导入GetConn用于数据库操作并定义别名为Conn:

fromHero_Era_Pro2importGetConnasConn

创建数据库连接对象:

self.conn = Conn.get_conn('hero_era_2')

新建一个英雄表:

Conn.create_hero_table(self.conn)

导入Hero_Builder用于英雄创建并定义别名为HB:

fromHero_Era_Pro2importHero_BuilderasHB

调用auto_create_hero()方法自动创建英雄,并指定英雄数为10:

HB.auto_create_hero(self.conn,10)

让玩家可以选择自动创建英雄:

choice =int(input('1 新建英雄 2 选择势力\n'))

调用new_hero()方法新建一个英雄:

HB.new_hero(self.conn)

最后一步,分别在Hero_Builder中的auto_create_hero()和new_hero()中添加一个数据库插入操作,并传入生成的英雄属性。当然,我们需要在Hero_Builder中导入GetConn。

fromHero_Era_Pro2importGetConnasConn

Conn.insert_data(hero_data,'heroes',conn)

到这里我们就完成了英雄自创建到入库的所有操作,让我们验证一下:

没问题,那我们再去看看mysql数据库的heroes表中是否插入了这些数据。

我们可以看到数据库中也出现了所有的英雄数据信息,且h_group和h_status的值分别为我们设定的默认值0和1,另外生成的英雄数也是我们所指定的10人,他们的h_id则自动从1开始增长到了10。

至于我们新建的英雄林妹妹,则是在new_hero()中指定了其h_id为500,用以区别。

hero_data['h_id'] =500

本篇到此结束,下一篇将从以上数据中随机选出两人作为势力主公实现势力的创建。

感谢阅读,欢迎继续关注~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181226G1CCTJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券