《Linux环境下五子棋游戏设计(毕业设计论文).doc》由会员分享,可在线阅读,更多相关《Linux环境下五子棋游戏设计(毕业设计论文).doc(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);/更新前景色和背景色mvaddstr(12, 70, CHESS);/显示当前所下棋子为白旗还是黑棋mvaddstr(x, y, CHESS);/在该坐标点下棋子wrefresh(g_win);/刷新usleep(650000);4.4 游戏功能模块4.4.1 游戏主要操作流程图程序主要分三个游戏模块人人对战,人机对战,网络对战,并将三个模块组合在一起,经过菜单操作,玩家可以任意选择
链接地址:https://www.31doc.com/p-4508448.html