Linux环境下五子棋游戏设计(毕业设计论文)

上传人:1888****888 文档编号:37693776 上传时间:2021-11-04 格式:DOC 页数:39 大小:460.52KB
收藏 版权申诉 举报 下载
Linux环境下五子棋游戏设计(毕业设计论文)_第1页
第1页 / 共39页
Linux环境下五子棋游戏设计(毕业设计论文)_第2页
第2页 / 共39页
Linux环境下五子棋游戏设计(毕业设计论文)_第3页
第3页 / 共39页
资源描述:

《Linux环境下五子棋游戏设计(毕业设计论文)》由会员分享,可在线阅读,更多相关《Linux环境下五子棋游戏设计(毕业设计论文)(39页珍藏版)》请在装配图网上搜索。

1、武汉轻工大学毕业设计(论文)设计(论文)题目:Linux环境下五子棋游戏设计 姓 名 学 号 100502121 院 (系) 数学与计算机学院 专 业 信息管理与信息系统 指导老师 2014年 5月13日摘 要五子棋起源于古代中国,发展于日本,风靡于欧洲,不仅以其简单易学的特性,为广大群众所喜闻乐见,而且又有深奥的技巧和高水平的国际性比赛。它的棋文化源渊流长, 具有东方的神秘和西方的直观,既有“场”的概念,亦有“点”的连接,它是中西文化的交流点,是古今哲理的结晶。 五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标

2、移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。 关键词:C语言;五子棋;数组;图形编程 abstractGobang game is originated in ancient China, development in Japan, popular in Europe, not only for its simple properties, as the masses love to see and hear, but also

3、has a profound skills and a high level of international competition. Its chess culture origin is long, has the Eastern mysticism and western visual, both field concept, also has a point connection, it is the point of cultural communication, is the crystallization of ancient and modern philosophy.Gob

4、ang is a traditional checker-type game in which the lining up of five pieces in a straight line scores victory. And C language can accomplish a 2-player gobang on computers. This 2-player gobang program contains 4 main sections, they are, graphics, movement and selection, victory judgment and helpin

5、g system. Several elements and sentences of C programming language such as structural element, array, global variables, press processing and Graphics Programming are also applied in the program. With the accomplishment of the three main subprograms, namely, checker board and pieces construction, pla

6、yers step-selection and victory judgment, a whole program of gobang is established and gobang is available on computers. Keywords: C programing language, Gobang, Array, Graphics Programming,34目 录摘 要IIabstractIII1 概述11.1 开发背景11.2 开发目的和意义11.3 开发目标22程序的介绍与规划32.1程序设计32.3程序的实现目的33程序分析与总体设计43.1 程序需求分析43.1

7、.1 用户需求分析43.1.2 功能需求分析43.1.3 程序稳定性分析63.2程序总体方案的设计63.3 程序开发方法与开发平台83.3.1 开发方法83.4 本章小结84程序设计与算法实现94.1数据模块94.1.1 数据结构94.1.2 数据定义104.2.1 界面设计创建棋盘104.2.2 界面设计创建菜单124.2.3 相关功能函数134.3 核心功能函数模块164.3.1 相关功能164.4 游戏功能模块184.4.1 游戏主要操作流程图184.4.2 人人对战模块194.4.3 人机对战模块204.4.4 网络对战模块234.4.5 其他功能模块254.5 本章小结265系统测试

8、及成果展示275.1 测试流程275.2 功能测试275.2.1 界面功能测试275.2.2 输入功能测试275.2.3 游戏功能测试275.3 成果展示285.4 总结31参考文献32致 谢33武汉轻工大学2014届毕业设计论文1 概述1.1 开发背景游戏软件是当今世界发展最迅速,最有影响力,最有潜力与活力的领域之一游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有大部分喜欢游戏的,因此游戏软件在很大程度上给予绝大部分人精神上的娱乐第二次世界大战以后,电子计算机技术得到了突飞猛进的发展先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子子计算机一代一代实现更新,同时

