JAVA课程设计 五子棋

时间:2024.4.13

 


攀枝花学院课程业设计

五子棋

学生姓名:                     

   号:               

所在院()     数学院计算机学院     

     业:      信息与计算科学     

师:        讲师   

二〇##年

攀枝花学院教务处制


攀枝花学院本科学生课程设计任务书

注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表

摘  要

五子棋作为一类棋类竞技运动,现在很流行,很多人把它作为一类开发智力的一种游戏,锻炼人的思维。这次课题主要是完成人机对战,在对战中电脑根据人的思维做出相应的反应,电脑对战中通过深度的搜索,使得自身有更大的胜算,估值计算也是一种方法,可以提高电脑的智能度。分析模块中影响智能的因素也不少,通过节点比较与节点连接后的结果做出估计提高智能,了解递归算法、电脑学习等对此有很大帮助。算法是程序的灵魂,一旦算法正确那么程序将很好。不同的人工智能将会有不同的帮助,多去了解将更能提高智能程度。五子棋是我国的一门文化,这将使得它更受世界人们的欢迎。有助我国文化发展。

关键词 五子棋,智能,算法,模块,人机对战


目录

1 需求分析..................................................................... 1

1.1需求来源.................................................................... 1

1.2设计目的.................................................................... 1

2 功能需求分析................................................................. 1

2.1功能需求.................................................................... 1

3 设计与实现................................................................... 2

3.1设计思想.................................................................... 2

3.2系统模块结构................................................................ 2

3.3流程图...................................................................... 2

4 概要设计..................................................................... 4

4.1抽象数据类型定义............................................................ 4

4.2程序包含模块................................................................ 4

4.3模块间关系.................................................................. 4

4.4系统功能实现................................................................ 4

5 模块设计..................................................................... 5

5.1主界面模块.................................................................. 5

5.2选择模块.................................................................... 5

5.3判断模块、.................................................................. 5

5.4显示模块.................................................................... 5

参 考 文 献.................................................................... 9


1 需求分析

1.1需求来源

计算机在我们的生活中有越来越重要的角色,我们也越来越离不开计算机,计算机带给我们许多便利,学习好计算机知识已经是必不可少的一项技能了。特别是电子商务、电子邮件等,人工智能现在的热点方向,人们感叹计算机的高效是也感叹自己的聪明,人工智能现在是很好的以方面。

1.2设计目的

该软件为用户提供一个在Windows系统上运行的五子棋游戏小系统。应达到的目的是:建立人机对战的模块,可以机器思考如何应对。已达到提高智力的效果

设计出五子棋的游戏界面,创建对象可以在地图中站位,在每一步后计算机会自己运算自己的下一步,任何一方不可以越界,当一方达到五子是判断谁是胜利者,在过程中尽量使得游戏智能程度更高。

 

 

2 功能需求分析

2.1功能需求

现在研究五子棋的算法已经很多了,比较经典的有递归、二叉树等,这也是很基础的,不同算法要求也不同,要求的能力也不同,每一种算法都是使得程序清晰明白,当五子相连就算胜利。故我们要理解中间过程。

每个代码实现功能也是不同的,有的是判断,有的是理解,有的是更好知道程序,程序在执行时我们可以知道哪里出错。哪里会有问题,修改便利。、在错误中学习,加强自己的基础知识与算法的能力。

3 设计与实现

3.1设计思想

对五子棋进行模块合理需求分析后,在思考整体布局,首先是如何进行设计与开发的思维,在此基础上用图表画出大体的框架图,在进行合理的模块划分,并用框架图画出,在分模块实现。

总体思维:首先是整体的框架地图,在然后是游戏上的功能键设置,功能选项设计,在游戏开始后棋手与电脑的对战,在胜利的时候做出判断(即五子相连时可以有结束提示);关键是电脑部分要尽量智能,保证游戏价值。

3.2系统模块结构

系统模块结构:大概分为界面模块、功能模块、判断模块、主要也就是判断模块,在棋手或者电脑达到五子时给出正确的结果,及在开始前就要有功能选择,保证在功能选择部分设计。大体模块如下图。

 

3.3流程图

 

 


4 概要设计

4.1抽象数据类型定义

(1)对界面设计,可以选择界面的大小。

public ChessFrame() {

界面的窗口设计}

(2)主要的框架设计和参数

public JMenu makeMenu(Object parent, Object items[], Object target){

}

(3)判断分析

publicboolean judgeSuccess(int x,int y,boolean isodd){

是否五子相连

}

4.2程序包含模块

界面模块public ChessFrame()

{}界面窗口的大小选择,显示界面。

地图范围模块

publicvoid MapSize(int w,int h){

限制游戏者的游戏范围}

结束模块

publicboolean judgeSuccess(int x,int y,boolean isodd){

是否五子相连}

4.3模块间关系

 

4.4系统功能实现

要实现五子棋游戏关键是地图设计与功能设计,选择地图与谁先开始是一个关键,先要进行选择,进行后,要判断谁先达到五子,保证谁胜利。

5 模块设计

5.1主界面模块

该模块主要是进行显示地图大小,限制地图的长与宽,保证游戏者的棋子不会超过范围,可以正常的进行游戏。

5.2选择模块

主要进行选择功能,选择地图的大小,游戏者谁先进行游戏。

5.3判断模块、

主要是判断谁先达到五子,判定达到五子的为胜利,在判断的过程中每一步都进行判断,一直到谁最先到五子相连,后一步都不可以。

5.4显示模块

就是界面显示的一部分,用于显示结果。

测试与运行

开始前的界面

功能选择

开始后的界面

最后的结果

结 论

通过这次设计,使我在java的运用有新的理解、java的选择应用、算法的设计及其实现等方面加深了对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在此之前,我脑袋里面没有java思想,java在我心中就是对象的创建。当时就感觉好难,什么也不能做,但是真正接触后并没有想象的那么难,有什么不懂的上网去搜索,这是一个信息横流的世界,有google,baidu就没有不能解决的知识难题。在网上搜索点有关的资料后,然后再利用自己在课堂上所学的知识,与和我一组的同学讨论并且将所有内容连接起来,所有问题就迎刃而解。课程设计是以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题就要及时主动与指导教师沟通。在老师的悉心指导下和同学们的帮助下,使我顺利地完成了此次课程设计。所以,要特别感谢指导老师和各位同学,我相信这次课程设计将会是我以后不管是工作还是学习不可多得的经验。


参 考 文 献

[1]朱福喜.《Java语言程序设计》(第二版).科学出版社

[2]陈国君等.《Java程序设计基础》(第二版).清华大学出版社

[3] Deitel.《Java大学基础教程》(第六版).电子工业出版社 

[4] MaryCampione.《Java语言导学》(第四版).机械工业出版社

[5] Y.Daniel Liang.《Java语言程序设计基础篇》(第六版). 机械工业出版社

[6] Kathy Sierra.《Head First Java》(第二版).东南大学出版社


第二篇:大学毕业论文 基于Android的五子棋游戏设计


基于Android的五子棋游戏设计

软件工程

【摘 要】本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,而且富含哲理,有助于修身养性。本系统是本系统中设定了人机对战和人人对战两种模式。人机对战实现的是一些简单的算法,人人对战只是进行了输赢方的判定。它与javame的五子棋设计有许多的不一样,Android本来就是全触摸的形式,而且操作非常简单。

【关键词】机器人, 生命周期,算法,线程

The five in a row game based on Android

【Abstract】 This paper mainly expounds the object-oriented program development in eclipse for language development tool, smartphone Android based on above design a five in a row game. Gobang originated in China ancient traditional black white kind, it not only can enhance one of thinking capacity, improve intelligence and high in philosophy, helps to cultivate one's morality raises a gender. This system is the system that set the man-machine against and everyone against two patterns. The realization man-machine against some simple algorithm, everyone was against just win the judgement of the party. It has with the javame gobang chess design many are dissimilar, Android is the entire touching form originally, moreover operates is simple.

【Key words】 Android,Activity, arithmetic,Thread

- 1 -

目 录

绪论 ........................................................................ 4

1 开发概述 .................................................................. 5

1.1 背景 ................................................................ 6

1.2 课题来源 ............................................................ 6

1.3 国内外研究现状 ...................................................... 7

1.4 论文主要工作 ........................................................ 7

2 Android的开发环境 ........................................................ 8

2.1 操作系统 ............................................................ 8

2.2 Android开发环境 ..................................................... 8

2.3 Android开发环境变量配置 ............................................. 8

2.3.1 jdk的配置 ..................................................... 8

2.3.2 sdk的配置 .................................................... 10

