基于Linux系统的五子棋游戏开发.doc_第1页
基于Linux系统的五子棋游戏开发.doc_第2页
基于Linux系统的五子棋游戏开发.doc_第3页
基于Linux系统的五子棋游戏开发.doc_第4页
基于Linux系统的五子棋游戏开发.doc_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大 连 民 族 大 学 本 科 毕 业 设 计(论 文)基于Linux系统的五子棋游戏开发学 院: 信息与通信工程学院 (系)专 业: 通信工程 学 生 姓 名: 隋志浩 学 号: 2012136219 指 导 教 师: 姚远 评 阅 教 师: 完 成 日 期: 2016年06月15日 大连民族大学基于Linux系统的五子棋游戏开发摘 要五子棋是一种两人对弈的纯策略型棋类游戏,通常对战双方分别使用黑色与白色两种棋子,下在棋盘上横向、纵向和对角线方向,最先完成5枚棋子相连的一方获得胜利。它最开始出现于古代中国,中期经高丽(朝鲜)传入日本得到了长足发展,在欧洲倍受人们的青睐。是一种极具趣味性和消遣性的游戏,其游戏规则通俗易懂,但游戏对战中棋局变化无常、难以捉摸,深受广大人们的喜爱。五子棋不仅能开发智力,锻炼我们的逻辑思维,而且蕴涵为人处事的道理,有助于磨炼我们的心性。随着游戏行业正在逐渐成熟并多元化,各种类别的游戏被安装进计算机中,前途一片光明。Linux操作系统图形化界面的出现,其使用越来越广泛。然而,Linux环境下的游戏处于一种缺乏状态,当你在Linux下工作的时候,休息期间玩一下游戏也是一种放松的方式。本系统的设计要求是一个能在Linux操作系统下运行,界面美观运行稳定且将来可能用于嵌入式移植的游戏。Linux操作系统为平台,使用GTK技术实现五子棋游戏的功能;通过Linux系统编程,GTK编程技术,五子棋游戏算法来实现趣味性地人机对战。关键词:Linux操作系统;GTK;五子棋游戏;人机对战- I -基于Linux系统的五子棋游戏开发Gobang game development based on Linux systemAbstractGobang is a game of pure strategy type two game,The two sides were usually use black and white pieces,Cross point on the chessboard line and horizontal line on the first 5 sub line wins. It originated in ancient China, the medium-term development in Japan, popular in Europe. The gobang is one kind the game which is widely liked the populace, its rule is simple, changeable, extremely rich interesting and recreational. Gobang is a puzzle game, it can enhance players thinking ability, improve intelligence, and high in philosophy, helps to ones self-cultivation. With the game industry is gradually mature and diversified, the future is bright, Linux operating system graphical interface, it is used more and more widely, however, under the environment of Linux game in a lack of state, when you in Linux work during rest play the next game is a relaxed way. The design requirements of the system is a Linux operating system to run and the interface is beautiful and stable operation and the future may be used for embedded transplant games.Linux operating system as a platform, using GTK technology to achieve Gobang game; through the Linux system programming, GTK programming technology, Gobang game algorithm to achieve interesting man-machine war.Key Words:Linux operating system;GTK; Gobang game; Man-machine war- IV -目 录摘 要IAbstractII1 绪论11.1 本课题选题依据11.2 课题国内外发展情况11.3 本课题设计的必要性与可行性21.4 本课题设计概述22 平台简介32.1 系统介绍32.1.1 Linux系统发展历程32.1.2 Ubuntu Linux操作系统32.1.3 Ubuntu Linux的特性42.2 开发工具52.2.1 VMware workstation简介52.2.2 C语言简介62.2.3 GTK简介62.2.4 Linux编译工具GCC简介73 开发环境的建立83.1 Ubuntu Linux的安装83.2 GTK环境的搭建104 程序设计与算法实现134.1 数据定义134.2 数据结构134.3 界面模块144.4 核心算法175 系统测试与成果展示215.1 系统流程215.2 系统测试215.2.1 界面功能测试215.2.2 输入功能测试225.2.3 游戏功能测试225.3 成果展示22结 论25参 考 文 献26致 谢27基于Linux系统的五子棋游戏开发1 绪论1.1 本课题选题依据五子棋是起源于中国古代的传统黑白棋游戏之一。五子棋不仅能开发智力,锻炼我们的逻辑思维,而且蕴涵为人处事的道理,有助于磨炼我们的心性。随着Internet的迅速发展,及市场强势地带动游戏产业的发展,国家政府部门也越来越重视游戏产业,它渐渐成为建设新文化事业的任务之一。根据Linux环境下游戏的开发以及五子棋游戏的广泛受众和经典程度。本课题基于Linux系统下进行开发,实现游戏五子棋的功能。随着计算机的飞速发展及游戏产业的逐渐成熟,各种各样的游戏被安装进计算机中。Linux操作系统图形化界面的出现,其使用越来越广泛。然而,Linux环境下的游戏处于一种缺乏状态,在Linux用户在经历长时间工作时,休息期间没有很好的游戏使其得以放松,做到劳逸结合,事半功倍。在Linux环境下开发游戏(以经典的五子棋为例)有其重要的经济价值和战略意义,与此同时,也可以借此课题对自己所学的知识进行一次综合的运用与拓展,加强自己的专业知识水平和综合运用能力以及实践动手能力1。1.2 课题国内外发展情况计算机发明后,人们就尝试运用其强大的计算与存储记忆能力来与棋坛高手对弈。1956年美国洛斯阿拉莫斯得研究人员首次编写了象棋对弈战胜一个刚入道6个月的棋手,但已经具有划时代的意义。在国内市场,2000年之前,游戏产业处于一种缺乏创新的状态。许许多多游戏厂商都是拿出一种模仿的姿态在做游戏。导致国外一些先进的发达的游戏公司迅速进入了中国的游戏市场并占有了很大的份额。此时国内游戏厂商不能进行很有效的合作,在外国游戏巨头的压力下,内部形成强烈的竞争,使得国产游戏的发展十分缓慢。近年来,随着政府出台了各种与游戏产业相关的条例、法规,作为一种新文化事业来鼓励国产游戏的发展。国内游戏开发商也致力于开发自主的拥有中国文化的游戏,中国游戏玩家数量与日俱增,这其中越来越多的玩家开始支持国产游戏,这些都表明着,国产游戏的寒冬已然过去,国内娱乐游戏业的不断成熟与壮大。在国际上,由独立自由的软件和开放免费的源代码组成的例子就是Linux操作系统。现在Linux操作系统可以被安装到多种硬件设备中,从个人PC机到企业、政府的办公设备甚至与嵌入式相关的硬件设备。Linux操作系统所具有的优势及潜能不断被人们开发利用,在人们的生活中渐渐占据了一定地位。随着Linux系统的完善与稳定,普通电脑用户尝试接触Linux系统的数量日益增高,部分电脑厂商发现商机开始在其销售的电脑上可以为用户免费安装Linux,在桌面电脑操作系统的市场中Linux也慢慢地占据一席之地。低成本、开放、免费这些都成了Linux操作系统的代名词,符合嵌入式开发的理念,在嵌入式市场拥有绝对优势,广泛地受到了用户的好评。KED和GNOME等桌面系统使Linux完全不同于依赖CLI(Command Line Interface,命令行界面)控制的Unix操作系统,它更像一个Mac或Windows之类的操作系统,能提供完善的提醒用户界面,给用户更好的桌面体验2。1.3 本课题设计的必要性与可行性选择必要性:随着经济的快速发展,人们生活的步调日益加快,计算机的地位在人们的生活中已越来越重要,基于各种操作系统的娱乐游戏也越来越多、越来越大众化,成为人们日常生活中密不可分的一部分。而随着人们生活品质的提高,电脑游戏也越来越多元化,五子棋就是其中一种。这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人。该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具。选题可行性:本系统的设计要求是一个能在Linux操作系统下运行,界面美观运行稳定且将来可能用于嵌入式移植的游戏。综合考虑选择C语言与GTK技术来实现本系统。C语言是一门成熟的高级语言,可用于开发各种系统,也可用于开发游戏系统。GTK是Linux下的一个图形化编程工具,其开发出来的程序能在装有GTK环境的Linux系统下顺利运行3。1.4 本课题设计概述在本课题中,通过对五子棋游戏发展背景的调查以及Linux系统下小游戏开发的了解;以Linux操作系统为平台,使用GTK技术实现五子棋游戏;通过Linux系统编程,GTK编程技术,五子棋游戏算法来实现趣味性地人机对战。2 平台简介2.1 系统介绍2.1.1 Linux系统发展历程Linux是一种类似Unix的操作系统,但它具有可以自由传播和无偿使用的特点。它开放全部的源代码以供用户进行完善修改并且可以被移植到各种各样的硬件平台。Unix作为一种经典的操作系统,在1969年最开始由贝尔实验室的计算机科学学者Ken Thompson和Dennis Ritchie提出并研发成功,但出于它对源代码知识产权的保护,它价格十分昂贵,对一般计算机用户而言,是难以接受的。早期,Linux是由赫尔辛基大学的一位叫Linus Torvalds的芬兰大学生独立设计的。当时他有一台Intel386计算机,而他手上的Minix却不能很好地在他的计算机上运行。于是他开始修改Minix。经过几个月的努力,基本完成了目标。此时他发现,他几乎实现了一个新操作系统的原型。1991年10月,Linus把Linux(意为Linus的Unix)放到FTP服务器上供其他人自由下载。Linus允许他人免费使用Linux的源代码,并且鼓励大家对其进行修改和完善。这一举动,使得盈千累万来自不同地区不同国家程序员的不懈努力下,Linux得到了转折性的发展。目前,Linux产品存在的版本可谓不胜枚举,其中比较著名的有Red Hat、Fedora、Debian、Ubuntu、SUSE、Slackware、Mandriva、TurboLinux及Gentoo等。尽管这些系统在安装操作和界面外部表现等方面有所不同,但其内部采用的Linux内核、标准实用程序等基本一致,具有很多共性4。2.1.2 Ubuntu Linux操作系统Ubuntu Linux系统是众多Linux发型品牌之一。在Linux领域中,Ubuntu只是一个后起之秀,是一个新兴且潜力巨大的Linux发行品牌,用了短短几年的时间Ubuntu就发展成为一个流行的、成熟的、以及桌面环境丰富的Linux的系统,受到了从Linux初学者到资深专家的大批Linux用户的追捧。Ubuntu是一个古老的非洲词汇,表示人类之间的关怀、共享、和谐。它作为一种理念,倡导个人,文化以及民族之间的融合、博爱与相互合作。2.1.3 Ubuntu Linux的特性1. 多用户Linux系统具有许多系统都不具有的特性,它可以使许多用户操作同一台电脑,并且他们在使用自己的操作时不会影响到其他用户的进程。并且用户与用户之间都能够顺畅地沟通与交流。但是为了防止在使用过程中,用户不经意或故意地篡改别的使用者的系统资源,所以使用不同功能的用户具有不同的使用权限。2. 多任务支持多个任务或多个进程的执行是时下操作系统所必须具备的特点。在用户操作计算机时,能够顺利执行多种操作,运行更多软件程序,提高工作效率。而且保证任务操作及软件程序很好并行,互不影响。3. 多平台作为一种源代码开放免费的操作系统,可以很好地移植到各种平台。作为一种应用广泛的操作系统它不仅可以在个人计算机上流畅地运行,还可以兼容在不同规模各类设备上。同时,它的运作不受CPU数量的限制,不论在32位还是64位上都有较为突出的运行状态。4. 用户界面为了适用不同的使用范围,Linux提供了两种不同的操作界面。当我们需要进行脚本功能编写时,可以进入字符界面通过键盘录入命令来使计算机运行。当我们需要便捷的操作时,也可以进入图形界面,通过鼠标的操作来传达指令,完成所需要的用户操作。5. 网络功能因为Linux系统强大的内置网络功能,所以它在信息传输和互联网功能的使用有着非同寻常的表现。导致越来越多的用户选择使用Linux系统。6. 安全性在时下对于计算机的使用过程中,安全性一直是被人们所重视的问题。在系统的运行过程中,使用了各种各样的措施来保证用户的隐私和重要资料,提高系统的稳定性。在融合了Unix操作系统的优势后,Linux具有了更稳定更高效地运行状态。所以以这种系统搭建的服务器平台数量与日俱增。7. 可移植性因为Linux系统强大的适应能力,使得它可以在各种平台上运行。为了方便的用户的使用,它具有了良好的可移植性。这样就可以轻松地进行移植,比如,从一台个人计算机上移植到另一台硬件设备上。8. 开放和免费为了面向更多的用户和更广阔的使用范围,Linux系统开放了操作代码,我们可以轻松的在网上查找到Linux的操作核心内容,这样可以根据自己的需求,去进行不同程序的编写和调试。相比于其它系统的收费使用,无偿的Linux毫无疑问可以让我们通过更低的代价来获取更多的内容5-10。2.2 开发工具2.2.1 VMware workstation简介VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业的 IT开发人员和系统管理员而言,VMware在虚拟网路,实时快照,拖曳共享文件夹,支持 PXE 等方面的特点使它成为必不可少的工具。VMware Workstation作为时下一款综合表现优异的桌面虚拟计算机软件,以供用户选择安装的操作系统种类繁多,甚至包括每一种操作系统所发行的各个版本。在合理分配内存的情况下,它还可以在一台计算机下安装多个虚拟化的操作系统。每个所安装的虚拟的操作系统可以做到独立的运行互不干扰。同时,在虚拟机运行的状态下,可以简单快捷地回到物理机的操作系统,两个操作系统直接可以做到很好的隔离。操作界面简单明了,支持中文,适用各种计算机领域的用户11。2.2.2 C语言简介C语言是最早由贝尔实验室的Dennis Ritchie设计并实现。同时Dennis Ritchie也是Unix操作系统的主要设计者之一。C语言是目前国际上为万千程序员广泛使用并具有完整体系的计算机语言。在熟练掌握C语言的情况下,我们不仅可以利用它来编写一些应用软件,还是进行系统的程序开发,完善系统更好地服务我们的生活与工作。Linux、Unix操作系统本身都是用C语言开发。我们每天都可以用到的Windows操作系统其大部分代码也是有C语言进行开发的。C语言的绘图能力强,具备可移植性,编译方式简易,数据处理能力强,因此适于编写系统软件,三维,二维图形和动画。它是一种数据类型丰富、应用灵活方便的高级语言。C语言具有以下特点:1. 两重性C语言具有汇编语言的部分特性。它可以对计算机最基本的工作单元(位、字节、地址)进行操作;也可以对物理地址直接访问,对硬件进行操作。具有高级语言的基本结构和语句。2. 结构化结构化语言落实到软件的编写,系统的开发上就是实现程序的模块化,这也是结构化语言的一个显著特点。即程序的各个部分除了必要信息交流外相对独立,因此各个部分开发单独开发和测试,这样的编程易于他人的阅读,自身的整改与维护,大大提高工作效率。 3. 与Linux紧密结合Linux操作系统本身是由C语言开发的,在Linux上用C语言开发的程序运行效率很高,可以实现无缝结合。相比之下,在某些对性能要求很高的领域,C语言是首选。4. 可移植性C语言编写的程序基本可以不用做任何修改,就可以在不同硬件平台或操作系统上运行12-16。2.2.3 GTK简介GTK(GIMP Toolkit)是一套跨多种平台的图形工具包,按LGPL许可协议发布的。虽然最初是为GIMP写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被GNOME选中使得GTK+广为流传,成为Linux下开发图形界面的应用程序的主流开发工具之一。当然,GTK+并不要求必须在Linux上,事实上,目前GTK+已经有了成功的windows版本。GTK虽然是用C语言写的,但是同样可以使用你所熟悉的语言来使用GTK,因为GTK+已经被绑定到几乎所有流行的语言上,如:C+,PHP, Guile, Perl,Python,TOM, Ada95,Objective C, Free Pascal,and Eiffel。2.2.4 Linux编译工具GCC简介GCC是一个用于Linux系统下编程的编译器。GCC=GNU Compiler Collection,是由Stallman所开发的Linux下的编译器,可以编译的语言包括:C,C+,Objective-C, Fortran,Java,Ada等。不过,现在GCC也有了许多Win32下的移植版本。如今的GCC借助于它的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。本课题选用Ubuntu Linux操作系统,Ubuntu的桌面环境是gnome,gnome是使用GTK+编写,所以选用GTK来进行环境的搭建。运行环境不需要另外配置,即可直接安装开发所需要的环境。同时,Ubuntu Linux操作系统是已经默然安装GCC17。3 开发环境的建立3.1 Ubuntu Linux的安装Ubuntu Linux系统既可以独立安装,也可以与Microsoft Windows系统安装在同一台计算机中把Ubuntu Linux安装到Windows系统未占用的磁盘分区中。需要注意,在选择安装Linux与Windows双系统时,我们首先要在计算机上安装Windows操作系统并测试运行,再进行Linux系统的安装,否则会导致所安装的Ubuntu Linux操作系统无法正常启动使用。考虑到实用性而言,本课题设计以虚拟机的形式安装Ubuntu Linux操作系统。安装前的准备如下:1. 硬件要求不同的系统与版本对硬件要求不尽相同。表3-1以桌面版Ubuntu Linux为例,给出相对合理的基本硬件要求,其中主要包括CPU、内存、磁盘空间等。表3.1 硬件系统要求硬件系统要求简单说明CPU至少选用1.0GHz的Intelx86系列CPU或更快的CPU内存至少配备256MB内存或更多内存磁盘及磁盘分区68GB的磁盘空间或更多VGA显卡/显示分辨率分辨率1024*768像素引导设备CD/DVD驱动,USB移动盘或其他安装方式2. 磁盘分区安装Ubuntu Linux系统时,至少需要两个磁盘分区,分别用于创建“/”文件系统与交换分区。如果是一个多用户系统,且系统配有足够的磁盘存储空间,最好划分多个磁盘分区,每一个磁盘分区创建单独的文件系统,如/usr、/var和/home等文件系统。表3.2 磁盘分区的要求文件系统最小容量要求建议容量分配/250MB2GB/usr1.5GB2GB以上/tmp50MB1GB且小于单独的文件系统分区/var500MB2GB以上/home2GB取决于用户数量与数据空间的要求/boot100MB100MB3. 安装方式Ubuntu Linux系统的安装方式尤其灵活,可以采用不同方法的进行引导安装。本课题以虚拟机的形式进行安装,首先安装VMware Workstation(中文名“威睿工作站”),在网易开源镜像站下载ubuntu-12.04.5-desktop-amd64的ISO映像文件。在VMware的基础上,通过ISO映像文件,安装Linux系统。运行成功截图如下: 图3.1 Ubuntu Linux系统运行界面3.2 GTK环境的搭建在Linux系统下的文本编辑器操作方便,对于习惯使用Windows系统的用户来说,是一个不错的选择。与在Windows系统的操作大致相同,右键选项新建一个文本即可。对于编译器GCC(GNU Compiler Collection)的选择,除了其功能强大、简单灵活的特点之外,还因为它能支持各种不同的硬件平台。具有了交叉编译的功能,即在一个平台下编译另一个平台的代码,这样为后期代码的编译与调试提供的便利。可以编译多种语言,包括:C,C+,Objective-C,Fortran,Java,Ada等。由于桌面环境gnome,运行环境不需要另外配置,要做的是安装即可18。在终端下输入这些命令进行完善(有网络可用状态): 1. 安装gcc/g+/gdb/make等基本编程工具。$sudo apt-get install build-essential2. 安装 libgtk2.0-dev libglib2.0-dev等开发相关的库文件。$sudo apt-get install gnome-core-devel3. 用于在编译GTK程序时自动找出头文件及库文件位置。$sudo apt-get install pkg-config4. 安装 devhelp GTK文档查看程序。$sudo apt-get install devhelp5. 安装 gtk/glib 的API参考手册及其它帮助文档。$sudo apt-get install libglib2.0-doc libgtk2.0-doc6. 安装基于GTK的界面GTK是开发Gnome窗口的c/c+语言图形库。$sudo apt-get install glade libglade2-dev或者$sudo apt-get install glade-gnome glade-common glade-doc7. 安装gtk2.0 或者 将gtk+2.0所需的所有文件统通下载安装完毕。$sudo apt-get install libgtk2.0-dev或者$sudo apt-get install libgtk2.0*最后,用测试程序进行编译运行。图3.2 GTK环境安装与完善测试程序:/Helloworld.c#include int main(int argc,char *argv) GtkWidget *window; GtkWidget *label; gtk_init(&argc,&argv); /* create the main, top level, window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* give it the title */ gtk_window_set_title(GTK_WINDOW(window),Hello World); /* connect the destroy signal of the window to gtk_main_quit * when the window is about to be destroyed we get a notification and * stop the main GTK+ loop*/ g_signal_connect(window,destroy,G_CALLBACK(gtk_main_quit),NULL); /* create the Hello, World label */ label = gtk_label_new(Hello, World); /* and insert it into the main window */ gtk_container_add(GTK_CONTAINER(window),label); /* make sure that everything, window and label, are visible */ gtk_widget_show_all(window); /* start the main loop, and let it rest until the application is closed */ gtk_main(); return 0;经编译器GCC无误,运行结果如下:图3.3 测试程序运行4 程序设计与算法实现4.1 数据定义1. 用一个二维数组,表示棋子,首先初始化均为空的。 int i, j; for(i=0; iNUM;i+) for(j=0; jwindow, &x1, &y1, &state);3. 对游戏结果的判定。if(winflag=0) rtn = play(CURTOROW(x1), CURTOROW(y1), &x2, &y2);/如果当前没有谁输赢的话,就通过play函数,计算出电脑当前应该是放什么位置/其中x2,y2就是电脑的坐标,x1,y1就是用户的坐标。这个返回值rtn表示比赛结果,有五种情况 ,小于0表示平局。/等于0,表示当前没有是没有输赢,属于正常情况,还可以继续下。等于1表示电脑赢,等于2表示玩家赢。等于3表示用户放的位置不符合游戏规则。 if(rtnwindow; gc = widget-style-fg_gcGTK_WIDGET_STATE(widget); color.red = 65535; color.green = 47545; color.blue = 2855; gdk_gc_set_rgb_fg_color (gc, &color); for(i=0;iDRAWING_AREA_WIDTH;i+) gdk_draw_line (canvas, gc, 0, i, DRAWING_AREA_WIDTH, i); color.red = 25723; color.green = 26985; color.blue = 5140; gdk_gc_set_rgb_fg_color (gc, &color); for(i=0; i=DRAWING_AREA_WIDTH; i+=SIZE) gdk_draw_line (canvas, gc, i, 0, i, DRAWING_AREA_HEIGHT); for(i=0; i=DRAWING_AREA_HEIGHT; i+=SIZE) gdk_draw_line (canvas, gc, 0, i, DRAWING_AREA_WIDTH, i); for(i=0; iNUM; i+) for(j=0; jNUM; j+) if(arrayij=HUMAN) color.red = 65535; color.green = 65535; color.blue = 65535; gdk_gc_set_rgb_fg_color (gc, &color); gdk_draw_arc (canvas, gc, TRUE, ROWTOPOS(j), ROWTOPOS(i), CMANSIZE, CMANSIZE, 0, 360*64); gdk_draw_arc (canvas, gc, FALSE, ROWTOPOS(j), ROWTOPOS(i), CMANSIZE, CMANSIZE, 0, 360*64); 2. 创建游戏对话界面,设定棋盘大小,标题。GTK+就是GIMP工具包,它把GDK提供的函数组织成对象。大部分对象是可显示对象,例如按钮、标题、文本、输入输出窗口,其中一类对象称作小部件(widget)。带有标准接口,提供颜色、尺寸、位置、鼠标、键盘、字体等必须的项目。函数gtk_window_new执行游戏界面创建的命令,在由函数gtk_widget_set_usize对所创界的界面进行尺寸的设置。最后再调用gtk_drawing_area_new()对所建立的窗口进行区域绘制。 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize(window, WINWIDTH, WINHEIGHT); gtk_container_set_border_width(GTK_CONTAINER(window), WINDOW_BORDER_WIDTH); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_title (GTK_WINDOW(window), 五子棋); /对建立窗口进行命名 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);g_signal_connect_swapped(G_OBJECT(window), destroy, G_CALLBACK(gtk_main_quit), G_OBJECT(window); drawing_area = gtk_drawing_area_new();gtk_widget_set_size_request(drawing_area, DRAWING_AREA_WIDTH, DRAWING_AREA_HEIGHT);4.4 核心算法根据棋局的形式,判断下一次的落子会形成的棋形,遍历全盘找出最优的落子位置。并且为每一次的可能落子位置计算其重要程度(用后面所说的分值来替代)。遍历棋盘未落棋子位置,比较玩家落子的最大分值的点和机器落子的最大分值的点,来找出最佳的落子位置,最重要的落子点。在对战进行的过程中,如果机器落子的最大分值比玩家落子的最大分值要小,呈现劣势对局,机器会优先把棋子落入玩家的最大分值点的位置上(玩家最有可能获胜的位置),称其为防守;反而言之,如果机器落子的最大分值比玩家要大,呈现优势对局,机器就会将棋子置入自己最有可能获胜的位置上,称其为进攻。通过调用judgePoint判断是否有单行连子、双行连子。int judge(int player, int num, int *x2, int *y2) int i, j, drY, drX, tmp, op; op = (player=HUMAN) ? COMPUTER:HUMAN); for(i=0; iNUM; i+) for(j=0; jNUM; j+) if(arrayij!=player) continue; if(judgePoint(player, num, 1, i, j, x2, y2)=1) return 1; for(i=0; iNUM; i+) for(j=0; jNUM; j+) if(arrayij!=player) continue; if(judgePoint(player, num, 3, i, j, x2, y2)=1) return 1; return 0;用户放了一个棋子之后,先判断电脑有没有4个连续单行棋子,有的话就直接放入凑到5个,则电脑获得胜利;如果等于0,即电脑没有连续4个的单行棋子,再判断用户有没有连续4个的,有的话,进行防守。如果等于0,则继续判断电脑有没有连续3个的单行棋子,凑成4个连续单行棋子,如果没有,则继续判断用户有没有连续3个的单行棋子,进行防守用户。反之,如果用户也没有,判断电脑有没有双行凑成3个的棋子,如下双行凑成三连棋子的情况: 图4.1 双行三连子展示如果电脑有,则放入。如果等于0,没有的话,判断用户有没有这样的情况,进行防守用户。如果用户也没有。接下来可以不用防守用户,电脑再继续下棋,先看是否有双行2棋子,如果没有。就看电脑是否有连续两个单行棋子。如果电脑没有就在用户的周围放下一个位置,即firstStep。如果用户周边不能放棋子了,就是平局。说明棋子已经满了。if(judge(COMPUTER, 4, x2, y2)=0) if(judge(HUMAN, 4, x2 , y2)=0) if(judge(COMPUTER, 3 , x2, y2)=0) if(judge(HUMAN, 3, x2 ,y2)=0) if(forcast(COMPUTER, 3, x2, y2)=0) if(forcast(HUMAN, 3, x2, y2)=0) if(forcast(COMPUTER, 2, x2, y2)=0) if(judge(COMPUTER, 2, x2, y2)=0) if(firstStep(x1 ,y1, x2, y2)=0) return -1; if(isWin(HUMAN)/判断是不是用户赢了 return HUMAN; if(isWin(COMPUTER)/判断是不是电脑赢了 return COMPUTER; return 0; int isWin(int player) int i, j, drY, drX; for(i=0; iNUM; i+) for(j=0; jNUM; j+) if(arrayij!=player) continue; for(drY=-1; drY2; drY+)/drX,drY表示方向,如:(drY=0;drX=1.表示当前棋子的正右边方向) for(drX=-1; drX2; dr

温馨提示

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

评论

0/150

提交评论