9、软件技术也发展迅速在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”“判断”能力反过来与人较量由于不断修改更新,使计算机的“智力”水平与人难分高低到了90年代,游戏软件已经为世界各国的人使用,BLACKISLAND和Blizzard.这两个强大的游戏制作组起到了巨大的带动作用,还有中国的洛河工作室在国内也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日益丰富的生活需求得以满足。五子

10、棋游戏更是吸引着不同年龄段的人群,无论男女老少都可以玩,都喜欢玩,而当前微型计算机已经是在广大人群中流行着,用电脑来下五子棋更是一种时尚。五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,增山海经中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳艺经中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。可见,五子棋颇有渊源。亦有传说,五子棋最初流行于少数民族地区,以

11、后渐渐演变成围棋并在炎黄子孙后代中遍及开来,可以说五子棋是我们的国粹之一了。而当前五子棋程序的发展也非常快,从最初的双人发展到人机(有AI),然后到现在的网络对战,已经受到越来越多人的喜爱和重视。1.2 开发目的和意义随着游戏行业正在逐渐成熟并多远化,前途一片光明,Linux操作系统图形化界面的出现,其使用越来越广泛,然而,Linux环境下的游戏处于一种缺乏状态,当你在Linux下工作的时候,休息期间玩一下游戏也是一种放松的方式,在Linux环境下开发游戏(以经典的五子棋为例)有其重要的经济价值和战略意义,也可以借此课题对自己所学的知识进行一次综合的运用和拓展,加强自己的专业知识水平和综合运用

12、能力以及动手能力。在人机智能方面其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱;本系统注重人机对弈和网络对战功能的开发,人机对弈只有一个通用等级,未作详细分化,网络对战,借助SOCKET建立连接,进行网络传输,实时显示,并有比较简单的界面系统,简单而使用,完备又不奢华。1.3 开发目标基于Ncurses库的Linux环境下五子棋游戏的设计与实现,使五子棋游戏的人人对战、人机对战和网络对战组合在一起。为此,我设计是会做如下工作:(1) Ncurses库的使用,使用Ncurses字符终端图形化处理的功能,

13、实现界面的绘制(包括棋盘的绘制、光标的绘制、菜单的绘制、文字的显示等图形化实现功能);(2) 链表栈的实现,栈的创建、入栈、出栈与栈的销毁,栈用于记录落子的情况(包括颜色与位置);(3) 判断胜负算法的实现;(4) 人机对战算法的实现;(5) 网络编程,采用TCP的传输方式,用于网络对战的实现。2程序的介绍与规划2.1程序设计本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。本系统在Linux环境下,运用C语言知识进行系统的编码,主

14、要实现三大功能模块,人人对战模块、人机对战模块和网络对战模块。用菜单的功能和按键获取进行选择需要进入的游戏模块。2.2程序的基本功能1 显示一个十三行十四列的围棋棋盘。2 在棋盘上面在对应位置通过点击鼠标下子,棋盘上将在相应的位置上显示棋子,并且棋子在横纵交点上。3 可以自动判断游戏是否结束,是否黑方或者是白方已经胜利。4 在游戏棋盘上方会有一个游戏信息,这个游戏信息是用来提示当前是黑白双方的哪一方下子,玩家可以根据这个提示来相应的下棋,而不会导致不清楚轮到哪一方下棋。5 具有悔棋功能,在下棋时可以悔棋。6 主要的模块功能:人人对战,人机对战,网络对战。2.3程序的实现目的五子棋游戏程序所要实

15、现的目的是让我们可以在电脑上下棋,而不需要去买,可以随时玩,方便快捷。而且能更好的推广五子棋于世界各地,此软件也在于提供给爱好五子棋的人,也吸引更多的人喜欢上五子棋,也具有很大很大的商业价值。使五子棋游戏程序在以后的制作中功能越来越强大,外观越来越好看。3程序分析与总体设计3.1 程序需求分析3.1.1 用户需求分析通过程序功能的分析,根据五子棋爱好者的需求,得出以下需求信息:1. 具有基本开始功能;2. 具有提示该轮到哪一方下棋的功能;3. 退出游戏功能;4. 判断胜负功能;5. 网络对战功能;6. 悔棋功能;7. 人机对战功能;8. 保存游戏功能。3.1.2 功能需求分析程序的基本功能需求