2.4 eclipse设置 ........................................................ 10

2.5 Android开发环境配置最终步骤 ........................................ 11

3 Android应用程序核心 ..................................................... 11

3.1应用程序基础 ........................................................ 11

3.2 应用程序组件 ....................................................... 12

3.2.1、活动(Activities) ........................................... 12

3.2.2、 服务(Services) ............................................ 15

3.2.3、广播接收者(Broadcast receivers) ............................ 15

3.2.4、内容提供者(Content providers) .............................. 16

4相关技术概念 ............................................................. 17

4.1坐标布局(AbsoluteLayout) .......................................... 17

4.2 Intent ............................................................. 18 - 2 -

4.3 AlertDialog ........................................................ 20

4.4 相关的算法研究: ................................................... 20

4.4.1相关的数据结构 ................................................ 20

4.4.2分析规则 ...................................................... 21

4.4.3胜负判断 ...................................................... 23

4.4.4算法实现描述 .................................................. 23

5.实现运行情况,以及各个模块的截图 ......................................... 25

5.1概要设计: .......................................................... 25

5.2.1 游戏主界面: .................................................. 26

5.2.2新游戏界面: .................................................. 27

5.2.3 帮助界面 ...................................................... 27

5.2.4 关于五子棋介绍界面 ............................................ 28

5.2.5 五子棋的退出: ................................................. 29

总结 ....................................................................... 30

参考文献 ................................................................... 31

附录 ....................................................................... 32

- 3 -

绪论

智能手机(Smartphone),具有独立的操作系统,像个人电脑一样支持用户自行安装软件、游戏等第三方服务商提供的程序,并通过此类程序不断对手机的功能进行扩充,同时可通过移动通讯网络来实现无线网络接入。目前,全球多数手机厂商都有智能手机产品,而芬兰诺基亚、美国苹果、加拿大RIM(黑莓)、美国摩托罗拉、中国台湾宏达(htc)更是智能机中的佼佼者。

智能手机具有五大特点:1. 具备了无线接入互联网的能力,即要有GSM的支持网络下的GPRS或者是CDMA网络支持下的CDMA 1X或3G网络。2. 人性化,可以根据个人需要扩展机器的功能。3. 它是具有开放性的操作系统,还可以安装非常多的应用程序,使得智能手机的功能可以得到无限的扩展。4. 具有PDA功能,其中包括个人信息管理、日程记事、任务安排、多媒体应用、浏览网页。5.强大的功能,扩展性能强,第三方软件支持多。

Android的诞生:从时间要追溯到 二零零三年,在参与到 Android 的传奇之前,它的创始人Andy Rubin 在周刊中这么说过:“在开发对于用户位置以及状态更加敏感的移动设备方面存在着巨大的潜力”,他还说过:“很快他们就会在消费类产品中使用这些位置信息,如果开发者足够聪明的话。”现在看起来他自己都没想到他的预言是多么的准确:实际上,移动领域将会发生巨变,从而催生出我们从未见过的强大的智能手机。到二零零

五 年有很多关于 Google 即将进军移动设备制造领域并专注于制造基于位置服务的手机的谣传,但最大的障碍就在于 Google 没有自己的可以达成这个目标的平台。

在二零零五 年 七月,Google收购了 Android,这么一个小规模收购行动还是立刻引起了移动业界的兴趣,它们怀疑这是 Google 进入移动市场的的标志。尽管如此,这个当时只是一个小规模的移动软件开发公司正是由 Andy Rubin、Rich Miner、Nick Sears 以及 Chris White 四个人共同创建的。现在看来,他们的怀疑是正确的。差不多两年半以后,在 二零零七 年 十一 月 五 日,Google发布了Android,它这个的发布给移动业界带来了一场可怕的风暴,,基于 Linux的全新移动操作系统。这不单单是一个全新的移动 - 4 -

系统,非常重要的是:它是开源的。

这是当时新成立的开放手机联盟整合下的成果,诸如 Google、HTC、Intel、Sprint-Nextel、T-Mobile 以及 NVIDIA 都是这个联盟的成员,该联盟的目的就是要创立移动设备的开放标准。第一款搭载 Android 系统的手机是 2008 年 9 月由 T-Mobile 发布的 G1,它拥有 GPS 功能,3.1M 摄像头,以及一系列的 Google 应用。G1 的面市,正式拉开了 Google 以及整个移动业界激动人心的大冒险的序幕。

Android 操作系统版本

Android 1.1 (发布于 2009 年 2 月)

Android 1.5 “Cupcake” 这是第一个主要版本,发布于 2009 年 5 月.这个升级之后,它的更新给用户带来了新的体验。用户界面得到了极大的改良,并且增添了以下功能。 Android 1.6 “Donut” 2009 年 9 月发布。搭载Android 1.6 的 HTC Hero 获得了意想不到的成功。使得原来用许多都没有用过Android的人都对Android非常的关注,并且也让竞争者苹果和微软更加警惕了。

Android 2.0/2.1: 2009 年 10 月 26 日,又一个主要版本升级以创纪录的速度放出。这次,大版本升级到了 Android 2.0/2.1 “Eclair.”。

Android 2.0.1 SDK 在 2009 年 12 月 3 日发布出来,后来是2010 年 1 月 10 日发布的2.1 版本。很多围观群众和用户可能会有点奇怪:“Android为什么会被用甜点作为它系统版本的代号?”,其实这个命名方法开始在 Andoird 1.5 发布出来的时候。每一个版本代表的甜点的尺寸就越变越大,然后按照字母的数序:小蛋糕,甜甜圈和松饼。在这之前人们预计 2.2 版本的代号可能是“馅饼”,但这个最终被证明是错误的,“FroYo”(冻酸奶)才是 Android 2.2 这个伴随 Google Nexus One 发布的新版的最新代号。而下一个版本的代号将会是“姜饼”。Android 2.2 “Froyo”: Nexus One 的用户已经开始接受 Android 2.2 “FroYo”的无线更新,其它机型的用户可能会在短时间内获取到这一更新的。这一版本的更新出来会让大量让其他手机用户垂涎三尺。

有关的消息众口一词声称 Android 3.0 “Gingerbread”,Google 将会在今年秋天的某个时候发布出来,它将带来给用户新的体验。

从 Android 的发展旅途中,我们看到 2003 年 Andy他是一个有远见的人,看到了 2005 年的起步和被 Google 的收购,也看到了系统的进步以及新的机型的快速发布。所有这一切都让我们相信,Android 将会走向世界第一移动操作系统宝座的步伐是势不可挡的。Android 平板电脑也在今年的夏天开始发布以及 Google TV 发布以后(也许还有 Google Music?),Android 可能真的会将继续带着我们走向移动设备梦想的彼岸。

1 开发概述

在手机游戏的早期,大多数开发者都是想要玩转设备、学习技巧和快速攻关的狂热分 - 5 -

子。但是,随着更多的开发者加入这个行业,手机游戏已经进化成涉及到专业设计师、构造师、开发者、产品经销商、律师、和艺术家在内的主导产品。这是行业走向成熟的必然趋势。尽管在某人的业余时间内要开发和推销简单的游戏更加困难,但是更多的专业商店将为许多人提供更多的就业机会。

从手机软件的平台的种类,游戏玩家的心理,未来移动通信服务终端的发展,3G手机网络对手机软件游戏的影响,还有从J2ME手机游戏开发平台介绍的手机游戏的趋势和未来这种游戏的运营模式,这几方面的内容来看,手机游戏是未来游戏发展的趋势,其移动性、互连性,必定会带来网络游戏的风暴,这就使我们对这一个新兴的领域有了一定的概念,对指导我们建立一个手机软件开发培训的知识结构有一定的帮助,也是我们的一个发展契机。

1.1 背景

在我们的生活中有许多的游戏,但是游戏不同,它也会给玩家带来不同的感受和生活理念。游戏是我们日常生活的一个必不可少的娱乐项目,也带动了游戏相关产业市场的发展。游戏平台是经过从游戏机到电视游戏,然后从到pc游戏,到手机游戏,中间经历了很多的技术的更新和变革。但随着新技术的发展和我们生活水平质量的提高,手机开始逐渐变为普及,因为手机是非常小巧便捷的,而且方便的特性成为我们日常生活中必备通讯工具。而基于手机平台的游戏也就拥有的市场空间是巨大的,也因随着3g的开通和应用,手机游戏必然会迎来新的一轮游戏热潮!

1.2 课题来源

