一、设计目的:

1.1 课程设计教学目的

本课程设计是本专业的一门重要实践性教学环节。在学习了专业基础课和《Python程序设计》课程的基础上,本课程设计旨在加深对Python程序设计的认识,对Python语言及其语言生态有一个进一步的掌握和应用,学会运用Python标准库及外接相关库来解决实际问题的基本能力,培养和提高学生分析问题、解决问题的能力,尤其是提高学生使用Python为开发语言来进行问题描述、交流与思考的能力,为毕业设计和以后的工程实践打下良好的基础。

1.2 本课程设计具体目的

经过小组讨论分析,我们最终选择了“五子棋”作为本次课设主题。

五子棋起源于中国上古时期的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋。古代五子棋棋盘与围棋棋盘是通用的,直到1931年,才出现所谓五子棋专用棋盘,为十五路(15×15)棋盘。现在人们压力日益增大,需要劳逸结合才能获得更高的工作效率,工作之余的娱乐对于每一个人来说必不可少。五子棋这种娱乐方式容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

二、课程设计任务和要求

2.1 课程设计教学任务和要求

本次课程设计的主要任务是以Python为开发语言完成一个100~300行左右规模的程序项目开发。

课程设计的基本要求是:在课程设计的各个阶段严格、规范地完成相关的文档,例如在初期按时完成设计目的、设计要求、总体设计,在后期完成详细设计、调试与测试、设计总结等。要求能完成所选题目的主要功能,程序运行健壮、正确,代码要有详细注释,可读性好;所写文档结构合理、内容完整、叙述清晰。更高要求是:有创意、系统界面美观。

由于课程设计项目具有一定的综合性,鼓励具有不同特长和不同能力的学生互相组队。项目小组自己推荐一名组长,实行“组长负责制”。组长组织组员进行项目选题、任务分配、方案确定、方案设计、系统调试测试,组员分工协作。小组成员开展项目讨论,互相支持,形成协作意识。

2.2 本课程设计具体任务和要求

  1. 有图形界面,能够用鼠标进行操作。

  2. 能够进行五子棋游戏的基本操作,即玩家轮流落子。

  3. 能够对游戏结果进行正确的判定。

  4. 能够实现悔棋及认输等附加功能。

  5. 各项功能的展示与应用直观明了。

  6. 输出必要的提示信息让玩家更好地进行游戏。

三、总体设计:

基于Python的标准GUI库tkinter快速创建GUI应用程序。

运行程序提示可开始游戏。人人对战,二人轮流落子。界面显示提示信息当点轮到哪一方落子。先有五子“—”或“|”或“/”或“\”连成一线的玩家获胜。若棋盘中棋子已满,玩家均为完成五子相连则判定为平局。当黑方获胜或白方获胜或平局时及时作出判定,并弹出提示框,告知玩家当前对局结束。

3.1 小组成员及任务分配情况

组员:吴佳丽余叶钰刘璐瑶
任务分配:
:负责玩家操作模块设计,包括落子、悔棋及认输。
:负责游戏的可视化设计,包括游戏界面设计及棋盘设计。

棋盘设计部分包括运行程序开始游戏及重新开局时初始化棋盘。
:负责判定游戏结果即玩家胜负或平局判定

3.2 程序功能图

3.3 整体流程图

四、设计实现

4.1 最终实验结果

游戏主界面

启动程序运行游戏,弹出提示框,提示玩家游戏开始,黑方先进行落子。玩家可点击棋盘无棋子处进行落子。或点击“开局”、“悔棋”、“认输”按钮可重新开局或悔棋或认输。当点击“开局/重新开局”按钮时,清空棋盘中的棋子,展示处与启动程序相同的游戏界面。界面中间“黑方”与“落子”二处文字为游戏进行中的提示信息,表示当前轮到黑方进行棋子放置。轮到白方落子时会“黑方”将自动更改为“白方”,“白方”二字以白色显示。如图4-1所示。


玩家获胜后界面