16、分析如下:(1) 游戏进入界面的菜单选择,有人人对战、人机对战、创建主机和加入战网,继续游戏,退出六个选项,如图3.1.3.1;图3.1.3.1 主界面菜单(2) 进入游戏之后,显示一个十三行十四列的五子棋的棋盘(如图3.1.3.2)。用键盘的按键来控制,棋局重现功能是在某方胜利之后才能手动操作一步步查看并回顾双方下棋的过程;上级菜单功能可以使五子棋游戏退出当前的游戏模块,回到游戏开始界面时候的菜单,进行重新选择;退出游戏是退出整个游戏界面(如图3.1.3.3);图3.1.3.2 棋盘样式图3.1.3.3 重现棋局操作(3) 棋盘上显示绘制的光标,可以通过键盘上的字母WASD对光标进行上下左右

17、的移动操作。(4) 在上面棋盘将光标移动到上面对应的位置,可以落子,棋盘上将在光标显示处出现相应的棋子,并且棋子在横纵交点处;(5) 人人对战的过程中有悔棋的功能;(6) 游戏的过程中会有提示信息,如该哪一方落子,棋盘旁边显示相应按键对应的操作列表;(7) 可以自动判断胜负,胜利一方形成一列的五个或5个以上的棋子闪烁数次,显示是黑方或者白方已经胜利的字样,并且停止落子的功能;(8) 能够实现三种游戏模式,人人对战、人机对战和网络对战。3.1.3 程序稳定性分析 程序稳定性需求如下:(1) 在程序运行时程序不能崩溃,更不能造成系统崩溃;(2) 游戏运行速度不能太慢,要反应及时。3.2程序总体方案

18、的设计软件的总体架构如图3.2.1:一人游戏类二人游戏类游戏类指针棋盘类主界面用户图3.2.1 总体架构考虑到整个的下棋过程(无论对方是电脑抑或其他网络玩家)可以分为:己方落子、等待对方落子、对方落子、设置己方棋盘数据这一系列过程。本系统在Linux环境下,运用C语言知识进行系统的编码,主要实现三大功能模块,人人对战模块、人机对战模块和网络对战模块。用菜单的功能和按键获取进行选择需要进入的游戏模块。3.2.1 各个功能的简要说明1. 绘制十三行十四列的棋盘,每行每列的距离都是一样的。2. 棋盘上面落子:点击鼠标以后,会在相应位置落下棋子,并被绘制出来,黑子是一个实心的黑圆,白子是一个实心的白圆

19、加上一个等大空心的黑圆。3. 黑白双方轮流落子:黑方落子以后就要轮到白方,交替进行,这是下棋的基本要求,因此我们就要弄一个互斥事件进去,让他们交替的落子。不能落在相同位置:当我们落子时,会不小心落到相同位置上去,那么就要出现提示,不能落在相同位置上,需要重新落子,实现的设想是当这个点已经绘制过棋子以后,我们就要给一个布尔变量,让它为假,那么只能在它为真时才能绘制棋子,否则就要重新落子到别的地方去。4. 判断输赢:当五个相同颜色子都连在了一起的时候,我们就要判其为赢,这五个子可以在横竖方向上连起,也可以在斜方向上连起。5. 游戏信息:我们应该在棋盘的上面设置一个游戏信息的,用来提示当前轮到哪一方

20、下棋了,以便于玩家知道谁在下,这个功能只要在黑白双方轮流下棋功能的过程中添加一个提示信息用于显示到界面上的就可以了。3.3 程序开发方法与开发平台3.3.1 开发方法对于本系统的研究方法,通过查阅资料以及指导老师师寻求帮助等方法解决技术上的问题,具体逻辑上的一些东西需要自己仔细思考,并动手实现。具体步骤为:第一步,熟悉五子棋游戏规则,对系统做可行行分析,同时结合本次毕业设计的相关要求进行系统的分析与概要设计;第二步,简要概述系统的配置,并且对系统进行详细设计,实现相关解决问题的算法;第三步,运用以前所学的知识,选择C语言在Linux环境下调用Ncurses库进行开发,进行软件编码,实现其各项基