现在的移动电话是小型的计算机,它的处理能力与台式机的标准处理能力相比很有限,但是足够运行一个小型的游戏。现在的手机的一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。除了语音数据以外,它们还可以发送和接收其它类型的数据。所以这样的网络游戏也可以在手机上实现。短信类游戏就好像“虚拟宠物”那样。短信游戏是通过玩家和游戏服务商通过短信中的文字的内容来交流,达到进行游戏的目的的一种文字游戏。 由于短信游戏的整个游戏过程都是通过文字来表达,造成短信游戏的娱乐性较差。但是短信游戏却是兼容性最好的手机游戏之一。只要您的手机可以发短信,您就可以畅快的享受短信游戏给您带来的快乐了。图形类游戏更接近我们常说的“电视游戏”,玩家通过动画的形式来发展情节进行游戏。由于游戏采用了更为直观且更为精美的画面直接表现,因此图形类游戏的游戏性和代入感往往较文字类游戏高。因此广受玩家们的欢迎。嵌入式游戏是一种将游戏程序预先固化在手机的芯片中的游戏。由于这种游戏的所有数据都是预先固化在手机芯片中的,因此这种游戏是无法进行任何修改的。也就是说,您不能更换其它游戏的,只能玩您手机中已经存在的娱乐游戏,而且您也不能将它们删除。手机在网络游戏行业在多年的技术经验与运营经验的积累与总结之后,到了20xx年迫不及待 - 6 -

的需要创新出新的游戏模式和崭新的运营模式来推动手机游戏市场的爆发和发展。其中比较吸引人们的是手机的休闲类的游戏。应该可以说它是与PC网络游戏完全的脱离开了,而且充分发挥了自身的优势手机终端。休闲类的游戏恰巧与之相反,只需要很少的网络流量的网络环境,通过少量多次的游戏形式带给玩家流畅的游戏体验满足玩家瞬间提升的快感,但是同时却很难具有长期的“沉迷”性。

本题目是基于Android平台开发的一个小型的程序。其实都差不多,在有JAVA的智能手机上都可以运行。其实手机是我们生活中不可缺少的工具,这些小游戏可以带给我们快乐和放松我们的心情。无论什么样手机,我想买起来的时候上面就有一些它自带的各种小游戏,其中有一个独特的小游戏也是非常重要的。

1.3 国内外研究现状

Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Google与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达电和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。

Android 作为谷歌企业战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现。我们发现,全球为数众多的移动电话用户从未使用过任何基于 Android 的电话。谷歌的目标是让(移动通讯)不依赖于设备甚至平台。出于这个目的,Android 将补充,而不会替代谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发既有用又有吸引力的移动服务,并推广这些产品。 开放手机联盟的成立和 Android 的推出是对现状的重大改变,在带来初步效益之前,还需要不小的耐心和高昂的投入。但是,我们认为全球移动用户从中能获得的潜在利益是值得付出这些努力的。如果你也是一个开发者,并对我们的想法感兴趣,就请再给我们一星期的时间,届时谷歌便能提供 SDK 了。如果你是一名移动用户,只需再等一段时间,我们的一些合作伙伴计划在 2008 年下半年推出基于 Android 平台的电话产品。如果你已经拥有一部你了解并喜爱的电话,请登录 ,确保你已经安装谷歌手机地图、Gmail 以及其他一些专为你的手机开发的精彩应用。谷歌将继续努力,让这些服务变得更好,同时也将添加更有吸引力的特性、应用和服务。

1.4 论文主要工作

此游戏主要是采用Android的View框架编写,部分框架运用Android中的其他组件。主要运用了算法来实现对棋局的分析,棋盘输赢的判定。

- 7 -

UI方面:此游戏当进入游戏的界面时,调用的是一个用相对布局-AbsoluteLayout的XML布局文件。其中包括了一个IamgeView和4个Button.分别实现了不同的功能。第一个Button是进入新游戏,点击按钮进入新游戏,来选择对手。第二个Button是帮助,用了一个TextView来说明怎样来进行游戏。第三个Button是游戏的关于,用了一个AlertDialog来介绍了一下游戏的这个游戏的好处。第四个Button是游戏的退出按钮。在游戏中,我用画线来不满了整个的手机屏幕,在上面用了TextView来进行了文字的说明和提示。

本篇论文,主要目的是为了探讨更加深入的理解Android,为移动终端上的游戏软件的打造提供一个思路。

2 Android的开发环境

本章将主要介绍如何构建Android开发环境,包括获取Android SDK、Eclipse以及进行Android Eclipse插件设置等。

2.1 操作系统

目前只支持XP(32-bit)、Vista(32/64-bit)、Mac OS X 10.4.8或更新版本(x86)、Linux(只在Linux Ubuntu Dapper Drake上面做过测试)。

系统XP sp2/sp3 32bit 来做讲解,其他系统的可以google一下差异,反正都大同小异的。

2.2 Android开发环境

无论是官方还是我本人,都建议使用eclipse进行开发,当然,eclipse版本要在3.3以上,这是官方说法,3.3以下我也没测过,3.3 (Europa)、3.4 (Ganymede) 都可以,java版本或者EE版本也都没问题的,可以到eclipse官方下载最新版本。因为开发是基于java的,所以jdk是少不了的,jdk要求是5.0或者6.0,我还是用5.0比较多,可以到sun官方下载。

2.3 Android开发环境变量配置

2.3.1 jdk的配置

首先要到sun官方下载jdk,注意的是下载jdk而不是下载jre,因为jre是提供java的运行环境而不是开发环境。sun官方网站是:

下载后安装是下的解压包那就解压到某目录,例如解压到是C:\Program

Files\Java\jdk1.5.0_14

右键点击我的电脑 -> 属性 -> 高级,点击下面的环境变量,在下面的“系统变量” - 8 -

处选择新建在变量名处输入 JAVA_HOME变量值中输入刚才的目录,比如我的就C:\Program Files\Java\jdk1.5.0_14 。效果如图2-1所示:

大学毕业论文基于Android的五子棋游戏设计

图2-1进入环境变量

确定后再新建一个变量名为classpath,变量值

为 %JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar , 确定后找到PATH的变量,双击或点击编辑,在变量值最前面加上%JAVA_HOME%/bin; 注意里面的是,确定、确定、确定后即可。具体如下图2-2所示:

- 9 -

图2-2环境变量的设置

然后开始 - 运行 cmd,输入java或者javac看看有没有效果,如果出来一大堆其它的东西,那就好了,如果出现类似xxx不是内部或者是外部命令之类的,那就说明你的设置有问题,看看那里出问题然后加以改正。

2.3.2 sdk的配置

因为我们要开发的android应用程序,所以下的sdk是Google那里下载,地址在/sdk/1.5_r3/index.html 以后更新后估计地址会变,所以大家可以从/index.html进入android主页,然后点击sdk就到了这个下载页面,我是XP,当然下载了第一个Windows的版本。下载后解压到一个目录,如是D:\SDK\android-sdk-windows-1.5_r3\android-sdk-windows-1.5_r3 然后同样要设置环境变量,同jdk设置,新建一个SDK_HOME,值为

D:\SDK\android-sdk-windows-1.5_r3\android-sdk-windows-1.5_r3 ,然后找到path,在前面加上%SDK_HOME%\tools; 就OK了。和jdk一样,我们也可以测试一下环境变量是否设置成功,cmd窗口中输入android,出现一堆东西,就完成了。

2.4 eclipse设置

当然,以上都搞定后,还不能马上用eclipse开发android应用程序,还必须添加eclipse插件才行,幸好这步骤非常轻松,打开eclipse后,点击菜单栏的help -> install new software... 然后点击Add会出来一个Add Site的窗口,这里Name输入android(自己取个就是了),location中输入插件的网络地址:

https://dl-/android/eclipse/

大学毕业论文基于Android的五子棋游戏设计

- 10 -

然后就等待连接了,然后install,把"Android DDMS" 和 "Android Development Tools"都选中,finish就可以了,可能有段时间会去计算插件占用资源情况,慢慢等会。完成后会提示重启eclipse来加载插件,ok重启,就可以用了。

2.5 Android开发环境配置最终步骤

为什么要有这个步骤,是因为运行了example的时候总会出现“Failed to find an AVD compatible with target”,所以在这里写一下该步骤来提供大家的方便。

avd必须在运行实例之前前创建好,这个时候可以直接在cmd中输入 android list,就会列出几个由avd创建的api,如果有id1 id2 id3 分别对应sdk1.1 sdk1.5 GoogleAPIs。

然后就运行android create --name myname(取一个英文的名字) --target 3(如果要用sdk1.5就输入2,1.1输出1)

3 Android应用程序核心