如图4-2所示,若有一方玩家存在“—”或“|”或“/”或“\”五子相连,该玩家取得该局游戏胜利。以图中所示情况——黑方“/”五子相连为例,说明玩家取胜结果。通过黄色线条将黑方连成一线的五颗棋子相连接,此时界面中间提示信息改为“黑方获胜”,“获胜”二字以红色显示。并弹出消息提示框,提示玩家游戏结束黑方完成五子相连,取得胜利。若此时点击悔棋按钮,将提示玩家此时不能悔棋。如图4-3所示;点击认输按钮,将提示玩家点击开局开始游戏,如图4-4所示。


平局情况

当玩家双方都没有完成五子连线,且棋盘中所有棋格都有棋子放置即无处置放棋子时,判定为平局。

为更方便展示,将棋盘改为5*5大小。如图4-5所示,中间提示文字变更为绿色字样“平局??!”,同时弹出消息提示框,提示玩家当前对局结束,双方达成平局。此时游戏结束,玩家不可再悔棋或认输,若玩家点击悔棋或认输按钮,效果与有一方玩家获胜时相同。即游戏界面不做改变,弹出消息提示框,该消息提示框与图4-3、图4-4中消息提示框相同,不再重复展示。


玩家认输

在一局游戏过程中,若玩家首次点击认输按钮。棋盘不做改变,游戏界面中间文字“落子”变为“认输”如图4-6所示。此时游戏结束,玩家不可再悔棋或认输,若玩家点击悔棋或认输按钮,效果与有一方玩家获胜时相同。即游戏界面不做改变,弹出消息提示框,该消息提示框与图4-3、图4-4中消息提示框相同,不再重复展示。

玩家悔棋

游戏过程中,若一个回合内该玩家首次进行悔棋,取回该玩家刚放置到棋盘上的棋子,并将中间的提示信息“某方落子”改回到该玩家。以黑方悔棋为例,悔棋前及悔棋后游戏部分界面分别如图4-7、图4-8所示。若该玩家在一个回合内已经进行过悔棋操作,再次点击悔棋按钮,则不改变游戏界面及棋盘,但回弹出提示框此时不能悔棋,该消息提示框及提示信息与获胜时点击悔棋按钮,即图4-4中的提示框相同。

4.2 实验结果评价

窗体界面直观明了,游戏过程中有适当的提示信息有助于玩家更好的进行游戏。同时窗体的颜色搭配即窗体大小设置合适。玩家不会因游戏界面颜色冲击或棋盘、文字信息等过大过小产生疲劳。程序能对游戏结果进行正确的判定,悔棋及认输这两个附加功能也能够实现。课程设计最初定下的功能和要求均能实现。在此基础上,玩家完成五子相连时用黄色线条标记,让玩家能有更好的体验。还加上了一个回合内只允许玩家各悔棋一次,增加挑战,让游戏更加有趣。

小组超额完成了最初想要实现的功能和要求,所以我们给自己评价为优秀!

当然这个小程序也很多不足之处。例如没有标记出最后放置的棋子,玩家悔棋后也没有标记出悔棋前的棋子等等。我们往后也应努力学习,做的更好。

五、详细设计

5.1 模块设计

所负责部分大致可分为三大模块。首先,判断游戏胜负的四种情况,即横、竖、斜方向五子一线;其次,判断棋盘是否可以继续下棋,即是否平局;最后,判断玩家输赢,并弹出提示框。

5.2 程序流程图

5.3 具体算法分析

引用tkinter库

from tkinter import*
from tkinter import messagebox

Tkinter库:

Tkinter是Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、简单的图形界面可以由Tkinter 库完成。

Messagebox 函数分析:

函数定义:<整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType);

函数功能: 弹出一个消息框。

参数:

Text <字符串>,消息框的正文;
Title <字符串>,消息框的标题;
nType <整型>,消息框的类型。

返回值:<整型>,用户在消息框上点击关闭时的选择的按钮。

说明:

nType对应的对话框如下表所示:

  • 0: 确定

  • 1: 确定,取消

  • 2: 终止,重试,忽略

  • 3: 是,否,取消

  • 4: 是,否

  • 5: 重试,取消

  • 6: 取消,再试一次,继续

返回值对应的值如下:

  • 1: 确定

  • 2: 取消

  • 3: 终止

  • 4: 重试

  • 5: 忽略

  • 6: 是

  • 7: 否

  • :再试一次

胜负情况判断:

自定义panduan()函数并利用for语句循环,判断棋子是否为横、竖、斜五子连线,列表QP[a][b]中必须满足 0 <= a,b <= 17,i、j必须严格控制。若有五子连线情况发生,在棋子上增加一条黄色标记线贯穿五子,更易看出。

代码如下:

def panduan():iswin = 0 #标记是否有一方完成五子相连,0代表否for i in range (num-4):for j in range (num):    #判断是否出现有一方"—"五子相连If QP[i][j]==QP[i+1][j]==QP[i+2][j]==QP[i+3][j]==QP[i+4][j] != -1:iswin=1     canvas.create_line(mesh*(i+1)-Qr/2,mesh*(j+1),mesh*(i+5)+Qr/2,mesh*(j+1),fill="yellow")win()
for i in range (num):for j in range (num-4):  #判断是否出现有一方"|"五子相连   if QP[i][j]==QP[i][j+1]==QP[i][j+2]==QP[i][j+3]==QP[i][j+4] != -1:iswin=1               canvas.create_line(mesh*(i+1),mesh*(j+1)-Qr/2,mesh*(i+1),mesh*(j+5)+Qr/2,fill="yellow")win()for i in range (num-4):for j in range (num-4):  #判断是否出现有一方"\"五子相连           if QP[i][j]==QP[i+1][j+1]==QP[i+2][j+2]==QP[i+3][j+3]==QP[i+4][j+4] != -1:iswin = 1
canvas.create_line(mesh*(i+1)-Qr/2,mesh*(j+1)-Qr/2,mesh*(i+5)+Qr/2,mesh*(j+5)+Qr/2,fill="yellow")win()for i in range (num-4):for j in range (4,num):  #判断是否出现有一方"/"五子相连if QP[i][j]==QP[i+1][j-1]==QP[i+2][j-2]==QP[i+3][j-3]==QP[i+4][j-4] != -1:iswin=1                canvas.create_line(mesh*(i+1)-Qr/2,mesh*(j+1)+Qr/2,mesh*(i+5)+Qr/2,mesh*(j-3)-Qr/2,fill="yellow")win()

函数及语句分析:

for循环:

作用:for循环语句是python中的一个循环控制语句,任何有序的序列对象内的元素都可以遍历,比如字符串、列表、元组等可迭代对像。

一般格式:第一行是要先定义一个赋值目标(迭代变量),和要遍历(迭代)的对像;首行后面是要执行的语句块。
for 目标 in 对像:
print赋值目标

循环过程: i相当于目标,range(num)是遍历对像。当运行for循环语句时,每一次迭代时,i都会从遍历对像range(num)中接收一个新值输出。结束循环后,目标i会保留最后一个值

Canvas组件:

Python Tkinter 画布(Canvas)组件和 html5 中的画布一样,都是用来绘图的。可以将图形、文本、小部件或框架放置在画布上。canvas.create_line()主要实现的是画一条直线,后面()中给的参数就是线段两点的坐标,两点确定一条直线。

Canvas 组件支持以下标准选项:

arc 创建一个扇形

coord = 10, 50, 240, 210
arc = canvas.create_arc(coord, start=0, extent=150, fill="blue")

image 创建图像

filename = PhotoImage(file = "sunshine.gif")
image = canvas.create_image(50, 50, anchor=NE, image=filename)

line 创建线条

line = canvas.create_line(x0, y0, x1, y1, ..., xn, yn, options)

oval 创建一个圆

