1
课程编号:
A0801051010
《Python 程序设计》实验报告
姓 名
学 号
班 级
指 导 教 师
实 验 名 称
《Python 程序设计》综合实验开发与总结
开 设 学 期
开 设 时 间
报 告 日 期
评 定 成 绩
评 定 人
评 定 日 期
东北大学软件学院
- 2 -
目录
一.实验目的.....................................................................................................................................3
二.实验内容.....................................................................................................................................3
三.实验环境 Experiment Environment.......................................................................................... 3
四.实验过程与分析.........................................................................................................................4
4.1 基础实验..............................................................................................................................4
1. 问题描述及分析............................................................................................................4
2. 关键算法设计................................................................................................................4
3. 实现结果........................................................................................................................6
4.2 数据分析实验..................................................................................................................... 8
4.2.1 分析数据特征间的关系以及各个特征的分布与分散状况.................................. 8
4.2.2 使用分组聚合方法进行数据分析........................................................................ 14
4.2.3 数据预处理.............................................................................................................18
4.2.4 数据分析.................................................................................................................24
五.实验总结...................................................................................................................................31
《Python 程序设计》实验报告 东北大学软件学院
- 3 -
一.实验目的
在基础实验中,能熟练运用 Python 语言的基本语法、控制语句、函数、面向对象、GUI 等开
发一个应用类游戏。为后续 Python 学习打下扎实基础。
在数据分析实验中,能熟练运用 Python 列表、字典、集合、数组等数据结构以及索引和切片等
查询操作解决实际问题,熟练掌握 Python 读写数据文件的方法,熟练使用 Matplotlib 数据可视化工
具,熟练使用 pandas 数据分析库函数,基本掌握使用 scikit-learn 库多种机器学习算法进行数据分析
的过程,了解 Python 程序的调试方法,运用 Python 编写程序解决实际应用问题。
二.实验内容
1. 基础实验
设计一个带有图形用户界面的人机对战井字棋游戏。
游戏在九宫方格内进行,如果一方抢先于某方向(横、竖、斜)连成 3 子,则获取胜利。游戏
界面,首先询问哪个玩家先走,然后根据玩家落子位置,显示棋盘状态。最终根据游戏规则,评判
哪个玩家获胜。
2. 数据分析实验
分析 1996- -2015 年人口数据特征间的关系以及各个特征的分布与分散状况
读取并查看 P2P 网络贷款数据主表的基本信息,使用分组聚合方法进一步分析用户信息更新
表和登录信息表
插补用户用电量数据缺失值,合并线损、用电量趋势与线路告警数据,标准化建模专家样本
数据
使用 sklearn 处理 wine 和 wine_quality 数据集,构建基于 wine 数据集的 K-Means 聚类模型、
SVM 分类模型、回归模型
三.实验环境 Experiment Environment
操作系统:Windows 10
编译软件:PyCharm 2019.3.1
Anaconda3 2019.10 (Python 3.7.4 64-bit)
Spyder 3.3.6
Python IDLE 3.7
《Python 程序设计》实验报告 东北大学软件学院
- 4 -
四.实验过程与分析
4.1 基础实验
1.
问题描述及分析
设计一个带有图形用户界面的人机对战井字棋游戏。游戏在九宫方格内进行,如果一方抢先于
某方向(横、竖、斜)连成 3 子,则获取胜利。游戏界面,首先询问哪个玩家先走,然后根据玩家
落子位置,显示棋盘状态。最终根据游戏规则,评判哪个玩家获胜。
该问题的重点与难点在于:如何在图形界面中实现下棋功能,如何判断当前棋盘中是否有赢家,
以及电脑如何选择下棋位置。前者可以通过在每一次下棋之后,遍历棋盘中获胜的路线来判断某一
路线中的三个下棋点是否为同一玩家的棋子,若相同,则该玩家获胜,游戏结束;若不存在这样的
情况,则此时没有玩家获胜,游戏继续。后者可以通过一个估价函数,来帮助电脑判断当前的下棋
位置,判断的优先级依次为:赢得游戏、不能输(平局)、随机下棋。
2.
关键算法设计
·关键点 1:在图形界面中实现下棋功能。
代码如下:
def peo_go(po):
# 玩家走棋
if the_chess[po] == 0:
the_chess[po] = who
update_chess()
if is_win(the_chess, who) == who:
tips.set('你赢了!')
elif count_zero(the_chess) == 0:
tips.set("平局!")
else:
ai_go(who * -1)
def ai_go(w):
# 机器走棋
if count_zero(the_chess) < 9:
po = is_danger(the_chess, 1)
if po != -1:
the_chess[po] = w
update_chess()
elif not constraint(w):
pass
else:
the_chess[ \
get_next_o( \
the_chess, -1)] = w
update_chess()
if is_win(the_chess, -1) == -1:
tips.set("你输了!")
if count_zero(the_chess) == 0:
tips.set("平局!")
《Python 程序设计》实验报告 东北大学软件学院
- 5 -
代码中省略了按钮事件代码及调用代码的语句,按钮事件利用 tkinter 中的 bind()函数绑定事件,
并联系到 peo_go 函数。在 peo_go 函数中,局部变量 po 表示点击下棋的位置(0~8),the_chess 表
示当前的棋盘。
这里以玩家先下为例,如果 po 指向的位置为 0(没有下过子),则将该位置的数值改为 who 的
值,同时通过 update_chess()函数更新图形界面上的棋盘。此时,如果玩家下棋后达成胜利条件,则
显示“你赢了”,否则如果此时没有可以落子的地方了,就显示“平局”,如果条件都不满足,则
说明游戏还未结束,切换至电脑操作(在玩家操作过程中不可能出现落子后玩家输的情况)。
机器走棋部分中,首先判断当前剩余空格是否小于 9,如果是,那么判断拟下棋点下完后是否
会让自己陷入危险状态(is_danger()函数的功能),如果陷入(po != -1),那么就落子在该位置来化解危
机,否则,根据 evaluation 函数(具体功能在关键点 3 中介绍)的优先级判断来落子,同时更新棋盘。
落子后,判断此时电脑(-1)是否达到获胜条件,如果达到,那么玩家输了,显示提示信息;如果
此时没有空格可以下子,则游戏以平局结束(在电脑操作的过程中不可能出现落子后玩家获胜的情
况)。
·关键点 2:判断当前棋盘中是否有赢家。
代码如下:
def is_win(now_chess, who):
temp = now_chess[:]
for chess in win_chess:
if (temp[chess[0]] == who) and \
(temp[chess[1]] == who) and \
(temp[chess[2]] == who):
return who
return 0
代码中 now_chess 为当前棋盘的情况(3*3 二维数组),who 代表要判断的游戏方(在程序中以
整数 1 代表此位置为人类玩家下棋位置,-1 代表机器下棋位置,每次交换下棋方后对 who 取反,即
可达到交换玩家的目的)。如果在 for 循环中没有执行到 return 语句,则说明此时场上没有一方获胜,
否则,返回要判断的游戏方代表数字,即该方获胜。