21、本功能;第四,系统开发完毕后,进行调试、运行和代码优化;第五步,对前期的学习和工作进行全面的思考、分析、归纳和总结,完成本论文的撰写工作。3.3.2 开发平台 本系统开发所需要的开发平台如下所示:(1) 中央处理器:双核2.1GHz;(2) 内存:2G;(3) 硬盘:320G;(4) 操作系统:Linux(fodera14);(5) 开发工具:Linux环境下vim,gedit等;(6) 编程语言:C语言(7) 运行环境:Linux环境(含Ncurses库)下的终端 3.4 本章小结本章是此项目简单的概要性阐述,进行功能和用户需求分析,开发平台和开发方法的介绍,确定了整体的功能模块,为下一章的

22、详细设计做准备。4程序设计与算法实现4.1数据模块4.1.1 数据结构 (1) 颜色的定义(枚举类型)/定义颜色,用来设置棋盘背景的颜色/采用枚举来定义颜色typedef enumGCBlack,GCRed,GCGreen,GCYellow,GCBlue,GCMagenta,GCCyan,GCWhite,GCCountGRAPHICS_COLOR;(2) 链表节点,记录双方落子的情况,用同一条链表式栈存储双方落子情况,落子时入栈,悔棋时出栈。/定义棋子的结构typedef struct qiziint qx;/棋子在棋盘上的横向位置int qy;/棋子在棋盘上的纵向位置int qflag;/f

23、lag表示棋子的种类,0表示白旗,1表示黑棋struct qizi * next; LinkQZ; (3) 定义棋子坐标信息的结构体(人机对战时,根据这些信息分析出电脑下棋的坐标点)typedef struct point/坐标信息int x;/记录横坐标int y;/记录纵坐标int quan;/设置权值,当max相等时,可比较权值int cc3;/电脑:设置当前坐标“冲3”和“冲4”的可能性,1为可能,0为不可能int cc4;/表示冲4int pc3;/人:设置当前坐标“冲3”和“冲4”的可能性,1为可能,0为不可能int pc4;/表示冲4int c4;/记录电脑的四个方向上的相同棋子

24、的个数int p4;/记录人的四个方向上的相同棋子的个数 Point;(4) 绘制期盼所使用的图像如下定义(源于office中的工具图标):/使用 画棋盘,也可以自己找另外的符号/使用 来表示棋子#define CHESS 4.1.2 数据定义程序涉及到的相关的全局变量的定义如下:static LinkQZ * top = NULL; /人人对战 /栈用来存放棋子下棋的行径的坐标以及棋子的颜色static int b102 = 0;/人人对战 /数组用来存放胜利时的五zi的坐标static int (*p)2 = b;/指针p来操作上述数组static Point inf182;/人机对战 坐

25、标的详细信息4.2 界面模块本程序所使用的是ncurse终端图形库来绘制图形的。Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。Ncurses是一个能提供基于文本终端窗口功能的动态库。Ncurses可以在任何遵循ANSI/POSIX标准的UNIX系统上运行,除此之外,它还可以从系统数据库中检测终端的属性, 并且自动进行调整,提供一个不受终端约束的接口。因此,Ncurses可以在不同的系统平台和不同的终端上工作的非常好。程序相关数据定义如下:WINDOW* g_win=NULL;/定义终端指针,用来操作终端的属性的设置,初始化为空GRAPHICS_

26、COLOR g_fore_color;/定义终端的前景色GRAPHICS_COLOR g_back_color;/定义终端的背景色4.2.1 界面设计创建棋盘主要使用 这些符号画棋盘,其核心思想为:For循环的恰当利用.先用外层循环画出外围的整个方框,然后再找出内层的规律,从每一行开始绘制出每一列,再从下一行开始绘制,循环绘制即可。函数说明如下Void qipan(void)/画棋盘核心代码如下:for (i = 2; i = 26; i=i+2)/两个for循环控制着的行的输入for (j = 11; j = 63; j=j+2)if (i = 2)/当为第一行时,控制第一行的图形的格式if