oval = canvas.create_oval(x0, y0, x1, y1, options)

polygon 创建一个至少有三个顶点的多边形

oval = canvas.create_polygon(x0, y0, x1, y1,…xn, yn, options)

判断是否平局

分析:定义一个列表boring记录每个棋格的状态,包括棋格是否有棋子,若有棋子是为黑棋还是白棋。For循环语句遍历棋盘(列表QP[a][b]中必须满足 0 <= a,b <= 17,i、j必须严格控制),当棋盘中不存在无棋子的棋格且双方均未完成五子连线,判定为平局并弹出提示框。

代码如下:

 boring=[]   #遍历棋盘,记录每个棋格状态for i in range(num):for j in range(num):boring.append(QP[i][j])if -1 not in boring and iswin != 1:  print(messagebox.askokcancel('游戏结束','旗鼓相当!平局!'))

append()函数

描述:append() 方法用于在列表末尾添加新的对象。

用法: list.append(obj) obj为添加到列表末尾的对象

返回值:该方法无返回值,但是会修改原来的列表。

本例应用:

boring.append(QP[i][j])

作用是将最新遍历的棋格状态添加到boring列表最后。

输出分析

输出提示框,显示游戏结束,旗鼓相当!平局!

print(messagebox.askokcancel('游戏结束','旗鼓相当!平局!')

函数分析:

messagebox.askokcancel()是tkinter库中的一个组件,用来设置一个消息框。

askokcancel()设置对话框的主要文本内容,可以用’\n’来实现换行

返回值为Boolean类型。

判断玩家输赢

分析:判断黑子还是白子获胜,弹出提示框,显示“游戏结束,黑方五子相连!获胜!”或“游戏结束,白方五子相连!获胜!”。

变量设置:global设置全局变量stop,hq。其中tag为之前定义的,tag标记执棋方,0代表黑方,1代表白方 ;stop标记游戏状态,0代表游戏进行中,1代表游戏结束;hq标记是否可悔棋,0代表不可以,1代表可以。

代码如下:

def win():global stop,hqa.config(text=key[(tag+1)%2],fg=color[(tag+1)%2])b.config(text = "获胜",fg='red')stop,hq = 1,0 #决出胜负后游戏结束,不可悔棋if tag == 0:r=messagebox.askokcancel('游戏结束','白方五子相连!获胜!')else:r=messagebox.askokcancel('游戏结束','黑方五子相连!获胜!')
print(r)

前要:

 a = Label(tk,text=key[tag],fg=color[tag],bg = "pink",font = ("楷体", "18", "bold"))b = Label(tk,text= "落子" ,fg=color[tag],bg = "pink",font = ("楷体", "18", "bold"))

函数分析:

a.config(text=key[(tag+1)%2],fg=color[(tag+1)%2])
b.config(text = "获胜",fg='red')

通过tag判断棋子的颜色,弹出的消息框中获胜的字体为红色。

六、调试与测试

6.1 调试方法

logging 调试法

把print()替换为logging,logging不会抛出错误,而且可以输出到文件。

它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,level=WARNING后,debug和info就不起作用了。这样一来,就可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方。

启动Python的调试器pdb

使用pdb进行调试,pdb是python自带的一个包,为python程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

pdb常用命令如下:

图6-1 pdb常用命令表

步骤如下:

[1]让程序以单步方式运行,可以随时查看运行状态。
[2]以参数-mpdb启动后,pdb定位到下一步要执行的代码->s=‘0’。输入命令l来查看代码
[3]输入命令n可以单步执行代码
[4]任何时候都可以输入命令p变量名来查看变量
[5]输入命令q结束调试,退出程序

6.2 测试结果分析与讨论

黑子右斜五子连线,黑方获胜

黑方五子竖连线,黑方获胜

黑子左斜五子连线,黑方获胜

白子五子横连线,白方获胜

基于Python实现的五子棋游戏设计相关推荐

  1. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  2. 基于python的飞机大战游戏设计与实现

    基于python的飞机大战游戏设计与实现,采用MySQL+pygame+Tkinter实现飞机大战游戏,主要功能有注册+登录+游戏初始化(开始游戏+游戏操作说明+版权信息)+游戏主界面[设置敌机种类并 ...

  3. 基于安卓Android的五子棋游戏设计与实现

    下载地址 本论文主要阐述以面向对象的程序开发语言,Eclipse为开发工具, 基于智能手机Android系统之上设计的一个五子棋游戏.五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力提高智 ...

  4. 基于python的飞机大战游戏设计

    第1章 绪论 1.1研究的背景及意义 当今社会是一个信息社会.自从世界上第一台计算机问世以来,计算机行业飞速发展.随着以全球信息网络普及和全球信息共享为标志的"全球信息网络革命"的 ...

  5. 基于C语言的五子棋游戏设计与实现 课程报告+项目源码及可执行exe文件

    资源下载地址:https://download.csdn.net/download/sheziqiong/85680476 资源下载地址:https://download.csdn.net/downl ...

  6. python飞机大战功能模块图_基于Python的飞机大战游戏设计

    第 2 3 卷 第 1 期 2019年 3 月 扬 州 职 业 大 学 学 报 Journal of Yangzhou Polytechnic College Vol .23 No . 1 Mar . ...

  7. 基于Python所写的飞鸟游戏设计

    https://blog.csdn.net/qq_64505944/article/details/131493838?spm=1001.2014.3001.5502

  8. android五子棋设计模板,基于android的五子棋游戏设计

    内容介绍 原文档由会员 hfnmb 发布 基于Android的五子棋游戏设计 软件工程 [摘 要]本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一 ...

  9. ​基于STM32F407的五子棋游戏设计​

    本博客为资源:基于STM32F407的五子棋游戏设计内的说明文档. 目录 一.设计目标 三.设计方案 1.游戏模式 2.游戏过程 3.游戏设计 四.硬件配置 1.TFT-LCD液晶屏模块 (1)工作原 ...

最新文章

  1. 接口隔离原则最直白描述
  2. 【Android 逆向】Android 权限 ( adb 降权相关的属性 | ro.secure 属性 | ro.debuggable 属性 | service.adb.root 属性 )
  3. C#中WinForm程序退出方法技巧总结
  4. 天池 O2O 优惠券使用预测思路解析与代码实战
  5. php5.6.16,OSX 10.11 中重新编译PHP5.6.16问题
  6. javascript 点点滴滴01章 javascript的认知
  7. GitHub 一周热点速览:前后端最佳实践
  8. MMU页表的内存消耗
  9. 网络工程制图论文计算机,计算机工程制图设计分析论文
  10. 简述ip地址的abc类如何划分_网络IP地址“主要”分为ABC三类
  11. 【小程序源码】游戏助手王者荣耀战力查询,游戏扫码登录器等
  12. centos6.5配置静态IP 时,出现BCAST不能设置的问题
  13. 带遮挡效果的轮廓线(描边)在3D实时渲染中的一种实现
  14. Python 100道基础入门练习题(附答案)【这期完结】
  15. ios9系统无法下载应用问题分析与解决
  16. 用turtle画奥运五环
  17. SRRC认证全面解析
  18. 优恩解答GDT放电管是怎么工作的
  19. 被限制出县城_5种人不被批准出境 芜湖县今年阻止14人
  20. Rust 常用 trait 实现

热门文章

  1. 郑州计算机中专学校排名,郑州中专院校排名_2021公办中专较新排名
  2. 36大数据——《数据可视化的魅力》
  3. 创业思维 - LeanCloud的故事
  4. vue div自适应高度
  5. 实验 4 电磁波的传播与辐射
  6. 多pass毛发制作愤怒的小鸡儿
  7. Unity3D中开发2D游戏——游戏玩家的出生、无敌、死亡方法
  8. 6G及太赫兹关键技术
  9. java程序添加背景音乐
  10. VIN码含义及其算法