本章将会详细叙述Android的应用程序所包括的基本组件,还有这些组件之间的沟通方式—Intent(除了Contentprovider),同时讲解一下Android应用程序的生命周期(Activity)—这是其他智能收与Android手机平台最显著不同的地方。最后将介绍在Android的应用程序中如何利用下载外部资源。

3.1应用程序基础

Android的应用程序全部都是用Java编程语言所写的。编译后的Java代码——包括应用程序要求的任何数据和资源文件,是通过aapt工具捆绑成一个Android包,归档文件是以.apk为后缀。这个文件是分发应用程序和安装到移动设备的中介或者是工具,用户下载这个文件到他们自己的设备上。一个.apk文件中的所有代码就会被认为是一个应用程序。

aapt是Android Asset Packaging Tool的首写字母的缩写,这个工具包是含在SDK的tools/目录下的。查看、创建、更新与zip兼容的归档文件(zip、jar、apk)。它也能将资源文件编译成二进制包。

虽然你可能不会经常直接使用appt,但构建脚本(build scripts)和IDE插件会使用这个工具打包成apk文件,构成一个Android的应用程序。

下面是更详细的使用细节,首先打开一个终端,进入tools/目录下,运行命令: Linux或Mac操作系统:./aapt ,如果是Windows:aapt.exe 。在这里注意的是:tools/目录指的是android SDK目录下的/platforms/android-X/tools/。在很多的方面,每个Android的应用程序是生活在它自己的世界。默认的情况下,任何一个应用程序是运行在它自己的Linux进程中。而当应用程序中的任何代码需要被执行时候,Android将启 - 11 -

动进程;当它不再需要和系统资源不会被其他应用程序所请求时,Android就会关闭进程这个进程。每一个应用程序都有自己的Java虚拟机(VM),所以应用程序的代码是独立于其他所有的应用程序代码的运行。在默认情况下,每一个应用程序分配一个唯一的Linux用户ID。权限被设置为每一个应用程序的文件仅对用户和应用程序自己本身可见。虽然有一些方法也可以暴露他们给其他应用程序。也有可能的是设置两个应用程序共享一个用户ID,这种情况下,他们能够看到对方的文件。为了节省系统资源的占用,具有相同ID的应用程序最好可以安排在同一个Linux进程中,共享同一个VM。

3.2 应用程序组件

Android的一个主要特点是,一个应用程序可以利用其他应用程序的元素(假设这些应用程序允许的话)。例如,如果你的应用程序需要显示一个图像的滚动列表,且其他应用程序已经开发了一个合适的滚动条并可以提供给别的应用程序用,你可以调用这个滚动条来工作,而不用自己开发一个。你的应用程序不用并入其他应用程序的代码或链接到它。相反,当需求产生时它只是启动其他应用程序块。

对于这个工作,当应用程序的任何部分被请求时,系统必须能够启动一个应用程序的进程,并实例化该部分的Java对象。因此,不像其他大多数系统的应用程序,Android应用程序没有一个单一的入口点(例如,没有main()函数)。相反,系统能够实例化和运行需要几个必要的组件。有四种类型的组件:

活动(Activities)

服务(Services)

广播接收者(Broadcast receivers)

内容提供者(Content providers)

然而,并不是所有的应用程序都必须包含上面的四个部分,你的应用程序可以由上面的一个或几个来组建。当你决定使用以上哪些组件来构建Android应用程序时,你应该将它们列在AndroidManifest.xml文件中,在这个文件中你可以声明应用程序组件以及它们的特性和要求。关于AndroidManifest.xml在Android开发之旅:HelloWorld项目的目录结构的1.6、AndroidManifest.xml简单介绍了一下,你可以参考一下,下篇也将介绍它。

3.2.1、活动(Activities)

一个活动表示一个可视化的用户界面,关注一个用户从事的事件。例如,一个活动可能表示一个用户可选择的菜单项列表,或者可能显示照片连同它的标题。一个文本短信应用程序可能有一个活动,显示联系人的名单发送信息;第二个活动,写信息给选定的联系人;其他活动,重新查看旧信息或更改设置。虽然他们一起工作形成一个整体的用户界面,但是每个活动是独立于其他活动的。每一个都是作为Activity基类的一个子类的实现。

android.app.Activity类:因为几乎所有的活动(activities)都是与用户交互的, - 12 -

所以Activity类关注创建窗口,你可以用方法setContentView(View)将自己的UI放到里面。然而活动通常以全屏的方式展示给用户,也可以以浮动窗口或嵌入在另外一个活动中。有两个方法是几乎所有的Activity子类都实现的:

onCreate(Bundle):初始化你的活动(Activity),比如完成一些图形的绘制。最重要的是,在这个方法里你通常将用布局资源(layout resource)调用setContentView(int)方法定义你的UI,和用findViewById(int)在你的UI中检索你需要编程地交互的小部件(widgets)。setContentView指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关操作,我们的操作会被包装成为一个意图(Intent),然后这个意图对应有相关的activity进行处理。

onPause():处理当离开你的活动时要做的事情。最重要的是,用户做的所有改变应该在这里提交(通常ContentProvider保存数据)。

生命周期如图

大学毕业论文基于Android的五子棋游戏设计

3-1

- 13 -

图3-1Android的生命周期

每一个应用程序可能只包含一个活动,或者是像短信应用程序一样,它可能会包含几个活动。这些活动分别是什么,以及有多少,这个当然取决于它的应用程序自己的设计。根据一般情况来说,当一个应用程序被启动的时候,会被标记为第一个的活动,应该展示给用户。从一个活动转移到另外一个活动由当前的活动完成从而开始下一个。

每一个活动都会有一个默认的窗口。根据一般情况来说,窗口是会填满整个屏幕的,但是它也有可能比屏幕小或者是浮在其他窗口上,这个就是程序员代码的编写情况了。一个活动还可以使用额外窗口。比如弹出式对话框,或者是当一个用户选择屏幕上一个特定的项时,会跳出一个窗口来显示给用户重要的信息。

窗口的可视化内容是由继承自接口为View基类,一个分层的视图—对象提供。每个可视化控件是窗口内的一个特定的矩形空间。父视图包含和组织子女视图的布局。叶子视图--分层的底层。绘制的矩形会直接控制和响应用户的操作。所以,一个视图活动是与用户发生交互的地方。比如说,一个视图显示一个小的图片和当用户点击图片时发起一个动作行为。Android有一些现成的可视化控件你可以使用,其中包括按钮(buttons)、图片按钮(ImageButton)、文本域(text fields)、可编辑文本控件(EditText)、菜单项(menu items)、仿真时钟(AnalogClock)滚动条(scroll bars)、开关按钮(ToggleButton)、复选按钮(check boxes)等等。

通过Activity.setContentView() 方法来设置一个视图层次在我们的活动窗口中。内容视图(content view)是层次结构的根视图对象。层次结构如下图3-2所示:

大学毕业论文基于Android的五子棋游戏设计

图3-2 View的层次结构

Activity.setContentView()方法:public void setContentView (int layoutResID):根据布局资源的设置活动界面。资源将会被夸大,添加布局资源文件中的所有的最高层的视图( top-level views )到活动.

- 14 -

3.2.2、 服务(Services)

与Activity相反,Service是没有可视化的用户界面,但是Service的特点是能长时间在后台运行的。所以,也可以这样去理解,Service是具有一段较长生命周期而且没有用户界面的程序。比如说一个服务可能要播放背景音乐但是用户做可以去做其他一些事情,或者它也可能从网络获取数据,也或者是计算一些东西并会提供一个结果给需要的活动(activities)。每一个服务都继承自Service基类。

每一个服务类都惠子在AndroidManifest.xml中有自己相应的<service>声明。服务必须可以通过Context.startService()或者Context.bindService()启动因为service是有两个不同的生命周期的。

一个非常典型的例子是媒体播放器播放一个播放列表中的歌曲文件。该播放器应用程序将可能有一个或者是多个活动(activities),可以允许用户选择要听的歌曲和开始播放。然而,音乐播放本身就不会被一个活动处理,因为用户是希望保持音乐一直播放的,当用户离开播放器的时候而去做其他事情。为了保持音乐能够继续播放,媒体播放器活动可以启动一个服务运行在后台的运行。系统将会保持音乐播放服务运行,甚至媒体播放器离开屏幕的时候。

可以连接到(绑定到)一个持续运行的服务(并启动服务,如果它尚未运行)。连接之后,你可以通过服务暴露的接口与服务交流。对于音乐服务,这个接口可以允许用户暂停、倒带、停止和重新播放。

像活动(activities)和其他组件一样,服务(services)运行在应用程序进程中的主线程中。因此,他们将不会阻止其他组件或用户界面,他们往往产生其他一些耗时的任务(如音乐播放)。

