Python 程序设计课程大作业
——题目:五子棋
18 专升本 1 班 黄佳雯 王靖雅 张嘉玥
学号: 08/26/46
2018/11/1
一、课程目标与要求
通过本次课程大作业的设计,使学生进一步掌握 Python 语言的使用,培养
程序设计的能力,完善 Python 语言的知识结构,为后续课程的学习打下良好的
基础。学生将本课程教授的内容与自身兴趣相结合,自选开发题目(内容题材不
限),要求最终提交的程序源码行数在 100 有效行以上(不设上限)。
大作用的考核采用答辩展示的方法,每位同学用 3 分钟将自己的设计演示介
绍给班级所有的同学,由每位同学进行排名,根据学生答辩排名赋分作为最终成
绩。(大作用报告中的大标题不要修改,内容统一采用汉字:宋体小四,字母:
Times New Roman 小四,行间距 1.5 倍的格式)
二、程序总体分析
1、选择的原因
五子棋这个游戏从小就在我们生活中,我们平时都是用棋子下,但是我们没
有自己尝试过用 Python 设计出来,所以这是一个好机会来设计一款小游戏来玩,
娱乐身心。这个游戏虽小,但是可以让室友在闲暇之余,晚上娱乐之用。我们学
会了并使用了 python,也对它产生了极大的兴趣,受益匪浅。
2、程序模块图
1
3、程序设计目标与功能介绍
我们设计的是五子棋游戏,支持两人一个鼠标对下,黑方用黑子代替,白方
用白子代替,谁先下均可,落子无悔,下过的棋子对方点击后也不可更改。游戏
双方需遵循一次下一子的规则。
三、程序详细设计
程序流程图
2
四、设计中的技巧与体会
1、为了解决某个问题而发现的技巧
思考:如何判断一个点的价值
解决方案(可以利用多种方法进行比较或者尝试):在棋盘上,一个点有
四个方向,横竖左斜右斜。但电脑要在这里下棋时候,就会先判断在这四个方向
上的总价值是多少。
举个例子,点一在这里可以形成连五,那么价值就是 10000,点二只能形成
活四,那么这个点的价值就是 5000。所以电脑在判断完所有的点后,会选出一
个价值最大的点下。比如点一。
附.五子棋的一些术语:连五,活四,活三,活二,眠四,眠三,眠二
是否达到预期目标:是
2、碰到的某个错误而尝试的方法
思考:
解决方案(可以利用多种方法进行比较或者尝试):
反思:
3、设计完成后的体会
虽然是 python 的程序,期间也参考了很多其他的东西。通过这次程序设计
的过程,让我渐渐体会到了编程的博大精深。以及怎么学习编程语言,怎么使用
python 面向对象程序设计思想,怎样对问题进行解决和运用 Python,查找 Python
的使用都用了更进一步的理解。
对于 Python 中的引用,初始化类等,开始我并不是非常的理解,知道就这
么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。但是真
正的药用 python 去做一个东西不理解它是不行的,而且期间这课设涉及到了
Python 中的绝大数知识点,如 Python 异常处理机制,Python 输入输出流,等等。
要应用这些东西更要求我们去好好理解 Python 的这些规则。由于我们才刚刚开
始接触这一门课程,所以编码中运用了一些比较低级的代码,所以对于我们自己
3
来说,可能较为容易理解。但是理解了 Python 的规则要把这个课设做好也不是
那么容易,最难的部分是如何实现各个功能的划分和类的通讯问题。我们在这方
面就遇到了不少问题。
自己的编程习惯要加以改正,不能看到题目就开始写代码,应该完整按照软
件设计步骤:
1. 概要设计,主要包括:
1)结构设计
2)接口设计
3)全局数据结构设计
4)过程设计
2. 详细设计
这样写出的程序才有可读性和可修改性。
总结这次课设,我们还是受益匪浅的。虽然界面也不是很美观,有点功能间
的连接也做的不是特别好,但是我们能认识到自己的不足,并且在跟同学的交流
中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。
五、结论
结论回答下面几个问题:
1、是否完成程序预期设计目标?
是,还是比较圆满的完成设计目标,虽然中间遇见一些问题,但是还是
通过组员一起努力而完成了。
2、达到了什么效果?
虽然是一个简单的小游戏,但是还是可以和室友一起来下盘五子棋来玩
玩。
看起来有点简陋,但是至少是一个完整的程序。
3、还有哪些可以改进的地方?
这个小游戏的棋子的样子,会有点简陋,没那么美观。还缺少几个
关键功能:悔棋,游戏计步器,游戏时间的限制。这些功能只有在学完时间类操
作后才能具体实现以后学了更多的东西以后,可以进行改造一下我们的棋子,让
4
下棋的环境也不一样。
参考文献:
[1] 张若愚.Python 科学计算[M].北京:清华大学出版社,2012.
[2] 李高超.基于 PYTHON 是网络管理系统的设计与实现[D].北京邮电大
学.2013 年.
[3] 康计量.Python 语言的可视化编程环境的设计与实现[D].西安电子科技
大学.2012 年.
[4] 高昂.Python 语言的拓展应用[J].程序员,2019.
[5] 狄博;王晓丹.基于 Python 的面向对象程序设计课程教学[J];计算机科
学,2012 年.
附程序清单:
import os
"""
"""
五子棋
初始化模块 下棋模块 残局载入模块
|
获取坐标点模块 检查获胜模块
def check_win(row, col, current_user, piece, gomoku_board):
"""
检查当前玩家是否获胜
"""
# 判断此次落子后,当前用户有没有获胜
# 1.判断当前落子点所在横线上有没有形成五连
index = col
num = 0 # 相连的棋子数目
# 保持当前行不动,移动列
# 从当前棋子去数左边有多少个相连的相同颜色的棋子
while gomoku_board[row][index] == piece and index >= 1:
# 图形和现在的是一样的说
5
明是连在一起的
index -= 1
num += 1
# 然后从当前棋子从左到右去数有多少个相同颜色的棋子
index = col
while gomoku_board[row][index] == piece and index <= 15:
index += 1
num += 1
num -= 1 # 当前落子点计算了两次
if num >= 5:
print("恭喜玩家: {}, 获得胜利".format(current_user))
return True
# 2.判断当前落子点所在竖线上有没有形成五连
index = row # 保持当前列不动,移动行
num = 0
while gomoku_board[index][col] == piece and index >= 1:
index -= 1
num += 1
index = row
while gomoku_board[index][col] == piece and index <= 15:
index += 1
num += 1
num -= 1 # 当前落子点计算了两次
if num >= 5:
print("恭喜玩家: {}, 获得胜利".format(current_user))
return True
# 3.判断从左下到右上的对角线上有没有五连
# 先往右上走
x = row
y = col
num = 0
while gomoku_board[x][y] == piece and x >= 1 and y <= 15:
x -= 1
y += 1
num += 1
# 再走左下
x = row
6
y = col
while gomoku_board[x][y] == piece and x <= 15 and y >= 1:
x += 1
y -= 1
num += 1
num -= 1 # 当前落子点计算了两次
if num >= 5:
print("恭喜玩家: {}, 获得胜利".format(current_user))
return True
# 4.判断从左上到右下的对角线上有没有五连
# 先往左上走
x = row
y = col
num = 0
while gomoku_board[x][y] == piece and x >= 1 and y >= 1:
x -= 1
y -= 1
num += 1
# 再往右下走
x = row
y = col
while gomoku_board[x][y] == piece and x <= 15 and y <= 15:
x += 1
y += 1
num += 1
num -= 1 # 当前落子点计算了两次
if num >= 5:
print("恭喜玩家: {}, 获得胜利".format(current_user))
return True
return False
def get_point(current_player, gomoku_board):
"""
从用户输入中获取一个合法坐标点,并对错误的输入进行提示
"""
while True:
point_str = input("当前玩家[{}], 请落子(输入横纵坐标表示落子, 输入 quit 保存
退出".format(current_player))
if point_str == 'quit':
# 用户输入进来的以一个字符串
# 玩家退出
return None, None
7