数据结构课程设计报告四子棋剖析.docx
- 文档编号:25780606
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:17
- 大小:569.63KB
数据结构课程设计报告四子棋剖析.docx
《数据结构课程设计报告四子棋剖析.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告四子棋剖析.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告四子棋剖析
韶关学院计算机科学学院
数据结构课程设计
题目:
四子棋
学生姓名:
刘晓锋
学号:
11115011038
专业:
计算机科学与技术
班级:
11级
(1)班
指导教师姓名及职称:
陈正铭讲师
起止时间:
2013年3月——2013年5月
1需求分析
1.1课题背景及意义
全球在使用的移动电话已经超过10亿部,而且这个数字每天都在不断增加。
手机在作为一种便携通信工具的同时,它的功能也在不断的丰富,进而推进手机游戏的发展。
根据《2012手机游戏用户行为分析报告》,随着智能手机的普及和手机性能的提高,手机上的终端应用越来越丰富,作为手机上的重要的娱乐应用,手机游戏市场也在快速成长,越来越多的用户通过手机游戏来打发无聊的时间,其中76%的用户单次玩手机游戏都在30分钟左右。
结合个人水平和兴趣爱好,本人将借本次课程设计机会设计一款休闲娱乐型的四子棋游戏,在娱乐自我,锻炼编程设计能力的同时,希望也借此给身边的朋友们带来快乐。
1.2课题要求
A.支持android手机的四子棋游戏
B.设计一个7*6棋盘大小的四子棋双人对战游戏程序,先四子连线(横、纵、斜)者胜。
C.选做内容:
支持棋局录制与重放--悔棋和新开功能,图形化操作界面
1.3软件格式规定
A.程序所能达到的功能:
正确判断输赢并有相应的语音和文字提示
B.测试的数据:
1)、正确的输入:
提示:
蓝棋赢,并将蓝棋变为另外一种颜色--天蓝和响起赢局的音乐
2)、用户误输入:
提示:
亲,我的悔棋能力有限啊!
1.4设计目标
A.软件名称:
FourInALine(四子棋)
B.软件组成:
FourInALine.apk(android系统应用程序)
C.制作平台及相关调试工具:
Eclipse;AndroidSDK
D.运行环境:
android手机/winxp/win7(PC平台必须具有AndroidSDK)
E.性能特点:
(1)软件由两个可执行文件组成,各具特点:
FourInALine.apk为android系统应用程序,体积小,界面友好,使用方便。
(2)方便重新开始游戏和悔棋。
(3)判赢用时少。
(4)个别其他功能可进行再扩展。
2概要设计
2.1问题解决的思路概述
首先是确定结构化程序设计的流程图,利用已存在的数据结构来构造一个存储棋盘的结构,接着把游戏实现分成六个主要的模块:
实现悔棋的模块、实现新开的模块、实现音乐的模块、实现绘图的模块,实现控制线程的模块,实现判赢的模块,然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能。
最后,编写main主函数以实现游戏的可玩性和正确性,调试程序并将不足的地方加以修改。
总而言之,就是先用自顶向下、逐步细化的设计方法来分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法来写出程序。
2.2相关函数介绍说明
在android版本程序定义一个用于存储棋盘的二维数组变量:
privatestaticint[][]ChessBoardState;[1]
(1)android版本程序下定义的主要函数
publicbooleanisWin(intx,inty)//判断赢家,采用遍历最后下的棋子在8个方向上的棋子
publicvoidback(Contextcontext)//悔棋函数
publicvoidplay()//游戏主线程
publicvoidsetXY(MyBackChessStatemyBackChessState)//处理栈顶元素
publicRectgetRect(int[]xy)//标记二维数组对应的矩形区域,也即是棋子该下的位置
publicRectgetRect(intx,inty)//标记二维数组对应的矩形区域,也即是棋子该下的位置
privateint[]getIndexofXY()//获得当前坐标在二维数组中对应的索引。
XY[0]是横坐标,也即是棋盘的第某列数;XY[1]是纵坐标,也即是棋盘的第某横。
privateintsearchEmptyTopTile(intx,int[][]chessboardstate)//返回当列最上方无棋子的坐标,也即是棋盘的第某横.
publicvoidsetChessBoardState(int[][]ChessBoardState)//保存棋盘状态
publicDrawGraphgetChessBoardView()//获得绘图实例
publicvoidsetWinner(intplayer)//设置赢局提示(提示对应玩家赢)
publicvoidnextplayer(intplayer)//设置下一玩家
publicvoidnewGame(Contextcontext)//触发开始新游戏
publicbooleanonTouch(Viewv,MotionEventevent)//绑定棋盘的触摸事件
publicstaticvoidplay(Contextcontext,intresource)//播放音乐
privatevoidupdateView(Canvascanvas)//更新游戏界面
publicvoidshowChess(Canvascanvas,intplayer,Rectrect)//设置当前玩家的棋子
publicvoidshowLastChess(Canvaschess,intplayer,Rectrect)//显示最后下的棋子
publicvoidclearView(Canvascanvas)//清空整个棋盘视图
privatevoidinit()//初始化视图
publicstaticBitmapgetBitmapFromResId(Contextcontext,intresId)//获得棋盘图片资源
publicstaticBitmapzoomBitmap(Bitmapbitmap,floatwidth,floatheight)//缩放棋子图片资源
2.3主程序的流程基函数调用说明
(1)主程序的简要流程图
图1主程序流程图
(2)各程序模块之间的层次(调用)关系
调用“findViews()”和“initViews()”方法绑定各个控件,以便调用相应的活动界面,然后调用各模块进行游戏。
在每一个功能模块中都几乎涉及到棋盘数组的存取,所以都要调用“getChessBoardState()”对数组变量初始化。
实现音乐的模块“Music”类,首先要创建一个音频播放实例,然后启动它。
在游戏运行中根据其他模块是否调用其stop()方法或重新调用其play()方法。
音乐模块流程图如下:
图2音乐模块流程图
实现控制线程的模块“Control”类,首先要调用getIndexofXY()方法计算用户点击的视图坐标对应的棋盘二维数组坐标。
若此次点击有效,调用悔棋模块存储此次操作和调用判赢模块的isWin()方法判断胜负,若赢局出现就再调用音乐模块。
最后调用绘图更新整个游戏视图。
若此次点击无效,直接返回。
控制线程模块流程图如下:
图3控制线程模块流程图
实现判赢的模块“Winner”类,首先调用“isWin()”方法判断是否有赢局出现,然后在游戏运行中根据其他模块是否调用其getSameChess()方法来设置相同棋子或调用updateSameChess()方法来重置Winner类中的静态变量。
控制线程模块流程图如下:
图4判赢模块流程图
实现绘图的模块“DrawGraph”类,首先调用“onDraw()”以实现视图初始化和棋盘绘制。
然后再调用控制线程模块的getRect()方法获取棋子应下的位置,接着调用getXY()方法和showLastChess()方法设置最后下的棋子。
若有赢局出现,则调用判赢模块的getSameChess()方法来设置相同棋子。
控制线程模块流程图如下:
图5绘图模块流程图
实现悔棋的模块“BackChess”类,首先调用“back()”判断当前栈是否为空,是则弹出提示信息并退出。
否则弹出栈顶元素,重新赋值为0。
然后调用控制线程模块的getChessBoardView()方法获得DrawGraph的实例,用于更新棋盘。
最后调用控制线程模块的setXY()方法设置上一棋子的坐标。
控制线程模块流程图如下:
图6悔棋模块流程图
实现新开的模块“New”类,首先调用“newGame()”新建棋盘数组,然后调用控制线程模块的setChessBoardState()方法对棋盘数组进行重新初始化,然后调用控制线程模块的getChessBoardView()方法获得DrawGraph的实例,更新棋盘。
接着调用悔棋模块的clearStack()方法清空原先栈中元素。
最后调用判赢模块的updateSameChess()重置静态变量和音乐模块的play()方法重启背景音乐。
新开模块流程图如下:
图7悔棋模块流程图
3详细设计
3.1棋盘存储的实现
棋盘的大小一般都是固定的常量,所以可以用二维数组来存储棋盘的状态,其结构简单且容易,是一种合理的数据结构。
二维数组定义如下:
privatestaticint[][]ChessBoardState=newint[ROW][COLUMN];
3.2各模块主要算法
在四子棋游戏的程序设计中,每一部分都会调用一些其他其它函数来辅助完成运算(例如:
对棋盘数组、当前玩家和棋盘视图的初始化,获取棋子应下的位置等),在这里主要说明四子棋游戏的程序设计,其它函数的程序设计和具体调用关系请查看程序清单。
3.2.1判赢算法的实现
判赢算法是基于玩家棋子最后下的位置来进行运算,此算法在计算时分8个方向分别进行局部遍历。
为此,我设计了8个for循环,一开始默认相同棋子数为1,然后从紧邻当前棋子的棋子开始遍历,若遍历经过的棋子是当前玩家的棋子,则相同棋子数+1,否则结束此方向的遍历。
每遍历完同一直线上的两个方向则进行一次判断,判断相同棋子数是否>=4。
是则返回true,否则进入其他方向的遍历。
若所有方向均遍历完后,相同棋子数未能>=4就返回false。
图8判赢算法原理图
在算法设计时应注意:
每个方向起始遍历的下标;
每个方向遍历的边界;
每遍历完一条直线方向得重置相同棋子数为1。
3.2.2悔棋算法的实现
悔棋借用了栈结构,在栈中保存棋子在棋盘二维数组中的坐标。
在设计此算法时,我定义了一个保存坐标数组的栈,将x和y坐标打包成数组来存入栈。
由于使用栈会出现栈空的现象,所以在程序设计时应注意:
在出栈前确保栈未空;
在结合显示最后棋子功能时,当栈为空时,要特别处理显示上一棋子的位置。
3.3函数调用关系图
此函数调用关系图以android版本应用程序来进行说明。
此函数调用关系图主要描述了四子棋游戏的实现及实现各运算所要调用的函数,详情还请看程序清单。
图9函数调用关系图
4调试分析
表1调试过程情况表
序号
时间
出现问题
解决方法
1
2013-3-20
想new一个更新棋盘的类,在传参时无法驾驭context参数
将一个系统获得的更新棋盘的实例传给主控制线程,在主控制线程中调用更新View的方法postInvalidate()
2
2013-3-26
调用getIndexofXY()后,提示超出数组索引
对getIndexofXY()处理后的数据进行判断,不对无用数据进行操作
3
2013-3-26
在设置最后下的棋子时,栈提示空值异常
当栈为空时,将上一棋子的坐标设为空,在取坐标时,不对空值数据进行操作
4
2013-3-29
计算棋子应下位置时,棋子位置未能与棋盘相匹配
重新计算棋子位置的公式,添加棋盘边沿的偏移量
5
2013-4-4
计算下一玩家时,公式出错
重新计算下一玩家的公式,关键是初值的设置
6
2013-4-8
判赢算法在重新开始游戏时出错,即相同棋子数未能>=4均提示玩家赢
重置相同棋子数的值为1,或限制此变量的作用域
7
2013-4-8
赢局出现后依旧可以下棋
设置赢局开关,赢了为true,否则为false
8
2013-4-16
重新开始游戏时,玩家顺序紊乱
重置当前玩家的值为0
9
2013-4-27
重新开始游戏时,栈中元素异常,一直有悔棋成功的提示
当重新开始游戏时,清空栈中元素
10
2013-5-4
更新视图时进入死循环
在绘图模块中移除postInvalidate()方法
5用户使用说明
5.1android版本应用程序操作说明
(1)运行FourInALine.apk应用程序后会出现主界面:
图10主界面效果图图11开始游戏效果图图12游戏介绍效果图
(2)用户点击相应的功能按钮:
开始游戏、游戏介绍、退出游戏进入相应界面。
用户可以点击返回键回到主界面。
(3)用户在游戏过程中,若想悔棋时可以点击悔棋按钮,程序会进行相应的操作。
当然,若想重新开始游戏可以随时点击新开按钮。
6测试结果
6.1windows版本应用程序测试结果:
图13赢局效果图
图14悔棋效果图
图15栈空时悔棋效果图
参考文献
[1]严蔚敏,李冬梅,吴伟明等.数据结构[M].北京:
人民邮电出版社,2012.19-24.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 四子棋 剖析