3.2.3、广播接收者(Broadcast receivers)

一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据。

一个应用程序可以有任意数量的广播接收者去反应任何它认为重要的公告。所有的接受者继承自BroadcastReceiver基类。

BroadcastReceiver类:是接受sendBroadcast()发送的意图(intents)的基类。可以用Context.registerReceiver()动态地注册这个类的实例,或者通过AndroidManifest.xml中<receiver>标签静态发布。注意:如果你在Activity.onResume() 注册一个接受者,你应该在Activity.onPause()注销它。因为当暂停时你不会收到意图,注销它将削减不必要的系统开销。不要在Activity.onSaveInstanceState()中注销它,因为它将不会被调用,如果用户移动到先前的堆栈。

有两种主要的可接受广播类型:

- 15 -

正常广播(由Context.sendBroadcast发送)是完全异步的。所有的广播接收者以无序方式运行,往往在同一时间接收。这样效率较高,但是意味着接受者不能使用结果或终止广播数据传播。

有序广播(由Context.sendOrderedBroadcast发送)一次传递给一个接收者。由于每个接收者依次执行,因此它可以传播到下一个接收器,也可以完全终止传播以便他不会传递给其他接收者。接收者的运行顺序可由匹配的意图过滤器(intent-filter)的android:priority属性控制。

广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager去通知用户。通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。

3.2.4、内容提供者(Content providers)

内容提供者(content provider)使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。内容提供者继承自ContentProvider 基类并实现了一个标准的方法集,使得其他应用程序可以检索和存储数据。然而,应用程序并不直接调用这些方法。相反,替代的是它们使用一个ContentResolver对象并调用它的方法。ContentResolver能与任何内容提供者通信,它与提供者合作来管理参与进来的进程间的通信。

内容提供者是Android应用程序的主要组成部分之一,提供内容给应用程序。他们封装数据且通过单个ContentResolver接口提供给应用程序。只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。如果你不需要在多个应用程序间共享数据,你可以直接使用SQLiteDataBase

当ContentResolver发出一个请求时,系统检查给定的URI的权限并传递请求给内容提供者注册。内容提供者能理解URI想要的东西。UriMatcher 类用于帮组解析URIs。

需要实现的方法主要如下:

query(Uri, String[], String, String[], String) 返回数据给调用者

insert(Uri, ContentValues) 插入数据到内容提供者

update(Uri, ContentValues, String, String[]) 更新内容提供者已存在的数据 delete(Uri, String, String[]) 从内容提供者中删除数据

getType(Uri) 返回内容提供者中的MIME 类型数据

更多的关于ContentResolver信息,请查看相关文档。

每当有一个应该由特定组件处理的请求,Android可以确保该组件的应用程序正在运行,如果没有就启动它,而且一个适当的组件实例可用,如果没有就创建。

- 16 -

4相关技术概念

本章节主要介绍一下此论文中用到了的Android的布局文件,可视化控件以及它们的具体实现。

4.1坐标布局(AbsoluteLayout)

坐标布局(AbsoluteLayout)的子控件需要指定相对与此坐标布局的横、纵坐标的值,将会想FrameLayout那样被排在左上角。

项目中进入游戏的布局文件代码如下:

<AbsoluteLayout xmlns:android="/apk/res/android"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/black">

<ImageView

android:id="@+id/menu"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/menu"

android:layout_x="55px"

android:layout_y="10px"

/>

<Button

android:id="@+id/b1"

android:layout_width="110px"

android:layout_height="40px"

android:layout_x="100px"

android:layout_y="150px"

android:text="新游戏"

/>

<Button

android:id="@+id/b3"

android:layout_width="110px"

android:layout_height="40px"

android:layout_x="100px"

android:layout_y="200px"

android:text="帮助"

/>

<Button

android:id="@+id/b4"

android:layout_width="110px"

- 17 -

android:layout_height="40px"

android:layout_x="100px"

android:layout_y="250px"

android:text="关于"

/>

<Button

android:id="@+id/b5"

android:layout_width="110px"

android:layout_height="40px"

android:layout_x="100px"

android:layout_y="300px"

android:text="退出"

/></AbsoluteLayout>

4.2 Intent

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

(1)action:一般要执行的操作,如ACTION_VIEW,ACTION_EDIT,ACTION_MAIN等

(2)Data也就是执行动作要操作的数据Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如 ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs。

(3)category:提供了有关的行动来执行的其他信息。例如,CATEGORY_LAUNCHER意味着它应该出现在作为顶层应用程序启动器,而CATEGORY_ALTERNATIVE意味着它应在的其他行动用户可以对一个数据列表中。

(4)type:指定一个明确的意图的数据类型(MIME类型)。一般情况下,类型推断,从数据本身。通过设置这个属性,您禁用,评价并强制显式类型。

(5)component:指定组件类使用的意图明确的名称。通常这是由看在意图(动作,数据/类型和类别)其它信息和匹配一个组件,它可以处理它的。如果这个属性被设置,那么评价没有执行,这部份会被用来完全一样的。通过指定这个属性,其他所有属性成为可选的意向。

(6)extras:这是任何其他信息包。这可以用来提供扩展信息的组件。例如,如果我们有一个行动,发送一封邮件,我们也可以包括在这里的数据提供一个额外的部分主题, - 18 -

正文等。

下面是转载来的其他的一些 Intent 用法实例(转自 javaeye )

显示网页

1. Uri uri = Uri.parse("http://google.com");

2. Intent intent = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(intent);

显示地图

1. Uri uri = Uri.parse("geo:38.899533,-77.036476");

2. Intent intent = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(intent);

4. //其他 geo URI ?例

5. //geo:latitude,longitude;

6. //geo:latitude,longitude?z=zoom;

7. //geo:0,0?q=my+street+address;

8. //geo:0,0?q=business+near+city;

9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom;

路径规划

1. Uri uri =

Uri.parse("/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");

2. Intent intent = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(intent);

4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456 打电话

- 19 -

1. //叫出拨号程序

2. Uri uri = Uri.parse("tel:0280000456");

3. Intent intent = new Intent(Intent.ACTION_DIAL, uri);

4. startActivity(intent);

1. // 直接打电话出去

2. Intent intent = new Intent(Intent.ACTION_CALL, uri);

3. Uri uri = Uri.parse("tel:0280000456");

4.3 AlertDialog

AlertDialog是一个Dialog类的子类,可以显示一个、两个或三个按钮。如果你只是想在此对话框中显示一个字符串,请使用setMessage()方法。如果你想显示一个更复杂的View,查找FrameLayout的所谓“自定义“,并添加到您的View:

FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);

fl.addView(myView,

new LayoutParams(MATCH_PARENT,WRAP_CONTENT));

4.4 相关的算法研究:

4.4.1相关的数据结构

关于盘面情况的表示,首先得到屏幕的大小,然后根据所画棋子的大小来确定下一条棋盘的画线。 产生棋盘上所有的线

private void createLines(){

for (int i = 0; i <= maxX; i++) {//竖线

lines.add(new Line(xOffset+i*pointSize-pointSize/2, yOffset, }

lines.add(new Line(xOffset, yOffset+i*pointSize-pointSize/2,

} xOffset+i*pointSize-pointSize/2, yOffset+maxY*pointSize)); for (int i = 0; i <= maxY; i++) {//横线 xOffset+maxX*pointSize, yOffset+i*pointSize-pointSize/2));

}

以数组形式画棋盘:

画棋盘

private List<Line> lines = new ArrayList<Line>();

private void drawChssboardLines(Canvas canvas){

for (Line line : lines) {

- 20 -

canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint); }

}

4.4.2分析规则

判断各个四个方向的棋子:

在某个方向(八个中的一个)可下多少棋子,这个方法是第一分析中的核心方法

private void countPoint(List<Point> myPoints, List<Point> enemyPoints, Point point, FirstAnalysisResult fr,int direction,boolean forward) {

//在某个方向上是否还能下到满五个棋子 private int maxCountOnThisDirection(Point point,List<Point> enemyPoints,int int x=point.getX(),y=point.getY(); switch (direction) { //横向 case HENG: while (!enemyPoints.contains(point.setX(point.getX()-1)) && point.getX()>=0 count ++; } if(myPoints.contains(pointToNext(point,direction,forward))){ } fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ } fr.aliveState=HALF_ALIVE; fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; }else if(enemyPoints.contains(point) || } fr.aliveState=HALF_ALIVE; isOutSideOfWall(point,direction)){ }else if(enemyPoints.contains(point) || } fr.aliveState=HALF_ALIVE; fr.aliveState=HALF_ALIVE; isOutSideOfWall(point,direction)){ }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ direction,int count){ && count<6) {

- 21 -

{

} point.setX(x); while (!enemyPoints.contains(point.setX(point.getX()+1)) && } break; count ++; point.getX()<maxX && count<6) { //纵向 case ZHONG: while (!enemyPoints.contains(point.setY(point.getY()-1)) && point.getY()>=0) } point.setY(y); while (!enemyPoints.contains(point.setY(point.getY()+1)) && } break; count ++; count ++; point.getY()<maxY && count<6) { //正斜向 / case ZHENG_XIE: while

(!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()+1)) && point.getX()>=0 && point.getY()<maxY) {

} point.setX(x).setY(y); while count ++;