27、 (j = 11)/第一行的第一个元素的样式mvaddstr(i, j, );else if (j = 63)/第一行的最后一个元素的样式mvaddstr(i, j, );elseif (flag)mvaddstr(i, j, );flag = 0;elsemvaddstr(i, j, );flag = 1;else if (i = 26)/当为最后一行时,控制最后一行的格式的输入if (j = 11)/最后一行第一个元素的样式mvaddstr(i, j, );else if (j = 63)/最后一行最后一个元素的样式mvaddstr(i, j, );elseif (temp)mvaddst

28、r(i, j, );temp = 0;elsemvaddstr(i, j, );temp = 1;elseif (j = 11)/其他行的第一列的元素的样式mvaddstr(i, j, );else if (j = 63)/其他行的最后一列的元素的样式mvaddstr(i, j, );k = 1;elseif (k)mvaddstr(i, j, );k = 0;elsemvaddstr(i, j, );k = 1;4.2.2 界面设计创建菜单本程序主要涉及到了两个菜单的设计,分别为:主菜单,下棋完成后的子菜单界面。1.主菜单界面Void menu(void);/主菜单核心代码:mvaddstr

29、(12, 30, 1.人人对战); attroff(A_REVERSE); /关闭属性 mvaddstr(13, 30, 2.人机对战); mvaddstr(14, 30, 3.创建主机); mvaddstr(15, 30, 4.加入战网); mvaddstr(16, 30, 退出);实现该功能比较简单,只要在终端窗口上画出主菜单即可。主要用到了curses库中的mvaddstr函数,画出主菜单。2.下棋完成后的子菜单界面void zimenu(int flag)/子菜单,棋局完了后的菜单参数flag表示下棋的种类(人人用0表示,人机用1表示),这里是人人对战的情况。其实现功能比较简单,只要画

30、出界面,然后相关函数即可,这里就不再描述。其部分代码如下:mvaddstr(12, 30, 1.重现棋局);mvaddstr(13, 30, 2.再完一次);mvaddstr(14, 30, 3.主菜单);mvaddstr(15, 30, 4.退出游戏);wrefresh(g_win);/刷新窗口,显示窗口的最新变化if (ch = r & x = 13)/如果选择再完一次,开始游戏endwin();if (flag)renjiStart();renrenStart();break;4.2.3 相关功能函数与图形绘制操作相关的函数说明如下:(1)init_graphics /窗体初始化函数该函

31、数功能如下为:设置本地化,以使输入的字符不会是乱码;窗体初始化,返回窗体指针;如果当前终端有显示颜色的能力,则初始化颜色,给定义了的每种颜色分配一个ID;隐藏鼠标;设置前景色和背景色;清屏。函数核心代码如下:/初始化终端窗体函数,返回true(初始化成功),返回false(初始化失败)bool init_graphics(void)setlocale(LC_ALL,);/设置本地化,输入的字符不会是乱码g_win=initscr();/初始化一个窗体,返回一个指针if(NULL=g_win)printf(call initscr() failed!n);return false;/返回fals

