数据结构课程设计报告--四子棋剖析
数据结构 马踏棋盘 设计报告
《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:姓名:院系:专业:年级:学号:指导教师:2011年月日目录1、程序设计的目的2、设计题目3、分析4、设计思想5、算法6、测试结果7、调试分析8、小结1、课程设计的目的1、熟练使用C++语言编写程序,解决实际问题;2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、学习并熟悉栈的有关操作;6、利用栈实现实际问题;2、设计题目【马踏棋盘】*问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。
要求每个方格上只进入一次,走遍棋盘上全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。
*测试数据:由读者指定,可自行指定一个马的初始位置。
*实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。
并探讨每次选择位置的“最佳策略”,以减少回溯的次数。
3、分析确定输入值的范围,输入马的初始行坐标X和Y,X和Y的范围都是1到8之间。
程序的功能是输出马走的步骤,要使马从任一起点出发,通过程序能找到下一个地点,然后遍历整个棋盘。
每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。
并探讨每次选择位置的“最佳策略”,以减少回溯的次数。
输出时可以用二维数组。
4、设计思想输入马初始位置的坐标。
将初始位置进栈,经过一个while循环,取出符合条件的栈顶元素。
利用函数,找出栈顶元素周围未被占用的新位置,如果有,新位置入栈;否则弹出栈顶元素。
象棋数据结构课程设计
象棋数据结构课程设计一、课程目标知识目标:1. 学生能理解并掌握象棋的基本数据结构,包括棋子的种类、棋盘的布局等;2. 学生能运用所学知识,构建并描述象棋棋局的状态;3. 学生能运用数据结构的概念,分析象棋棋局的变化过程。
技能目标:1. 学生能够运用编程语言,实现象棋棋局的基本数据结构;2. 学生能够通过编写代码,实现对象棋棋局的初始化、棋子移动等操作;3. 学生能够运用所学技能,解决与象棋相关的实际问题。
情感态度价值观目标:1. 学生通过学习象棋数据结构,培养对传统文化的兴趣和热爱;2. 学生在学习过程中,培养团队合作精神和解决问题的能力;3. 学生通过课程学习,认识到数据结构在解决实际问题中的重要性,增强对计算机科学的兴趣。
课程性质分析:本课程为计算机科学领域与传统文化相结合的课程,旨在通过象棋这一载体,让学生在学习数据结构的同时,了解和传承我国优秀的传统文化。
学生特点分析:本年级学生具备一定的计算机编程基础,对新鲜事物充满好奇,具备较强的学习能力和动手能力。
教学要求:1. 结合学生特点,注重实践操作,让学生在动手实践中掌握知识;2. 强调团队协作,培养学生的沟通能力和合作精神;3. 注重启发式教学,引导学生主动思考,提高解决问题的能力。
二、教学内容1. 象棋基础知识:- 象棋的起源与发展简史;- 象棋的基本规则;- 棋子的种类及走法。
2. 数据结构基本概念:- 数据结构的重要性;- 常见的数据结构类型;- 数据结构在象棋中的应用。
3. 象棋棋局数据结构设计:- 棋盘的二维数组表示;- 棋子的数据结构设计;- 棋局状态的表示方法。
4. 编程实现象棋数据结构:- 使用编程语言(如C++、Python等)实现棋盘和棋子类;- 编写初始化棋局、棋子移动等函数;- 实现简单的棋局状态判断(如判断胜负)。
5. 象棋棋局案例分析:- 分析经典棋局的数据结构特点;- 通过案例,引导学生运用数据结构解决实际问题;- 探讨棋局变化与数据结构之间的关系。
数据结构课程设计报告模板
数据结构课程设计报告模板篇一:数据结构课程设计报告模板课程设计说明书课程名称:数据结构与算法专业:计算机科学与技术班级: 103013姓名:徐粤玲学号:03成绩:完成日期:XX年1 月 12日任务书摘要本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。
所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。
关键词:黑白棋编程设计s目录1.引言 ................................................ ................................................... .. (4)2.课题分析 ................................................ ................................................... (7)3.具体设计过程 ................................................ ....................................................8设计思路 ................................................ ...................................................8程序设计流程图 ................................................ (8)函数实现说明 ................................................ .. (12)4.程序运行结果 ................................................ ..................................................145.软件使用说明 ................................................ ..................................................186.结论 ................................................ ................................................... (21)参考文献 ................................................ ................................................... . (23)附录:源代码 ................................................................................................... .. 241.引言数据结构在计算机科学界至今没有标准的定义。
《数据结构》课程设计报告-运动会分数统计 一元多项式 迷宫求解 文章编辑 纸牌游戏等
《数据结构》课程设计报告-运动会分数统计一元多项式迷宫求解文章编辑纸牌游戏等南京林业大学数据结构课程设计报告专业:计算机科学与技术课程名称:数据结构姓名:学号:090801126指导老师:时间: 2011年1月目录要点:一.具体内容(题目) (1)二.需求分析(功能要求) (2)三.概要设计(程序设计思想) (3)四.详细设计(源代码) (6)五.调试分析(运行结果显示及说明) (31)六.课设总结 (34)题目1: 运动会分数统计**任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7,5,3,2,1,取前三名的积分分别为:5,3,2,;哪些取前五名或前三名由学生自己设定。
(m〈=20,n〈=20);题目2:一元多项式**任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加,相减,并将结果输入;题目4:迷宫求解任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;题目5:文章编辑**功能:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;题目6:Joseph环任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有的人出列为止。
设计一个程序来求出出列的顺序。
2题目7:猴子选大王**任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
数据结构课程设计报告--四子棋
韶关学院计算机科学学院数据结构课程设计题目:四子棋学生姓名:刘晓锋学号: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. 软件名称:Four In A Line(四子棋)B. 软件组成:FourInALine.apk(android系统应用程序)C. 制作平台及相关调试工具:Eclipse ; AndroidSDKD. 运行环境:android手机/winxp/win7(PC平台必须具有AndroidSDK)E. 性能特点:(1)软件由两个可执行文件组成,各具特点:FourInALine.apk为android系统应用程序,体积小,界面友好,使用方便。
四子棋需求分析
四子棋需求
一、需求
1、选中棋子[轮到当前方移子时方可选中,可以在选中一个棋子之后
转而去选择其他棋子]
2、移动棋子。
[在选中一颗棋子后,可以向相邻的空白节点处移动]
错误移动:
a)移动到棋盘边界以外
b)移动到有其他棋子的位置
c)移动距离超过一格。
如图
3、吃子:当移动棋子后,如果紧挨着的棋子时同色的,这条线上挨着
这颗棋子位置上有一颗不同颜色的棋子,另一个位置为空,则对方
棋子会被吃掉,也就是行棋一方若将两颗棋子移植一起,且一头挨
着对方的一颗棋子时,则可吃对方该子。
错误吃子:
1.1-1-1-0型不会吃棋。
2.1-1-0-0类型不会吃棋。
3.1-0-0-1类型不会吃棋。
二、规划
三、设计
流程图:
坐标转换
选定棋子
移动棋子:
吃子判断:
赢棋判断:
四、实践
五、总结
六、代码。
(完整版)数据结构毕业课程设计-五子棋
姓名:刘旭学院:计算机与通信学院班级:通信工程101班指导老师:文志诚目录一、需求分析 (3)1.1 开发背景 (3)2.2 功能简介 (3)二、系统设计 (4)2.1 函数一览 (4)2.2 “封面”的设计 (4)2.3 二维数组与控制台 (5)2.4 键盘操作 (6)2.5判定 (7)2.6 悔棋的实现 (8)三、调试运行 (9)3.1 进入界面 (9)3.2 棋盘的初始状态 (10)3.3 激战中...... .. (10)3.4 游戏结束 (11)四、解决问题的关键 (11)五、课设总结 (11)六、附录 (12)6.1 画图代码 (12)6.2 初始化 (14)6.3 Play函数 (14)一、需求分析1.1开发背景学习了数据结构该门课程,对于枯燥无味的理论知识,我们是否能够通过所学的知识在课程设计中做出有趣味东西,然后让我们对于数据结构更加的感兴趣呢?于是我和我的室友陈明建开始酝酿着写些什么东西。
上个学期就已经写了通讯录那之类的链式结构,这次我们决心有所改变,我们学习了栈、队列、树、图,字典树有人选了,我们就来写一个基于图的小程序,五子棋,对,图的简单应用,于是我们开始着手来写这个小小的程序,祝我们好运!2.2 功能简介既然是五子棋,我们要做的是时时刻刻的将整个图(以下称为棋局)的状态呈现出来,那么界面就是必不可少的。
MFC不会?没关系,我们就用基于控制台的字符输出来构建这个棋局吧,当然这只是第一步,详细如下:○1拥有一个良好的进入界面,以及必要的选项;○2拥有一个二维的数组来记录和更新实时的状态,并且能够有一种方法在DOS界面下绘制出整个棋局的实时状态(包括棋盘和棋子);○3能够通过键盘上的按键完成所选位置的移动和选定操作;○4能够在每一次的走棋后判定是否游戏结束(棋盘走满或者是一方胜出);○5能够完成悔棋的功能,并保证这之间的棋局绘图能够与二维数组数据同步,做到真正意义上的悔棋。
深圳大学计算机系统(1)实验报告4:四子棋
深圳大学计算机系统(1)实验报告4:四子棋简易版四子棋游戏设计学院计算机与软件学院专业指导教师报告人学号实验时间20XX年5月8日提交时间20XX年6月4日星期日教务处制一、实验目的与要求(1)分析和理解试验指定的问题;(2)掌握子函数的编写与使用;(3)利用LC-3的汇编代码设计实现比较复杂程序。
二、实验内容与方法实验内容:在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 * 6的网格组成。
游戏规则如下:两位选手依次轮流落子;选手不能悔棋;有子的地方不能继续落子;直到有一方的四个棋子能够连成一条水平线、垂直线或者是对角线;如果棋盘已满,无人获胜,则平局。
棋盘显示要求:游戏最初时应该打印空的棋盘,可以用ASCII码“-“ (即ASCII 码x002D)来表示该处为空,"O"(ASCII 码x004F)表示第一位选手的棋子,"X" (ASCII 码x0058)来表示第二位选手的棋子,为了让棋盘更易于观察,在各列间加一个空格,第6列之后不要添加。
初始棋盘如下:选手一始终先下第一步棋,然后两者轮流落子,在每次落子之后,应该打印该选手的信息,提示他落子,以选手一为例,应该打印信息如下:Player 1, choose a column:为了明确选手的落子的位置,该选手应该输入数字1-6,然后回车,数字1-6指示在落子所在的列,从左到右,无需输入行号,程序应默认从行号6到行号1递减的顺序填入该棋子,若前后输入的列号相同,则行号减一。
例如,如果选手第一次在左起第二列落子,应该输入2,然后回车,则该棋子落在行6列2处,当后面输入的列号再次为2时,则将棋子落子行5列2处,以此类推,详情见后续示例输出。
程序应该确保选手输入的数字对应正确的列的范围,如果输入不合理,应该输出一条错误信息,提示该选手继续输入,例如,如果对于选手一:Player 1, choose a column: DInvalid move. Try again.Player 1, choose a column: 7Invalid move. Try again.Player 1, choose a column:程序应该一直提示该选手,知道输入正确的数字,当用户输入完成,程序应通过显示回馈给选手,然后通过换行符(ASCII 码x000A)换行。
数据结构课程设计报告---井字棋游戏
课程设计报告课程设计名称:数据结构课程设计题目:井字棋游戏年级:专业:姓名:指导老师:完成时间:目录1. 课程设计任务 (3)2. 系统设计 (3)2.1设计目标 (3)2.2 模块划分 (3)2.3 设计思想 (3)3. 算法描述 (4)4. 测试结果 (12)5. 分析与探讨 (13)6、总结 (13)7. 参考文献 (13)附录1 课程设计人员任务安排 (14)附录2 考核评定 (15)附录3 程序源代码 (16)1、课程设计任务设计井字棋游戏,可以实现人机互动下棋,棋盘界面友好,操作方便,系统自动判别胜利失败或平局,游戏结束,返回初始界面。
2、系统设计1.设计目标:设计出棋盘界面,实现人机互动下棋,显示对局结果。
设计思想:首先玩家下棋,打印棋盘,来显示玩家下棋的位置然后将玩家下完的棋盘数组传给咱们的胜负判断函数进行判断(电脑下棋同理),ret变量接收返回来的值,如果是字符 C 则游戏继续,如果其他字符跳出循环,来进行相应的判断,判断玩家的胜负或者平局。
2.模块划分:开始游戏棋盘初始化人机博弈胜负判断3.设计思想开始界面玩家可以选择开始游戏或者退出游戏,如果选择进行游戏则开始棋盘初始化,棋盘打印函数输出一个空白棋盘,棋子的摆放利用二维数组,机器人的落子由srand函数和rand函数来输出随机数,利用while的循环函数来判断落子位置是否已经被棋子占据。
胜负判断设置iswin函数以及isfull函数,,使用了两个 for 循环,五个 if 判断语句,井字棋的输赢是看每一行是否有三个相同的棋子或者两条对角线线上是否有三个相同的棋子。
3、算法描述1.函数调用模块:game函数是核心,里面概括了棋盘打印,下棋方法,电脑下棋方法,以及胜负判断条件。
void game(){char ret = 0;//创建棋盘char board[ROW][COL] = { 0 };//初始化棋盘Initboard(board, ROW, COL);//打印棋盘Displayboard(board, ROW, COL);while (1){//玩家下棋Playermove(board, ROW, COL);Displayboard(board, ROW, COL);//判断玩家赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}//电脑下棋Computermove(board, ROW, COL);Displayboard(board, ROW, COL);//判断电脑赢ret = IsWin(board, ROW, COL);if (ret != 'C')break;}}if (ret == '*'){printf("你赢啦!\n");}else if (ret == '#'){printf("你输啦!真笨\n");}else{printf("平局\n");}}void menu(){printf("********************************\n");printf("********* 1.开始游戏 *********\n");printf("********* 0.退出游戏 *********\n");printf("********************************\n"); }void test(){int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择: ");scanf("%d",&input);switch(input)case 1:printf("井字棋开始了!\n");game();break;case 0:printf("已退出游戏!\n");break;default:printf("选择错误!请重新选择!\n");break;}} while (input);}int main(){test();return 0;}2.棋盘初始化:使用二维数组的数据结构来建立一个棋盘void Initboard(char board[ROW][COL], int row, int col) //初始化棋盘{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = ' ';}}}3.棋盘打印函数:构建一个简单的3*3棋盘轮廓void Displayboard(char board[ROW][COL], int row, int col) //打印棋盘{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < col - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}4.游戏进行中:(玩家下棋)void Playermove(char board[ROW][COL], int row, int col) //玩家下棋{int x = 0;int y = 0;printf("请玩家下子!\n");while (1){printf("请输入坐标:");//判断x,y坐标的合法性scanf("%d%d",&x,&y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标已被占用");}}else{printf("输入坐标非法,请重新输入!\n");}}}5.游戏进行中:(电脑下棋rand函数提供随机值)void Computermove(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("轮到电脑走!\n");while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}6.对局结果判断函数://返回1满了//返回2没满int IsFull(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' '){return 0;//没满}}}return 1;//满了}char IsWin(char board[ROW][COL], int row, int col){int i = 0;for (i = 0; i < row; i++){//判断一行上是否有三个相同的if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' '){return board[i][1];}}for (i = 0; i < col; i++){//判断一列上是否有三个相同的if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[1][i];}}//两条对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' '){return board[1][1];}if (1 == IsFull(board, ROW, COL)){return 'Q';}return 'C';}7.接受返回值并输出结果:while (1){//玩家下棋Playermove(board, ROW, COL);Displayboard(board, ROW, COL);//判断玩家赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}//电脑下棋Computermove(board, ROW, COL);Displayboard(board, ROW, COL);//判断电脑赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}}if (ret == '*'){printf("You Win!\n");}else if (ret == '#'){printf("You Lose!\n");}else{printf("No One Win!\n");}}8.头文件参考网上教程设置宏#include <stdio.h>#include <stdlib.h>#include <time.h>#define ROW 3#define COL 3void Initboard(char board[ROW][COL], int row, int col); void Displayboard(char board[ROW][COL], int row, int col);void Playermove(char board[ROW][COL], int row, int col); void Computermove(char board[ROW][COL],int row, int col); //1.玩家赢 "*"//2.电脑赢 "#"//3.平局了 "Q"//4.继续 "C"char IsWin(char board[ROW][COL], int row, int col);4、测试结果测试环境:vs2010测试用例:玩家输入坐标:(2,1)(2,2)(1,1)(1,2)测试结果:玩家失败电脑获胜5、分析与探讨在人机博弈的过程中,电脑只能随机确定棋子落位,无法自主将棋子放在最优位置,若要实现电脑的落子智能化,还需对于电脑下棋的过程中增添进一步的判断。
数据结构课程设计报告(井字棋)(大全)
数据结构课程设计报告(井字棋)(大全)第一篇:数据结构课程设计报告(井字棋)(大全)目录一、设计课题名 (1)二、设计目的 (1)三、问题描述及需求分析 (1)四、概要设计………………………………………………五、详细设计………………………………………………六、测试数据及测试结果…………………………………七、课程设计小结…………………………………………八、用户手册……………………………………………… 1 5 7 8一、设计课题名井字棋(人机对弈)二、设计目的1、课程设计是《数据结构》课程教学必不可缺的一个重要环节;2、通过课程设计加深课堂教学内容的理解和巩固;3、将《数据结构》课程的教学内容与解决实际问题结合起来,培养理论联系实际的学风;4、提高程序设计能力、培养自学能力;5、提高分析问题、解决问题的能力;6、提高收集资料、查找参考书的能力;7、锻炼书写报告的能力。
三、问题描述及需求分析本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个相同一方棋时,则判定一方胜利,若无此情形则为和局。
要完成此设计则需一判定胜负函数及一计算机自行落子函数,一旦这两个函数完成则此程序主要部分可完成。
四、概要设计完成此程序需一合理数据结构,因其为井字棋游戏程序则此结构中应包含一存储当前棋局的数组;又因计算机在判定在何位置落子最佳时,需一搜索树因而我在设计时设置了一PARENT域和CHILD域;除了主程序外,它还包括具有以下功能的函数:(1)棋盘初始化函数:void Init();(2)打印棋盘函数:void PrintQP();(3)用户输入落子位置函数:void UserInput();(4)判断当前棋局是否有一方获胜,并判断哪一方获胜的函数:int IsWin(State s);(5)评估函数值计算函数:int e_fun(State s);(6)极大极小值算法主函数:int AutoDone()。
数据结构_中国象棋_实验报告
数据结构课程设计报告——中国象棋姓名:林泽全学号:091402116 班级:09网络工程一、问题描述1.象棋概述象棋,又称中国象棋(英文现译作chess)。
在中国有着悠久的历史,属于二人对抗性游戏的一种,由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。
中国象棋是我国正式开展的78个体育运动项目之一,为促进该项目在世界范围内的普及和推广,现将“中国象棋”项目名称更改为“象棋”。
此外,高材质的象棋也具有收藏价值,如:高档木材、玉石等为材料的象棋。
更有文人墨客为象棋谱写了诗篇,使象棋更具有一种文化色彩。
2.棋子的初始棋位整个棋盘以“河界”分为相等的两部分。
为了比赛记录和学习棋谱方便起见,现行规则规定:按九条竖线从右至左用中文数字一至九来表示红方的每条竖线,用阿拉伯数字1只至9来表示黑方的每条竖线。
己方的棋子始终使用己方的线路编号,无论棋子是否“过河”。
对弈开始之前,红黑双方应该把棋子摆放在规定的位置。
任何棋子每走一步,进就写“进”,退就写“退”,如果像车一样横着走,就写“平”。
3.象棋棋子象棋是一种双方对阵的竞技项目。
棋子共有三十二个,分为红黑两组,各有十六个,由对弈的双方各执一组。
棋子种类说明如下表:帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红棋和黑棋而已。
4.棋子的走法➢帅(将)帅(将)是棋中的首脑,是双方竭力争夺的目标。
它只能在九宫之内活动,可上可下,可左可右,每次走动只能按竖线或横线走动一格。
帅与将不能在同一直线上直接对面,否则走方判负。
➢仕(士)仕(士)是将(帅)的贴身保镖,它也只能在九宫内走动。
它的行棋路径只有九宫内的斜线。
➢相(象)相(象)的主要作用是防守,保护自己的帅(将)。
它的走法是每次循对角线走两格,俗称“象飞田”。
相(象)的活动范围限于河界以内的本方阵地,不能过河,且如果它走的田字中央有一个棋子,就不能走,俗称“塞象眼”。
➢车车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,步数不受限制。
数据结构课程设计实验报告五子棋
湖南科技学院实验报告系部:计算机与通信工程系专业:软件工程姓名:范清文学号:201008003113班级:软件1001班课程名称:数据结构程序课程设计指导老师:卿武明实验项目:制作简单的五子棋课程设计目的:1:对本学期所学的专业知识进行实践运用2:制作五子棋并实现它的图示化实验环境:Visual C++6.0实验内容(算法、程序、步骤和方法):#include<iostream>#include<conio.h>using namespace std;int x,y,Step=0;bool flag=0;char Switch;char map[20][20][3]={ {"┌","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┬","┐"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"├","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┼","┤"}, {"└","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┴","┘"}}; char copymap[20][20][2];float Player[20][20][1];int Table[20][20] ,Showboard(),Play(),Interface(),Initboard(),Judgewin(),Deuce() ,Initdata();bool legal(),Overflow();int Interface(){char a;cout << "\n\n五子棋\n \t\t─\n 制作人:范清文(201008003113)\n\t\t────\n";cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;cout << " ~~ ~~" << endl;cout << " ~~ 1:人人对战~~" << endl;cout << " ~~ ~~" << endl;cout << " ~~ 2:退出~~" << endl;cout << " ~~ ~~" << endl;cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;cout << "\n 请选择:";cin >> a;if(a=='2'){cout << "\n谢谢使用!\n";cout << "按任意键退出!";getch();return 0;}if(a=='1'){Play();}return 0;}int Deuce(){for(int i=0;i<20;i++)for(int j=0;j<20;j++)if(Table[i][j]==0)return 0;return 1;}int Initboard(){Step=0;for(int i=0;i<20;i++)for(int j=0;j<20;j++){map[i][j][0]=copymap[i][j][0];map[i][j][1]=copymap[i][j][1];}return 0;}int CopyB(){for(int i=0;i<20;i++)for(int j=0;j<20;j++){copymap[i][j][0]=map[i][j][0];copymap[i][j][1]=map[i][j][1];}return 0;}int Judgewin(){int cx,cy,dx,dy;char a0=-95;char a1=-16;if(flag==0){a1=-15;}cx=x;cy=y;dx=x;dy=y;while(map[cx][cy][0]==a0&&map[cx][cy][1]==a1){cx--;cy--;if(cx<0||cy<0) break;}while(map[dx][dy][0]==a0&&map[dx][dy][1]==a1) {dx++;dy++;if(dx>15||dy>15) break;}if(dx>=(cx+6)||dy>=(cy+6)) return 1;cx=x;cy=y;dx=x;dy=y;while(map[cx][cy][0]==a0&&map[cx][cy][1]==a1){cx--;if(cx<0) break;}while(map[dx][dy][0]==a0&&map[dx][dy][1]==a1){dx++;if(dx>15) break;}if(dx>=(cx+6)) return 1;cx=x;cy=y;dx=x;dy=y;while(map[cx][cy][0]==a0&&map[cx][cy][1]==a1){cy--;if(cy<0) break;}while(map[dx][dy][0]==a0&&map[dx][dy][1]==a1){dy++;if(dy>15) break;}if(dy>=(cy+6)) return 1;cx=x;cy=y;dx=x;dy=y;while(map[cx][cy][0]==a0&&map[cx][cy][1]==a1){cx++;cy--;if(cx>15||cy<0) break;}while(map[dx][dy][0]==a0&&map[dx][dy][1]==a1){dx--;dy++;if(dx<0||dy>15) break;}if(cx>=(dx+6)||dy>=(cy+6)) return 1;return 0;}int Showboard(){system("CLS");cout << " ";for(int s=1;s<=20;s++){if(s>=10) cout << s<< "";else cout << s << " ";}cout << endl;for(int i=0;i<20;i++){printf("%2d",i+1);for(int j=0;j<20;j++)cout << map[i][j];if(i==6) cout << "退出:输入: 0 0 ";if(i==8) cout << "步数(Step):" << Step;if(i==10) cout << "请输入棋子的纵坐标、横坐标下子!" ;cout << endl;}return(1);}bool legal(){if((map[x-1][y-1][0]==-95&&map[x-1][y-1][1]==-16)||(map[x-1][y-1][0]==-95&&map[x-1][y-1][1]==-15)) return 0;elsereturn 1;}bool Overflow(){if(x>20||x<1||y>20||y<1){cout << "此位置不合法!请重新输入:";return 1;}elsereturn 0;}int Play(){Showboard();cout << "白方下:";while(cin >> x >> y){if(x==0&&y==0){Initboard();Interface();break;}if(Overflow()) continue;if(legal()){x--;y--;map[x][y][0]=-95;if(flag==1){map[x][y][1]=-16;Step++;Showboard();Deuce();if(Judgewin()){cout << "\n黑方胜利了!\n" ;cout << "游戏结束!再来一局?(y/n)";cin >> Switch;if(Switch!='n'){Initboard();Play();}else return 1;}cout << "白方下:";flag=0;}else{map[x][y][1]=-15;Step++;Showboard();Deuce();if(Judgewin()){cout << "\n白方胜利了!" << endl;cout << "游戏结束!再来一局?(y/n)";cin >> Switch;if(Switch!='n'){Initboard();Play();}else return 1;}cout << "黑方下:";flag=1;}}else{cout << "此位置已有子!请重新输入:";}}return 0;}void main(){CopyB();Interface();}数据记录与结果:课程设计结论:程序运行的很成功。
四子棋课程设计报告
交通学院计算15级C语言课程设计报告题目:四子棋游戏院(系、部) 信息科学与电气工程学院专业计算机科学与技术班级计算151学号 150811120姓名高伟指导教师克峰完成时间2016.3.3—2016.3.20成绩课程设计报告规课程设计任务书题目四子棋课程设计院 (部) 信息科学与电气工程学院专业计算机科学与技术班级 151学生高伟学号 1508111203 月 7 日至 3 月 20 日共 2 周指导教师(签字)负责人(签字)年月日目录1课程设计的任务及要求1.1设计任务1.2任务要求2程序设计思路2.1主程序及流程图2.2棋盘及棋子的绘制2.3判断胜负3程序测试3.1开始界面3.2输赢情况4程序中未能解决的问题5程序设计小结及心得摘要四子棋的程序中包含许多模块,其中有棋盘的绘制,棋子的绘制以及棋子坐标位置的计算,棋子胜负的算法等等,在主程序中需要将这些模块起来。
1. 课程设计的任务及要求1.1设计任务设计一个四子棋游戏程序,棋盘为12X11,先达到4子成一条线即结束游戏。
(该程序在DOS下运行)。
1.2任务要求(1)画出棋盘界面。
(2)定义键盘的功能,可以实现棋子左右移动及落子。
(3)棋子不能悬空,落子后不能再移动。
(4)人、人分别落子。
(5)用不同的颜色区分各方的棋子。
(6)撰写设计说明书及调试心得。
2.程序设计思路2.1主程序流程图程序主流程图:2.2绘制棋盘代码:void qipan(){int i,j;printf(" 退出请选择0! \n");printf(" ┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓\n");printf(" ┃⑴┃⑵┃⑶┃⑷┃⑸┃⑹┃⑺┃⑻┃⑼┃⑽┃⑾┃⑿┃\n"); printf(" ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫\n");for(i=10;i>=0;i--){printf(" ┃");for(j=0;j<=11;j++){if(L[i][j]==0)printf(" ┃");if(L[i][j]==2)printf("●┃");if(L[i][j]==3)printf("○┃");}if(i>0)printf("\n ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫\n");if(i==0)printf("\n ┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛\n"); }}2.3判断胜负胜负判断的算法:该算法的作用主要是判断玩家的落子后是否构成胜负关系,以及给出胜负的具体一方,该算法主要是通过一个二维数组来表示棋子的位置,通过计算某个棋子周围3个棋子的颜色来判断是否胜利。
数据结构课程设计跳棋问题
课程设计报告题目:实现人机对弈的跳棋学号:----------姓名:-----一.问题描述:编译一个玩家与电脑对弈的简单跳棋程序。
二.游戏规则:要求:1.玩家要先确定自己的棋子坐标。
2.确定完坐标在确定将下的位置,但是只能下对角。
3.当对角出现对方的棋子是则,可以将对方的棋子吃掉并且跳过棋子。
4.棋子不能向后走。
三.准备工作:由于考虑棋盘游戏,为此在我动手具体编制程序之前我们做了很多的前期准备工作,比如上网查阅资料,找些图书资料,以及分析不同语言编制的类似程序,对相关算法进行分析,比对,最终我们感觉程序类构造函数比较适合,而用C 语言和c++语言编写的程序比较通俗易懂,并且我们也比较熟悉用C和c++语言编程,所以我们选择用visual c++6.0实现这个程序.四. 分析与实现:在设计这个程序之前由于我们做了很多的前期准备工作,所以我们较快就进入了这个程序的具体的实现阶段。
主功能函数包含了整个游戏程序的函数,调用一个欢迎界面,然后打印棋盘,人机对弈的棋盘,然后人走棋,选择棋子(坐标),再选择即将落下地方的坐标,电脑走棋,如此往复,直至游戏结束详细介绍:首先,先画好棋盘,我们选择正方形棋盘,把棋子全部放置好,对面是电脑,把玩家棋子是‘O’,电脑的棋子‘X’,其中空白是可走的,*是不可走的,*放置的方法可以是横列坐标之积整除2,即i×j%2==0,用cout来输出,并且把坐标画上,上面数字是列,右边数字是行,交叉部分用‘+’表示。
画好棋盘后,接下来,考虑下棋的步骤,因为还要考虑吃棋子,所以先从走棋开始,开始玩家先走棋,玩家或者电脑选择了棋子后,会选择下棋的地方,电脑则是随机,玩家则是选择下的坐标,然后是考虑吃棋子,电脑是遍历棋子,选哪些能否吃棋子,能则吃掉对方的棋子,并跳过去,玩家则是选择一个棋子,如果能吃棋子则吃。
再有,在下棋的过程中,要用到清屏,头文件<stdlib.h>,其次,是不断的打印新的棋盘,这样才能观察玩家与电脑的对弈对应的函数成员re_disp()。
蒙特卡洛树_四子棋实验报告
四子棋详细实验报告实验算法:局部UCT算法对朴素的蒙特卡洛算法加速:更优化的算法,UCT算法。
以下是算法:给定一棵博弈树。
MCTNode nodes[MAXTREE];//蒙特卡洛树1) 从博弈树的根点开始向下搜索,执行2)。
2)遇到节点a(bestIndex)后,若a存在从未评估过的子节点,执行3),否则执行4)。
3) 通过蒙特卡洛方法imitate(int bestIndex) //模拟对局评估该子节点,得到收益值后更新该子节点至根节点路径上所有节点的平均收益值nodes[bestIndex].winRound++;//相应层的胜盘数加一nodes[bestIndex].totRound++;//总盘数加一,执行1)。
4)计算每个子节点的UCB值,将UCB值最高的子节点作为节点a,执行2)。
UCB=(double)nodes[index].winRound/((double)nodes[index].totRound +epsilon)+C*((double)log((double)nodes[fIndex].totRound+1)/((double )nodes[index].totRound+epsilon))+rand()*epsilon;5)算法可随时终止,达到给定时间后终止。
{int Best()//选择最佳落子点}根节点下平均收益值最高的子节点作为算法的输出。
(对于这个算法,有几点需要解释:1)博弈树的根节点指的是当前的局面。
2)评估过的节点及其平均收益值将在程序运行过程中保存及更新。
3)收益值设定合适的值。
做法是将其设为1(胜)或0(负)。
)详细说明蒙特卡洛算法:利用一维中的掷点法完成对围棋盘面的评估。
具体来讲,当我们给定某一个棋盘局面时,程序在当前局面的所有可下点中随机选择一个点摆上棋子,并不断重复这个随机选择可下点(掷点)的过程,直到双方都没有可下点(即对弈结束),再把这个最终状态的胜负结果反馈回去,作为评估当前局面的依据。
智能四子棋教学设计方案
一、教学目标1. 理解智能四子棋游戏的基本规则和策略。
2. 掌握使用人工智能算法进行四子棋游戏的方法。
3. 培养学生的逻辑思维能力和编程能力。
4. 提高学生解决实际问题的能力,增强团队协作精神。
二、教学对象初中或高中信息技术课程的学生,具备一定的计算机基础知识。
三、教学内容1. 四子棋游戏规则介绍2. 人工智能算法基础3. 四子棋游戏的人工智能实现4. 四子棋游戏的测试与优化四、教学过程第一阶段:四子棋游戏规则介绍(2课时)1. 讲解四子棋游戏的基本规则,包括棋盘、棋子、胜负条件等。
2. 通过实际操作,让学生体验四子棋游戏的基本玩法。
3. 引导学生思考如何制定游戏策略。
第二阶段:人工智能算法基础(4课时)1. 介绍人工智能的基本概念和分类,如机器学习、深度学习等。
2. 讲解搜索算法,如深度优先搜索、广度优先搜索等。
3. 介绍最小化极大值算法和α-β剪枝算法,为四子棋游戏的人工智能实现做准备。
第三阶段:四子棋游戏的人工智能实现(6课时)1. 引导学生使用Python语言编写四子棋游戏的AI算法。
2. 实现基于规则的四子棋游戏AI,包括评估函数、搜索策略等。
3. 引导学生实现基于机器学习的四子棋游戏AI,如使用决策树、神经网络等。
第四阶段:四子棋游戏的测试与优化(4课时)1. 对学生编写的四子棋游戏AI进行测试,评估其性能。
2. 引导学生分析测试结果,找出AI的不足之处。
3. 引导学生优化AI算法,提高游戏性能。
五、教学评价1. 课堂表现:学生参与度、提问积极性等。
2. 作业完成情况:四子棋游戏AI的编写、测试和优化。
3. 项目答辩:学生展示自己的四子棋游戏AI,并接受其他学生的提问。
六、教学资源1. 四子棋游戏教学课件2. Python编程教材3. 人工智能相关教材和在线资源4. 四子棋游戏AI的示例代码七、教学反思通过本课程的学习,学生不仅能够掌握四子棋游戏的基本规则和人工智能算法,还能够将所学知识应用到实际问题中,提高自己的编程能力和解决问题的能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
韶关学院计算机科学学院数据结构课程设计题目:四子棋学生姓名:刘晓锋学号: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. 软件名称:Four In A Line(四子棋)B. 软件组成:FourInALine.apk(android系统应用程序)C. 制作平台及相关调试工具:Eclipse ; AndroidSDKD. 运行环境:android手机/winxp/win7(PC平台必须具有AndroidSDK)E. 性能特点:(1)软件由两个可执行文件组成,各具特点:FourInALine.apk为android系统应用程序,体积小,界面友好,使用方便。
(2)方便重新开始游戏和悔棋。
(3)判赢用时少。
(4)个别其他功能可进行再扩展。
2 概要设计2.1问题解决的思路概述首先是确定结构化程序设计的流程图,利用已存在的数据结构来构造一个存储棋盘的结构,接着把游戏实现分成六个主要的模块:实现悔棋的模块、实现新开的模块、实现音乐的模块、实现绘图的模块,实现控制线程的模块,实现判赢的模块,然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能。
最后,编写main主函数以实现游戏的可玩性和正确性,调试程序并将不足的地方加以修改。
总而言之,就是先用自顶向下、逐步细化的设计方法来分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法来写出程序。
2.2 相关函数介绍说明在android版本程序定义一个用于存储棋盘的二维数组变量:private static int[][] ChessBoardState;[1](1)android版本程序下定义的主要函数public boolean isWin(int x, int y)// 判断赢家,采用遍历最后下的棋子在8个方向上的棋子public void back(Context context)// 悔棋函数public void play()//游戏主线程public void setXY(MyBackChessState myBackChessState)//处理栈顶元素public Rect getRect(int[] xy) // 标记二维数组对应的矩形区域,也即是棋子该下的位置public Rect getRect(int x, int y) // 标记二维数组对应的矩形区域,也即是棋子该下的位置private int[]getIndexofXY() // 获得当前坐标在二维数组中对应的索引。
XY[0]是横坐标,也即是棋盘的第某列数;XY[1]是纵坐标,也即是棋盘的第某横。
private int searchEmptyTopTile(int x, int[][] chessboardstate) //返回当列最上方无棋子的坐标,也即是棋盘的第某横.public void setChessBoardState(int[][] ChessBoardState)//保存棋盘状态public DrawGraph getChessBoardView() //获得绘图实例public void setWinner(int player) //设置赢局提示(提示对应玩家赢) public void nextplayer(int player) //设置下一玩家public void newGame(Context context) //触发开始新游戏public boolean onTouch(View v, MotionEvent event) //绑定棋盘的触摸事件public static void play(Context context, int resource) //播放音乐private void updateView(Canvas canvas)// 更新游戏界面public void showChess(Canvas canvas, int player, Rect rect) // 设置当前玩家的棋子public void showLastChess(Canvas chess, int player, Rect rect)//显示最后下的棋子public void clearView(Canvas canvas) // 清空整个棋盘视图private void init() //初始化视图public static Bitmap getBitmapFromResId(Context context, int resId) //获得棋盘图片资源public static Bitmap zoomBitmap(Bitmap bitmap, float width, float height) //缩放棋子图片资源2.3 主程序的流程基函数调用说明(1)主程序的简要流程图图1 主程序流程图(2)各程序模块之间的层次(调用)关系○1调用“findViews()”和“initViews()”方法绑定各个控件,以便调用相应的活动界面,然后调用各模块进行游戏。
○2在每一个功能模块中都几乎涉及到棋盘数组的存取,所以都要调用“getChessBoardState()”对数组变量初始化。
○3实现音乐的模块“Music”类,首先要创建一个音频播放实例,然后启动它。
在游戏运行中根据其他模块是否调用其stop()方法或重新调用其play()方法。
音乐模块流程图如下:play()创建一个音频播放实例stop()停止音乐图2 音乐模块流程图○4实现控制线程的模块“Control”类,首先要调用getIndexofXY()方法计算用户点击的视图坐标对应的棋盘二维数组坐标。
若此次点击有效,调用悔棋模块存储此次操作和调用判赢模块的isWin()方法判断胜负,若赢局出现就再调用音乐模块。
最后调用绘图更新整个游戏视图。
若此次点击无效,直接返回。
控制线程模块流程图如下:图3 控制线程模块流程图○5实现判赢的模块“Winner”类,首先调用“isWin()”方法判断是否有赢局出现,然后在游戏运行中根据其他模块是否调用其getSameChess()方法来设置相同棋子或调用updateSameChess()方法来重置Winner类中的静态变量。
控制线程模块流程图如下:图4 判赢模块流程图○6实现绘图的模块“DrawGraph”类,首先调用“onDraw()”以实现视图初始化和棋盘绘制。
然后再调用控制线程模块的getRect()方法获取棋子应下的位置,接着调用getXY()方法和showLastChess()方法设置最后下的棋子。
若有赢局出现,则调用判赢模块的getSameChess()方法来设置相同棋子。
控制线程模块流程图如下:图5绘图模块流程图○7实现悔棋的模块“BackChess”类,首先调用“back()”判断当前栈是否为空,是则弹出提示信息并退出。
否则弹出栈顶元素,重新赋值为0。
然后调用控制线程模块的getChessBoardView()方法获得DrawGraph的实例,用于更新棋盘。
最后调用控制线程模块的setX Y()方法设置上一棋子的坐标。
控制线程模块流程图如下:图6悔棋模块流程图○7实现新开的模块“New”类,首先调用“newGame()”新建棋盘数组,然后调用控制线程模块的setChessBoardState()方法对棋盘数组进行重新初始化, 然后调用控制线程模块的getChessBoardView()方法获得DrawGraph的实例, 更新棋盘。
接着调用悔棋模块的clearStack()方法清空原先栈中元素。
最后调用判赢模块的updateSameChess()重置静态变量和音乐模块的play()方法重启背景音乐。
新开模块流程图如下:图7悔棋模块流程图3 详细设计3.1 棋盘存储的实现棋盘的大小一般都是固定的常量,所以可以用二维数组来存储棋盘的状态,其结构简单且容易,是一种合理的数据结构。
二维数组定义如下:private static int[][] ChessBoardState = new int[ROW][COLUMN]; 3.2 各模块主要算法在四子棋游戏的程序设计中,每一部分都会调用一些其他其它函数来辅助完成运算(例如:对棋盘数组、当前玩家和棋盘视图的初始化,获取棋子应下的位置等),在这里主要说明四子棋游戏的程序设计,其它函数的程序设计和具体调用关系请查看程序清单。
3.2.1判赢算法的实现判赢算法是基于玩家棋子最后下的位置来进行运算,此算法在计算时分8个方向分别进行局部遍历。
为此,我设计了8个for循环,一开始默认相同棋子数为1,然后从紧邻当前棋子的棋子开始遍历,若遍历经过的棋子是当前玩家的棋子,则相同棋子数+1,否则结束此方向的遍历。
每遍历完同一直线上的两个方向则进行一次判断,判断相同棋子数是否>=4。
是则返回true,否则进入其他方向的遍历。
若所有方向均遍历完后,相同棋子数未能>=4就返回false。
图8 判赢算法原理图在算法设计时应注意:○1每个方向起始遍历的下标;○2每个方向遍历的边界;○3每遍历完一条直线方向得重置相同棋子数为1。
3.2.2悔棋算法的实现悔棋借用了栈结构,在栈中保存棋子在棋盘二维数组中的坐标。
在设计此算法时,我定义了一个保存坐标数组的栈,将x和y坐标打包成数组来存入栈。