(!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()-1)) && point.getX()<maxX && point.getY()>=0 && count<6) {

} break; count ++; //反斜 / case FAN_XIE: while

(!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()-1)) && point.getX()>=0 && point.getY()>=0) {

} point.setX(x).setY(y); while count ++;

(!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()+1)) && point.getX()<maxX && point.getY()<maxY && count<6) {

count ++; - 22 -

} } } break; return count;

4.4.3胜负判断

实际上,是根据当前最后一个落子的情况来判断胜负的。实际上需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45度角和135度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。

4.4.4算法实现描述

开始分析,扫描所有空白点,形成第一次分析结果:

private Point doFirstAnalysis(List<Point> comuters, List<Point> humans){ int size = allFreePoints.size(); Point computerPoint = null; Point humanPoint = null; int x,y; FirstAnalysisResult firstAnalysisResult; for (int i = 0; i < size; i++) {

computerPoint = allFreePoints.get(i); //先把X、Y坐标记下来,因为在分析过程中会改变原来的对象 x = computerPoint.getX(); y = computerPoint.getY(); if(x<currentRange.xStart || x>currentRange.xStop || y<currentRange.yStart || } if(x==debugx && y==debugy){ } //尝试在此位置上下一个棋子,并分析在“横向”这个方向上我方可形成的状态,如活4,活3,半活4,firstAnalysisResult = tryAndCountResult(comuters,humans, computerPoint, System.out.println("sssssssssssss"); continue; y>currentRange.yStop){ // // // 活2等所有状态

HENG);

computerPoint.setX(x).setY(y);//回复点位的原值,以供下次分析 if(firstAnalysisResult!=null){//无返回结果此方向上不可能达到五个棋子, if(firstAnalysisResult.count==5)//等于5表示在此点上下棋子即可连成5个,胜利了,不再往下进行分析

- 23 -

} return computerPoint; //记录第一次分析结果 addToFirstAnalysisResult(firstAnalysisResult,computerFirstResults);

第二次分析,分析第一次形成的结果,第一次分析结果会把一步棋在四个方向上可形成的结果生成最多四个FirstAnalysisResult对象(敌我各四)

//这里要把这四个对象组合成一个SencondAnalysisResult对象, private Point doComputerSencondAnalysis(Map<Point,List<FirstAnalysisResult>> List<FirstAnalysisResult> list = null; SencondAnalysisResult sr = null; for (Point p : firstResults.keySet()) { sr = new SencondAnalysisResult(p); list = firstResults.get(p); for (FirstAnalysisResult result : list) { if(result.count==4){ if(result.aliveState==ALIVE){//经过前面的过滤,双方都排除了绝杀棋,有活4就 return result.point;//如果有绝杀,第一轮已返回,在此轮活4已经是好的棋子,firstResults,List<SencondAnalysisResult> sencodResults) { 下这一步了,再下一步就赢了 直接返回,不再往下分析 }else{ } if(result.aliveState==ALIVE){ } sr.alive2++; if(sr.alive2==1){ } computer2Alives.add(sr); computerDouble2Alives.add(sr); }else{ sr.alive3++; if(sr.alive3==1){ } sr.halfAlive3++; computer3HalfAlives.add(sr); computer3Alives.add(sr); computerDouble3Alives.add(sr); }else{ sr.halfAlive4 ++; computer4HalfAlives.add(sr); }else if(result.count==3){ }else{ }else{//半活2在第一阶段已被排除,不再处理

- 24 -

} } } } sencodResults.add(sr); //没有找到活4 return null;

第三次分析,双方都不可以制造活4,找双活3棋子,不行就找半活4,再不行就找单活3,双活2

private Point doThirdAnalysis() {

}

if(!computer4HalfAlives.isEmpty()){ } System.gc(); sleep(300); Collections.sort(computerSencodResults); System.gc(); //即将单活4,且我没有半活4以上的,只能堵 Point mostBest = getBestPoint(human4Alives, computerSencodResults); if(mostBest!=null) Collections.sort(humanSencodResults); System.gc(); mostBest = getBestPoint(); if(mostBest!=null) //拿出各自排第一的,谁好就下谁 return computerSencodResults.get(0).point; return mostBest; return mostBest; return computer4HalfAlives.get(0).point;

5.实现运行情况,以及各个模块的截图

5.1概要设计:

当设计这个游戏时,首先要用一个很好的游戏界面,让我们来选择游戏中的不同的功能。在游戏中我设计了四个按钮。分别是:1新游戏、2帮助、3关于、4退出游戏。1.当 - 25 -

我们在新游戏过程中我用一个TextViewa来进行了一个友好的提示,来帮助方便我们对游戏的操作。具体的功能情况看下图5-1:

大学毕业论文基于Android的五子棋游戏设计

5.2

图5-1功能模块

5.2.1 游戏主界面:

大学毕业论文基于Android的五子棋游戏设计

- 26 -

图5-2游戏主界面

5.2.2新游戏界面:

大学毕业论文基于Android的五子棋游戏设计

图5-3游戏结束再操作界面

新游戏的功能描述:当我们进入游戏后,它会有一个操作提示:“按两下右键是人-机对战,按两下左键是人-人对战。”当我们按着操作进行游戏了。当游戏结束是又会一个“**棋输了的提示”然后又是一个操作提示重新进行新的游戏的开始。

5.2.3 帮助界面

帮助界面的功能秒杀:当我们还没有进入新的游戏的时候,想知道游戏是怎么开始操作的,点击帮助界面,提示我们该进行怎样的操作。

- 27 -

图5-4游戏提示界面

5.2.4 关于五子棋介绍界面

大学毕业论文基于Android的五子棋游戏设计

图5-5五子棋的关于

大学毕业论文基于Android的五子棋游戏设计

- 28 -

5.2.5 五子棋的退出:

大学毕业论文基于Android的五子棋游戏设计

图5-6游戏推出

- 29 -

总结

在本游戏的编写过程中,我遇到了许多的问题。首先要自己先自学一下Android的游戏编程,虽然和JAVAME的思想差不多,但是Android上有许多的控件和类在JAVAME上是没有的,在这方面我遇到了很大的难题。还有就是对五子棋游戏的算法不是很清楚。在编码实现的时候,会出现一些开始完全意料不到的问题,也许这些问题当中,有的是老师讲过的,不过我想大部分还是老师没有讲过,这个时候就是体现出自己解决问题的能力的时候了。在遇到问题时要学会如何去分析错误,再是学会如何去解决掉这个问题。在遇到问题是,不要有害怕困难的情绪,解决问题也是一个不断学习进步的过程,遇到的问题越多,学到的东西也就越多。因此在遇到困难之时,不要轻言放弃,要努力向前解决问题。我在20xx年11月开始了我的毕业论文工作,认真总结,经过长时间的写作到现在论文基本完成。写毕业论文不是一件容易的事情,需要不断的进行精心的修改,不断地去研究各方面的文献。经过很久的努力,终于在20xx年4月份完成了毕业论文。在这次毕业论文的写作的过程中,我拥有了无数难忘的感动和收获。后来,在与导师的交流讨论中我的题目定了下来,我便立刻在学校的图书馆和网上找了一些着手资料的收集工作中,当时面对众多网络资料库的文章真是有些不知所措,不知如何下手。我将这一困难告诉了指导老师,在老师的细心的指导下,终于使我了解了应该怎么样利用学校的浩瀚的资源找到自己需要的青春文学方面的资源。认真的阅读,总结笔记,为自己的论文打好基础。写作毕业论文是我们每个大学生必须经历的一段过程,也是我们毕业前的一段宝贵的回忆。当我们看到自己的努力有收获的时候,总是会有那么一点点自豪和激动。任何事情都是这样子,需要我们脚踏实地的去做,一步一个脚印的完成,认真严谨,有了好的态度才能做好一件事情,一开始都觉得毕业论文是一个很困难的任务,大家都难免会有一点畏惧之情,但是经过长时间的努力和积累,经过不断地查找资料后总结,我们都很好的按老师的要求完成了毕业论文的写作,这种收获的喜悦相信每个人都能够体会到。这是一次意志的磨练,是对我实际能力的一次提升,相信对我未来的学习和工作有很大的帮助。