32、e,表示初始化终端设置失败cbreak();/调用cbreak函数后,除了Del和Ctrl键外,接受其他所有字符输入。noecho();/关闭输入回显功能,输入的字元不显示在终端上if(has_colors()/判断当前的终端有没有显示颜色的能力int i,j,k;start_color();/启动彩色机制for(i=0,k=0;iGCCount;i+)for(j=0;jGCCount;j+)init_pair(+k,i,j);/初始化颜色,给每个颜色分配一个IDcurs_set(0);/隐藏鼠标/g_fore_color=GCBlack;/设置前景色/g_back_color=GCBlue;

33、/设置背景色/clear_screen(0,0,COLS,LINES);/COLS,LINES是库函数中的宏/mvaddstr(14, 60, CHESS);/在坐标14,60显示字符串CHESS/wrefresh(g_win);/刷新窗口,显示窗口的最新变化/改变屏幕内容时,后面一定要跟上这条语句return true;/返回true,表示初始化终端设置成功(2)清屏处理函数-clear_screen对整个窗口进行清理处理,可理解为窗口的局部区域的刷新。/清屏函数,形参为:清屏的初始坐标x,y;结束坐标w,hvoid clear_screen(int x,int y,int w,int h)

34、int i,j;wattrset(g_win,CURRENT_ATTRIBUTE);/更新前景色和背景色for(i=0;ih;i+)wmove(g_win,i+y,x);/移动光标,i+y纵坐标,x横坐标for(j=0;j qx;y = s - qy;axy = 0;flag = s - qflag;top = pop(top);g_fore_color=GCWhite;/是白旗下的话,设置前景色为白色wattrset(g_win,CURRENT_ATTRIBUTE);/更新前景色和背景色mvaddstr(x, y, );wrefresh(g_win);/刷新fuwei(x, y);/在该坐标

35、点下棋子wrefresh(g_win);/刷新if (!flag)g_fore_color=GCBlack;wattrset(g_win,CURRENT_ATTRIBUTE);/更新前景色和背景色mvaddstr(12, 70, CHESS);/显示当前所下棋子为白旗还是黑棋wrefresh(g_win);/刷新return 1;return 0;(2)输赢的判断函数resultint result(int x, int y, int (*a)100, int flag)x,y为当前下棋点所在的坐标,二维数组a记录了下棋过程中每一个下棋点的坐标的详细信息(包括坐标信息,棋种信息),flag为标

36、志位,用来判断是白旗还是黑棋(2表示黑棋,1表示白旗)。获胜的标准为:无论哪一方,只要在水平,垂直,斜线方向有连续的五个相同的棋子,即代表游戏结束,获得胜利。如果棋盘下满后,仍为判断出输赢,则该局为平棋。其核心思想为:从当前所在点的坐标的四个方向找起,看是否找到获胜的标准,主要是for循环的应用。(3)五子闪烁函数wuzishansuo下棋赢的时候,棋子闪烁的样式函数void wuzishansuo(int (*p)2, int f)/五子闪烁二维数组p记录了获胜时的五个棋子的坐标,f为标志位,1表示白旗,2表示黑棋。让棋子闪烁的思想就是:不断的清除棋子,然后重现棋子即可。其核心代码如下:wh

37、ile (j = 0)if (flag)for (i = 0; i 6; i+)mvaddstr(pi0, pi1, );wrefresh(g_win);/刷新fuwei(pi0, pi1);/在该坐标点下棋panflag = 0;elsefor (i = 0; i qx;y = qz - qy;flag = qz - qflag;top1 = pop(top1);g_fore_color=GCWhite;/是白旗下的话,设置前景色为白色if (flag)/如果为黑棋的话,设置前景色为黑色g_fore_color=GCBlack;wattrset(g_win,CURRENT_ATTRIBUTE

38、);/更新前景色和背景色mvaddstr(12, 70, CHESS);/显示当前所下棋子为白旗还是黑棋mvaddstr(x, y, CHESS);/在该坐标点下棋子wrefresh(g_win);/刷新usleep(650000);4.4 游戏功能模块4.4.1 游戏主要操作流程图程序主要分三个游戏模块人人对战,人机对战,网络对战,并将三个模块组合在一起,经过菜单操作,玩家可以任意选择游戏模式,模块之间相互转换与运行的流程图如图4.4.1.1: 开 始网络对战人人对战人机对战菜单操作 界面初始化退出?否 是退出游戏 图4.4.1.1 游戏主要操作流程图 4.4.2 人人对战模块(1)功能模块

39、说明l 人人对战是单机下的五子棋模式,可以自己和自己下棋模拟练习,也可以两个人一起玩;l 操作的过程中,只有在黑子或者白子某一方胜出时,棋局重现功能能才能有效;l 每落一颗子都会进行一次判赢,如果某一方赢了,此局结束,不能再落子。(2)流程图进入人人对战游戏模块后,其流程图如图4.4.2所示: 人人对战开始 获取按键菜单操作? 是其他按键落子操作悔棋操作转到菜单操作判赢退出?否是 退出游 戏胜出?开始界面菜单操作 继续上步否是退出重现棋局重现 图4.4.2 人人对战模块流程图(3)人人对战函数说明void renrenStart(void)/人人对战开始其思想是:双方进行交替的下棋,直到有一方

40、获得获胜为止,或者棋盘下满,平局为止。4.4.3 人机对战模块(1)流程图人机对战的功能和人人对战的功能类似,少了悔棋那一项功能,只是对方不是人在下,是电脑在下棋。进入人机对战后,其流程如图4.4.3.1所示:人机对战开始 获取按键菜单操作? 是落子操作其他按键转到菜单操作判赢退出?否是 继续上步退出游 戏胜出?开始界面菜单操作否是退出重现棋局重现 图4.4.3.1 人机对战模块流程图 (2)人机对战的算法人机对战功能是整个项目的核心部分,在人机对战的过程中,电脑会根据人工智能算法,判断下一步最优落子位置。最后,电脑根据棋盘上棋子的状态,判断是否存在有五子相连的棋型,如果有则判断输赢。总的来说

41、,人机对战的精髓在于人工智能算法的实现,就是要让电脑知道该在哪一点下子,这就需要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是就是当这子落下后会形成什么棋型(例如“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算法思想。当然,仅依靠当前盘面进行判断是远远不够的,这样下棋很容易掉进对方预先设下的陷阱,因为没有考虑以后的变化。所以在此基础上可以加入递归调用,即在电脑中预测今后几步的各种走法,以便作出最佳选择。(3)人机对战函数说明a.求出棋盘上所有棋子处的信息 void poss(int x, int y, int (*a)100, int flag, int n)/

42、求出当前棋盘所有棋子处的详细信息(坐标,白旗数目,黑棋数目)x,y代表空格棋子处的坐标,二维数组a为全局变量,记录了下棋点的信息,flag为标志位,1表示白棋,2表示黑棋。其思想:遍历棋盘,然后四个方向寻找,记录其周边信息(黑棋子的个数,白棋子的个数,“冲3”“冲4”的可能性)。完成此功能主要是为了电脑在下棋时,电脑能根据空棋点的信息进行分析和判断,然后确定最佳下棋点。b.求出棋盘上所有空格棋子处的信息 int possinf(int (*a)100)/求出每一个空格棋子处的详细信息(坐标,白旗数目,黑棋数目)二维数组a为全局变量,记录了下棋点的信息,返回值为空棋子的个数。其思想:扫面记录的所

43、有的棋子的信息,然后找到空棋点,并把空棋子点的信息记录到结构体数组中,用来保存信息。当电脑下棋时,即可扫描该结构体的信息,找到最佳下棋点的坐标。c.求出电脑下棋最佳下棋点的坐标Point cxy(int (*a)100)/确定电脑下棋的最佳坐标二维数组a为全局变量,记录了下棋点的信息,返回值为最佳下棋点的坐标信息Point。思想:1.电脑在有赢的可能时,电脑必须执行“赢”下棋的这一步操作。2.电脑在不能赢的情况下,必须要阻止对方赢这两条时最基本的操作实现。扩展:1.电脑不能赢的话,必须找到自己能够下棋构成赢的希望,即冲着有3个棋子的点下棋,即可构成赢的希望。2.如果上述目标没有,就阻止电脑有这

44、种冲4的希望。其核心部分代码如下:if (cmax = 4)for (i = 0; i n; i+)for (j = 0; j = 4)for (i = 0; i n; i+)for (j = 0; j 4; j+)if (infi.pj = pmax)return infi;d.人机对战开始void renjiStart(void)/人机对战人机对战操作中,选择一方先走棋,在这里我设定的是白棋(人)先走,电脑(黑棋)后走。首先光标定位在棋盘的中间,由人选择下棋后,再接着,电脑下棋。电脑下棋时,首先经过对整个棋盘的扫描,调用上述函数加以分析,确定好最佳下棋点后,电脑下棋。每一步棋,调用结果函数

45、经过判断,判断是否分出胜负。4.4.4 网络对战模块网络对战功能需要有服务器和客户端两个模块。 服务器主要是通过命令得到服务器名称,根据服务器名称和端口号建立Socket对象,服务器在建立并启动以后,将执行一个死循环的守护进程,响应随时到来的客户端请求,并将建立起网络连接的客户端添加到一个用户列表中,通过这样的方法,位于列表中的客户端就可以通过服务器进行通信了。客户端在网络对战过程中代表玩家,其主要功能是与服务器进行消息交互,在进行游戏后又要进行落子的判断和双方棋盘的更新,最后判断游戏的输赢。 客户端与客户端之间是通过服务器进行连接的。总的来说,网络对战功能有实现网络连接、服务端端与客户端之间

46、的连接,落子、胜负判断。(1)相关函数说明网络对战分为主机和客户机。客户机调用如下函数: socket( )创建套接字connect( )连接到服务器recv( )接收消息或send( )发送消息;主机调用如下函数: socket( )创建套接字bind( )绑定listen( )监听accept( )连接到服务器recv( )接收消息或send( )发送消息。void create_host(void) /创建主机客户机加入主机void join_game(void);/加入战网void net_game_start(int kind)/网络对战开始/kind表示是主机还是客户机,0表示主机

47、,1表示客户机。(2)流程图进入网络对战模块后,服务器端流程图与客户端流程图一样,只是客户端为连接服务器,而服务器为等待客户端的连接。客户端流程图如图4.4.4所示:网络对战开始 连接到服务器是否该本 方落子否是本方按键操作等待接收对方落子情况菜单操作?是落子操作其他按键转到菜单操作判赢退出?否是 继续上步退出游 戏胜出?开始界面菜单操作否 是退出重现棋局重现 图4.4.4 网络对客户端战模块流程图4.4.5 其他功能模块保存游戏功能能够将玩家没有进行完的棋局保存起来,在关闭游戏之后,玩家可以通过继续游戏将上次保存的棋局恢复到棋盘上。保存游戏和继续游戏的功能实现起来比较简单,因为棋盘上的棋子是

48、用0、1、2表示,棋盘是一个13*14的矩阵,那么棋子可以用二维数组保存起来,利用C文件输入输出可以实现数据的保存和读取。4.5 本章小结本章对此系统进行了详细的设计,列出了相关的数据结构,主要功能函数,相关表格,以及模块功能流程图等,为编码做好准备。5系统测试及成果展示5.1 测试流程 启动五子棋可执行程序 修改Bug模块测试测试通过?否测试结束?否 是 结 束 图5.1 功能测试模块流程图5.2 功能测试5.2.1 界面功能测试界面功能测试的任务是对游戏过程中各种界面元素是否能够正常绘制出来的测试,在程序运行的过程中,可能因为计算机的运行速率的问题而出现图像不全的情况,例如画棋子可能只出现

49、了半圆的形状,而不是完整的棋子,有的时候界面刷新不及时。测试结果:99%的情况下正常执行,只有在计算机很忙碌的时候会出现图像不完整或卡住的情况。5.2.2 输入功能测试输入功能测试是为了测试出是否能够获取按键操作并且及时作出相应的反应,不同的按键对应着不同的功能。 测试结果:正常运行,没有出现异常现象。5.2.3 游戏功能测试游戏模式功能测试是测试出是否能够通过菜单选择正常进入所选的游戏,是否能够正常地进行落子操作,是否及时出现相关消息提示,是否能够正常判断输赢以及停止落子,是否能够棋局重现等。分别进行人人对战、网络对战测试和人机对战测试,在网络对战测试的过程中,最好用两台不同的计算机分别作为服务器和客户端。测试结果:都正常运行。除了功能测试之外,还有非功能测试,例如程序运行的速度、安全性和界面视觉等,如果运行速度太慢,要找出影响运行速度的因素,例如程序算法的问题;如果程序运行不够稳定,可以在代码中加一些安全限制条件;如果界面不够美观,可以从颜色等方面进行调整。5.3 成果展示运行程序,显示开始界面菜单,按上下键,菜单选项上下游移,开始界面菜单如图5.3.1所示:图5.3.1 游戏开始界面菜单展示图当选择菜 “人人对战”功能的时候,就会进入如5.3.2所示的界面,光标最开始位于棋盘中央,当选择“人机对战”和“网络对战”的

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!