每次在遇到困难的时候,我也得到了同学的帮助,共同商量相关专业问题,这种交流对于即将面临毕业的我们来说是一次很有意义的经历,大学四年都一起走过了,在最后我们可以聚在一起讨论学习,研究专业问题,进而更好的了解我们每个人的兴趣之所在,明确我们的人生理想,进而在今后的生活和工作中更好的发挥自己的优势,学好自己选择的这项专业技术,让自己在这条路上的明天会更好。

- 30 -

参考文献

[1] (美)威尔顿,麦可匹克. JavaScript入门经典(第3版). 施宏斌译. 北京:清华大学出版社,2009

[2] 张孝祥. Java就业培训教程[M]. 北京:清华大学出版社,2003

[3] E2ECloud工作室 著 深入浅出Google Android 人民邮电出版社

[4] (美)Bruce Eckel. Java编程思想. 陈昊鹏译. 北京:机械工业出版社,2007

[5] Eric J.Braucle等.软件设计—从程序设计到体系结构[M].李仁发等译.北京:电子工业出版社,2007.

[6] 孔令德.毕业设计案例教程—从系统开发到论文写作[M].北京:国防工业出版社,2007.

[7] 雍俊海编著.Java程序设计习题集.北京:清华大学出版社,2006

[8] 朱福喜编著.Java语言习题与解析.北京:清华大学出版社,2006

[9]吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006

[10] 赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006

[11] 赵毅主编.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006

[12]王克宏 著.Java技术教程(基础篇).北京:高等教育出版社,2002.04

[13]孙燕 主编.Java2入门与实例教程.北京:中国铁道出版社,2003.01

[14]叶核亚,陈立著.Java2程序设计实用教程.北京:电子工业出版社,2003.5

[15]柯温钊 著.JAVA例解教程.北京:中国铁道出版社,2001.03

[16]都志辉 著.Java3D编程实践. 北京:清华大学出版社,2002.11

- 31 -

附录

部分代码如下:

主界面代码:

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

import android.provider.MediaStore.Images; import android.view.View;

import android.view.View.OnClickListener; import android.widget.Button;

import android.widget.ImageView;

import android.widget.TextView;

public class biye extends Activity {

ImageView menu; Button b1,b2,b3,b4,b5; OnClickListener oc1;

/** Called when the activity is first created. */ @Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

menu=(ImageView)findViewById(R.drawable.menu); b1=(Button)findViewById(R.id.b1); b3=(Button)findViewById(R.id.b3); b4=(Button)findViewById(R.id.b4); b5=(Button)findViewById(R.id.b5); oc1=new OnClickListener(){

public void onClick(View v) { if(v==b1){ } Intent i1=new Intent(biye.this,MainActivity.class); startActivity(i1); if(v==b3){ setContentView(R.layout.bangzhu); } if(v==b4){ new AlertDialog.Builder(biye.this) .setTitle("关于五子棋") .setIcon(R.drawable.icon) - 32 -

} } .setMessage("五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,.setPositiveButton("确定",new DialogInterface.OnClickListener() { } new AlertDialog.Builder(biye.this) .setTitle("退出") .setIcon(R.drawable.icon) .setMessage("确定离开游戏吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { } ).setNegativeButton("取消", new DialogInterface.OnClickListener() { } ).show(); public void onClick(DialogInterface dialog, int which) { } public void onClick(DialogInterface dialog, int which) { } finish(); public void onClick(DialogInterface dialog, int which) { } }).show(); 而且富含哲理,有助于修身养性。") if(v==b5){

};

b1.setOnClickListener(oc1); b3.setOnClickListener(oc1); b4.setOnClickListener(oc1); b5.setOnClickListener(oc1); }

}

新游戏的开始到结束:

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.content.res.Resources; import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

- 33 -

import android.graphics.drawable.Drawable;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.KeyEvent;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

import .player.AiFactory;

import .player.concrete.HumanPlayer;

import .player.interfaces.IPlayer;

//棋盘

public class Chessboard extends View implements IChessboard{

//游戏状态常量:

//已准备好,可开局

private static final int READY = 1;

//已开局

private static final int RUNNING = 2;

//已结束

private static final int PLAYER_TWO_LOST = 3; private static final int PLAYER_ONE_LOST = 4;

//当前状态,默认为可开局状态

private int currentMode = READY;

//画笔对象

private final Paint paint = new Paint();

//代表黑色

private static final int BLACK = 0;

private static final int NEW_BLACK = 1;

//白色

private static final int WHITE = 2; //黄色

private static final int NEW_WHITE = 3;

//点大小

private static int pointSize = 20;

//用于提示输赢的文本控件

private TextView textView = null;

- 34 -

//不同颜色的Bigmap数组

private Bitmap[] pointArray = new Bitmap[4];

//屏幕右下角的坐标值,即最大坐标值

private static int maxX;

private static int maxY;

//第一点偏离左上角从像数,为了棋盘居中

private static int yOffset;

private static int xOffset;

//两个玩家

//第一个玩家默认为人类玩家

private IPlayer player1 = new HumanPlayer();

//第二个则根据选择人机战还是对战模式来初始化 private IPlayer player2;

//预先初始两个第二玩家

//电脑玩家

private static final IPlayer computer = AiFactory.getInstance(2); //人类玩家

private static final IPlayer human = new HumanPlayer();

// 所有未下的空白点

private final List<Point> allFreePoints = new ArrayList<Point>();

public Chessboard(Context context, AttributeSet attrs) {

super(context, attrs);

setFocusable(true);

//把三个颜色的点准备好,并放入数组

Resources r = this.getContext().getResources();

fillPointArrays(BLACK,r.getDrawable(R.drawable.Black_point));

fillPointArrays(NEW_BLACK,r.getDrawable(R.drawable.new_Black_point)); fillPointArrays(WHITE,r.getDrawable(R.drawable.White_point));

fillPointArrays(NEW_WHITE,r.getDrawable(R.drawable.new_White_point));

//设置画线时用的颜色

paint.setColor(Color.LTGRAY);

}

//初始横线和竖线的数目

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

- 35 -

maxX = (int) Math.floor(w / pointSize);

maxY = (int) Math.floor(h / pointSize);

//设置X、Y座标微调值,目的整个框居中

xOffset = ((w - (pointSize * maxX)) / 2);

yOffset = ((h - (pointSize * maxY)) / 2);

//创建棋盘上的线条

createLines();

//初始化棋盘上所有空白点

createPoints();

}

//产生棋盘上所有的线

private void createLines(){

for (int i = 0; i <= maxX; i++) {//竖线

lines.add(new Line(xOffset+i*pointSize-pointSize/2, yOffset, xOffset+i*pointSize-pointSize/2, yOffset+maxY*pointSize));

}

for (int i = 0; i <= maxY; i++) {//横线

lines.add(new Line(xOffset, yOffset+i*pointSize-pointSize/2, xOffset+maxX*pointSize, yOffset+i*pointSize-pointSize/2));

}

}

//画棋盘

private List<Line> lines = new ArrayList<Line>();

private void drawChssboardLines(Canvas canvas){

for (Line line : lines) {

canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint); }

}

//线类

class Line{

float xStart,yStart,xStop,yStop;

public Line(float xStart, float yStart, float xStop, float yStop) {

this.xStart = xStart;

this.yStart = yStart;

this.xStop = xStop;

this.yStop = yStop;

}

}

//画点

- 36 -

private void drawPoint(Canvas canvas,Point p,int color){

canvas.drawBitmap(pointArray[color],p.x*pointSize+xOffset,p.y*pointSize+yOffset,paint);

}

//设置运行状态

public void setMode(int newMode) {

currentMode = newMode;

if(currentMode==PLAYER_TWO_LOST){

//提示玩家2输了

textView.setText(R.string.player_two_lost);

currentMode = READY;

}else if(currentMode==RUNNING){

textView.setText(null);

}else if(currentMode==READY){

textView.setText(R.string.mode_ready);

}else if(currentMode==PLAYER_ONE_LOST){

//提示玩家1输了

textView.setText(R.string.player_one_lost);

currentMode = READY;

}

}

//设置提示控件

public void setTextView(TextView textView) {

this.textView = textView;

}

//监听键盘事件

@Override

public boolean onKeyDown(int keyCode, KeyEvent msg) {

if (currentMode == READY && (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_LEFT)) {

if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){//向右键,人机对战 player2 = computer;

}else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){//向左键,人--人对战 player2 = human;

}

restart();

- 37 -

setMode(RUNNING);

}else if(currentMode==RUNNING && keyCode == KeyEvent.KEYCODE_DPAD_DOWN){//重新开始

restart();

setMode(READY);

}else{

return false;

}

return true;

}

//根据触摸点坐标找到对应点

private Point newPoint(Float x, Float y){

Point p = new Point(0, 0);

for (int i = 0; i < maxX; i++) {

if ((i * pointSize + xOffset) <= x

&& x < ((i + 1) * pointSize + xOffset)) {

p.setX(i);

}

}

for (int i = 0; i < maxY; i++) {

if ((i * pointSize + yOffset) <= y

&& y < ((i + 1) * pointSize + yOffset)) {

p.setY(i);

}

}

return p;

}

//重新开始

private void restart() {

createPoints();

player1.setChessboard(this);

player2.setChessboard(this);

setPlayer1Run();

//刷新一下

refressCanvas();

}

//是否已开局

private boolean hasStart(){

return currentMode==RUNNING;

}

- 38 -

//处理触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { //还没有开局,或者是按下事件,不处理,只处理开局后的触摸弹起事件 if(!hasStart() || event.getAction()!=MotionEvent.ACTION_UP){ return true; } //是否正在处理一步棋的过程中 if(onProcessing()){ return true; } playerRun(event); return true; } private synchronized void playerRun(MotionEvent event){ if(isPlayer1Run()){//第一玩家下棋 player1Run(event); }else if(isPlayer2Run()){//第二玩家下棋 player2Run(event); } } private void player1Run(MotionEvent event){ Point point = newPoint(event.getX(), event.getY()); if(allFreePoints.contains(point)){//此棋是否可下 setOnProcessing(); player1.run(player2.getMyPoints(),point); //playerOnePoints.add(point); //刷新一下棋盘 refressCanvas(); //判断第一个玩家是否已经下了 if(!player1.hasWin()){//我还没有赢 if(player2==computer){//如果第二玩家是电脑 //10豪秒后才给玩家2下棋 refreshHandler.computerRunAfter(10); }else{ setPlayer2Run(); } }else{ //否则,提示游戏结束 - 39 -

setMode(PLAYER_TWO_LOST);

}

}

}

private void player2Run(MotionEvent event){

Point point = newPoint(event.getX(), event.getY()); if(allFreePoints.contains(point)){//此棋是否可下 setOnProcessing();

player2.run(player1.getMyPoints(),point);

//刷新一下棋盘

refressCanvas();

//判断我是否赢了

if(!player2.hasWin()){//我还没有赢

setPlayer1Run();

}else{

//否则,提示游戏结束

setMode(PLAYER_ONE_LOST);

}

}

}

private RefreshHandler refreshHandler = new RefreshHandler(); class RefreshHandler extends Handler {

//这个方法主要在指定的时刻发一个消息

public void computerRunAfter(long delayMillis) {

this.removeMessages(0);

//发消息触发handleMessage函数

sendMessageDelayed(obtainMessage(0), delayMillis);

}

//收到消息

public void handleMessage(Message msg) {

//电脑AI每走一步棋子

player2.run(player1.getMyPoints(),null);

//刷新一下棋局界面

refressCanvas();

if(!player2.hasWin()){

//人继续下棋

setPlayer1Run();

}else

{//第二个玩家赢了

- 40 -

setMode(PLAYER_ONE_LOST);

}

}

};

//是否正在下某一步棋过程中,主是电脑下棋时需要较长的计算时间,这期间一定不可以再响应触摸事件

private boolean onProcessing() {

return whoRun == -1;

}

//默认第一个玩家先行

private int whoRun = 1;

private void setPlayer1Run(){

whoRun = 1;

}

private void setOnProcessing(){

whoRun = -1;

}

//是否轮到人类玩家下子

private boolean isPlayer1Run(){

return whoRun==1;

}

//是否轮到人类玩家下子

private boolean isPlayer2Run(){

return whoRun==2;

}

private void setPlayer2Run(){

whoRun = 2;

}

private void refressCanvas(){

//触发onDraw函数

Chessboard.this.invalidate();

}

private void drawPlayer1Point(Canvas canvas){

int size = player1.getMyPoints().size()-1;

if(size<0){

return ;

}

- 41 -

for (int i = 0; i < size; i++) {

drawPoint(canvas, player1.getMyPoints().get(i), BLACK);

}

//最后下的一个点标成黄色

drawPoint(canvas, player1.getMyPoints().get(size), NEW_BLACK); }

private void drawPlayer2Point(Canvas canvas){

if(player2==null){

return ;

}

int size = player2.getMyPoints().size()-1;

if(size<0){

return ;

}

for (int i = 0; i < size; i++) {

drawPoint(canvas, player2.getMyPoints().get(i), WHITE);

}

//最后下的一个点标成黄色

drawPoint(canvas, player2.getMyPoints().get(size), NEW_WHITE); }

//初始化好三种颜色的点

public void fillPointArrays(int color,Drawable drawable) {

Bitmap bitmap = Bitmap.createBitmap(pointSize, pointSize, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);

drawable.setBounds(0, 0, pointSize, pointSize);

drawable.draw(canvas);

pointArray[color] = bitmap;

}

//doRun方法操作的是看不见的内存数据,此方法内容数据以图画的方式表现出来,所以画之前数据一定要先准备好

@Override

protected void onDraw(Canvas canvas) {

drawChssboardLines(canvas);

//画鼠标所在的点

drawPlayer1Point(canvas);

//画电脑下的棋子

drawPlayer2Point(canvas);

}

- 42 -

}

public List<Point> getFreePoints() { return allFreePoints; }

//初始化空白点集合

private void createPoints(){ allFreePoints.clear();

for (int i = 0; i < maxX; i++) { for (int j = 0; j < maxY; j++) { allFreePoints.add(new Point(i, j)); } } }

public int getMaxX() { return maxX; }

public int getMaxY() { return maxY; }

- 43 -

更多相关推荐:
五子棋-课程设计报告

五子棋-课程设计报告单位分院(系)专业学号学生姓名指导教师完成日期20xx年05月日摘要五子棋的历史:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手…

五子棋游戏 课程设计报告(含源代码可以运行)

五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩家下子.11.5盘面分析填写棋型表.21.6对方下子.21.7胜负判断.2第二章…

C语言图形五子棋课程设计报告

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

20xx年C语言五子棋课程设计报告

本科控制软件设计课程设计题目五子棋学院计信院专业自动化年级学号姓名谯平同组人张健李益指导教师黄仁杰20xx年9月6日1目录1设计简介32设计模块3小组分工4流程图5设计过程6调试过程7分析与总结8源程序4445...

c++五子棋课程设计报告

福建农林大学计算机与信息学院课程设计报告课程名称课程设计题目姓名系专业年级学号指导教师职称面向对象程序设计课程设计五子棋计算机软件工程年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定2目录1设计目...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

C语言图形五子棋课程设计报告

课题名称游戏五子棋C语言课程设计报告学生姓名艾萨江吐合提学号5011113109所属学院信息工程学院专业计算机科学与技术班级计算机181指导教师化希耀教师职称讲师1摘要五子棋是一种两人对弈的纯策略型棋类游戏应用...

程序设计课程设计五子棋实验报告(附代码)

文档编号项目名称版本程序设计课程设计五子棋游戏程序报告书制订人张三学号20xx0000000120xx年7月6日程序设计课程设计报告书文档变更历史记录2程序设计课程设计报告书目录目录31引言411编写目的412...

五子棋 课程设计完整报告 C++版

一课程设计的目的计算机网络课程设计是计算机网络原理课程之后的实践加强环节通过本设计的训练使学生加深对网络协议的理解并实践制定通信规则同时通过实践进一步掌握套接字编程方法为大型网络编程打下坚实基础通过本次课程设计...

五子棋java课程设计

目录一课程设计任务及要求1二需求分析121棋盘板块122聊天板块123ChatSever124编译环境125参考资料1三设计思路131板块的显示132注册监听233ChatServer234下棋2四详细设计34...

五子棋-Java课程设计

面向对象程序设计课程设计报告实验时间20xx年10月26日实验班级实验报告总份片数1份片实验指导老师设计小组湖南省吉首市吉首大学课程设计报告简单的游戏五子棋小组成员姓名学号组长一实验分工二开发环境实验编译以及测...

五子棋课程设计报告(33篇)