安卓大作业
android程序设计大作业

你的Android程序设计大作业需要包含以下内容:
1. 需求分析:描述你的应用程序的需求,包括它的目标用户、主要功能和特殊需求。
2. 设计:详细描述你的应用程序的设计,包括用户界面(UI)设计、交互设计、数据存储设计等。
你应该考虑应用程序的整体架构,包括主要组件和它们之间的交互。
3. 实现:详细描述你如何实现你的应用程序,包括使用的编程语言(主要是Java和Kotlin)、开发工具、技术堆栈等。
你应该提供一些关键代码片段,展示你的实现过程。
4. 测试:描述你将如何测试你的应用程序,包括测试类型、测试工具和测试计划。
你应该提供一些测试结果,展示你的应用程序的性能和功能。
5. 部署:描述你将如何部署你的应用程序,包括发布到Google Play商店或其他应用市场、更新和维护等。
6. 总结:总结你的整个开发过程,包括你遇到的挑战、解决方案和你从中学到的东西。
以上内容应该根据你的具体应用程序进行修改和扩展。
同时,你应该在每个部分中提供足够的细节和解释,以便其他人能够理解你的应用程序的设计和实现。
android期末大作业论文1

淮阴工学院《Android》期末作品系(院):计算机工程学院专业:计算机科学与技术(NIIT方向)班级:计算机1124 学生姓名: sky学号: ******任课教师: ****学年学期:2014 ~ 2015 学年第 2 学期2015 年7 月 1 日1.课题综述1.1 项目背景Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。
随着智能手机的普及化,赛班等系统逐渐提出时代潮流,智能机时代来临,而安卓系统智能手机以其低廉的价格逐渐成为大众化的主流手机系统。
与此同时随着现代音乐播放器的发展,一款能在安卓系统里能够运行的音乐播放器是大众所急需的应用软件。
考虑到音乐播放器的开发价值和很好的应用前景,本文主要研究基于Android移动平台的音乐播放器的开发。
音乐播放器,将机器上的各种音乐文件转换为视听效果文件的一种强大的软件。
它能够通过数字手段来模拟出声音效果。
使得人们可以从传统音乐中解放出来,尤其是现代歌曲,结合了各种音乐器材的综合效果,颠覆了传统的音乐传统,这就更需要一款强大的软件来解析各种音乐器材所独有的效果。
1.2 预期目标本次设计的主要功能是能播放Mp3,Wav多种格式的音乐文件,并且能够控制歌曲的播放,暂停,上、下一曲,音量调节,背景更换,播放列表和歌曲文件的管理操作等多种播放控制功能,界面简明,操作简单。
2、系统分析2.1 运行环境操作系统:Android手机基于Linux操作系统支持环境:Android 1.5 - 2.0.1版本开发环境:Eclipse 3.5 ADT 0.952.2 功能模块框图3、系统设计3.1 本地音乐:先将安卓程序从Eclipse里导出,安装到手机上。
当点击进入时,程序将自动导入手机本地音乐。
效果如图:图(1)本地音乐页面3.2 音乐播放在本地歌曲里点击想听的音乐则音乐开始播放,如点击“光辉岁月”,效果如图图(2)音乐播放图(3)音乐暂停图(4)上一首图(5)随即播放。
移动应用开发安卓选题

移动应用开发安卓选题移动应用开发课程大作业选题注意:以下所有系统均要实现(1)管理者的登陆;(2)用户的注册和登陆;(3)数据的存储和提取.(第(12),(14),(15),(17)题可以不要求“(1)管理者的登陆”和“(2)用户的注册和登陆”)不要附上核心代码,全文汉字字数不少于7500。
每个班内不能有重复选题,班级内部每2人组成一组选题。
学生提交大作业设计报告打印稿(A4纸,最好双面打印)和源程序。
设计报告电子版以“移动应用开发_学号_姓名.doc(或docx)”命名。
上交电子版文件时上交“移动应用开发_学号_姓名”命名的文件夹,设计报告电子版和源代码放在“移动应用开发_学号_姓名”命名的文件夹内,其中源代码用压缩软件打包。
每组同学上交一份电子版,文件名只要以该组同学其中一位同学名字和学号命名即可,但是其中应该包含一个readme.txt文件,里面列出该组全体同学姓名和学号。
纸质版如何上交另外通知。
1.基于安卓的火车票购票系统基于Android系统,实现对于火车票的预定功能。
具体需要完成的主要功能:火车票信息查询,火车票订单管理,预定火车票,用户账户管理和软件帮助功能。
在完成系统功能的基础上实现合理的界面设计,并进行相应的软件测试。
2.基于安卓的手机快递管理查询系统设计内容主要包括:完成用户登录功能(包括普通用户,快件录入人员,公司管理员);用户快件查询;快件信息管理,包括信息录入,修改等;员工信息维护。
3.基于安卓的网上药店管理系统的设计与实现实现:(1)管理者和用户的注册,登陆;(2)用户在登陆后才能购买商品;(3)管理者在登陆后才能对商品进行发布,通过一定的步骤生成药品信息;(4)管理员有权删除不符合规定的发布信息;(5)管理员有权删除不符合规定的用户信息;(6)用户可对管理员留言,完善网站结构;(7)用户在购买商品后可对商品留言。
4.基于安卓的网上航班时刻表查询系统设计与实现基于Android系统,实现管理者和用户的注册、登陆;设计实现手机在线航班时刻表查询系统。
Android大作业题目5篇

Android大作业题目5篇第一篇:Android大作业题目《Android软件开发》课程考查作业题目注意事项:1、每人可选下列题目中的一题完成课程设计。
2、学习委员于10月31日收齐上交。
3、本次要求打印稿(正反打印)。
一、题目及要求:1、基于Android平台的在线通信录功能要求:实现通信录的在线备份还原功能,服务器端技术自定。
2、基于Android平台的云记事本软件功能要求:具有记事本的基本功能。
同时具备在线备份功能。
服务器端技术自定。
3、基于BaiDu在线地图的轨迹跟踪服务功能要求:1、能动态、实时记录设备位置。
2、能在手机或者网页上显示地图轨迹。
服务端技术自定。
用例场景:小明今天80岁,患老年痴呆又喜欢出远门,经常发生走丢事故。
小小明为了能实时掌握小明的行踪,特意为他配备了装有跟踪服务的智能机,从此小明再也不怕走丢了。
4、基于Android平台的财务软件功能要求:1、记账和统计功能。
2.实时备份实现要求:客户端基于Android,服务端技术自定用例场景:随手记,一家人共用一个账号,所有支出都清清楚楚5、基于Android平台的社交软件功能要求:参考QQ、微信、微博等实现要求:客户端基于Android,服务端技术自定6、基于Android平台的新闻客户端功能要求:参考网易新闻客户端实现要求:客户端基于Android,服务端技术自定.7.基于Android平台的天气预报系统功能要求:从服务器端下载天气预报数据并显示.实现要求:客户端基于Android,服务端技术自定8.自拟题目。
要求有客户端和服务端,具备一定的实用性。
二、设计文档要求(格式同上学期多核开发课程报告格式)整体要求:使用Eclipse集成开发环境完成课程设计,界面友好,代码的可维护性好,有必要的注释和相应的文档。
文档具体书写内容要求如下:λ系统的需求概述λ系统的概要设计λ设计与实现部分λ运行画面截图λ每一部分附上关键性代码λ心得体会(每个人都要写)第二篇:Android大作业报告移动设备软件应用与开发大作业报告姓名:学号:班级:院系:日期:任课教师:一、程序的运行环境、安装步骤1、运行环境游戏运行环境:Android1.5以上版本2、程序的组成部份:2.1、JDK安装1.我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:2.JAVA_HOME值为: D:Program FilesJavajdk1.6.0_18(你安装JDK的目录)3.CLASSPATH值为:.;%JAVA_HOME%libtools.jar;%JAVA_HOME%libdt.jar;%JAVA_ HOME%bin;4.Path: 在开始追加 %JAVA_HOME%bin;5.NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。
android移动终端开发大作业

Android移动终端开发大作业
一、大作业总体要求
(1)2人一组,分工合作。
如果愿意独立完成,也可1人。
(2)按照个人兴趣方向,从推荐范围自选题目,完成系统。
(3)在规定的时间里完成系统主体功能,程序比较稳定的运行。
(第8周二、五开发系统,
第9周周二上课上台讲真机演示系统。
考完后一周内提交完整的代码、文档。
代码统一刻盘留存,文档提交纸质版,电子版和代码一起刻盘。
文档参考项目式教程课本,要求三部分内容1 项目总体介绍,模块介绍2各模块任务分析和任务实施3 系统开发总结)
(4)手机界面要求简洁、美观。
(5)至少要5个Activity以上。
(6)要使用Sqlite数据库。
(7) 欢迎好的创意作品、实用作品。
(8) 大作业成绩从工作量、功能点、创新性、实用性、系统演示、报告等方面的成绩构
成
二、推荐以下范围选题,题目自选
1移动工具类
聊天工具类(网络通讯)
前台和后台服务器
2 图形图像工具类
画点、线、面、曲线、折线、园
3游戏类
4移动日常应用类
移动学习、
移动管理信息系统、
移动考试、
5与位置相关的应用类LBS
移动监控类
移动采集
6 多媒体开发类。
移动设备应用程序开发大作业

移动设备应用程序开发大作业移动设备应用程序开发是当前互联网行业中最受欢迎和热门的技能之一。
由于人们对于移动设备的依赖越来越高,越来越多的开发人员开始涉足这个领域。
移动设备应用程序能够为人们的生活带来非常便利的服务,无论是购物、旅游、娱乐等各个方面都有着广泛的应用。
任务需求在本次移动设备应用程序开发大作业中,我们要求学生们开发一款手机应用程序,可以根据自己的兴趣爱好和专业知识来自由选择开发主题。
该应用程序应具备以下基本功能:•能够实现用户的注册和登录功能;•能够实现用户的基本资料编辑、修改等操作;•能够实现用户的数据存储和读取;•能够实现用户的数据统计、分析等操作;•能够实现用户与其他用户交互等操作。
技术选型在开发该应用程序时,我们建议采用目前流行和成熟的开发工具和技术,以保障应用程序的技术支持和稳定性。
以下列出几种常用的移动应用程序开发技术:1. 原生应用程序开发原生应用程序开发指的是在某个特定的操作系统上(如 iOS 或 Android)使用该系统所提供的软件开发工具包(SDK)来开发应用程序。
原生应用程序的优点是具备更好的性能和用户体验,并且可以充分利用操作系统的特性,实现更加丰富的功能。
但是,原生应用程序的开发成本较高,需要花费更多的时间和人力开发,同时也需要考虑应用程序的兼容性和可维护性等问题。
2. Hybrid 应用程序开发Hybrid 应用程序开发指的是在手机应用程序的基础上,使用 Web 技术(如HTML、CSS 和 JavaScript)来实现应用程序的界面和功能。
Hybrid 应用程序的优点是相比于原生应用程序开发,开发成本较低,并且具备较好的兼容性,同时还能够利用 Web 技术的优势实现更加复杂的应用程序。
但是,Hybrid 应用程序的性能和用户体验相对较差,且受限于手机浏览器的限制。
3. 跨平台应用程序开发跨平台应用程序开发指的是使用一种特定的开发语言或者框架来实现可在不同操作系统和设备上运行的应用程序。
《Android手机高级开发》大作业试卷及评分标准_A卷

宁波大红鹰学院2015-2016学年第二学期2013级本科计算机科学与技术专业《Android手机高级开发》期末考试试卷(A卷)考核方式:大作业题目:智能手机软件的设计与实现要求:一、作品要求描述随着智能手机的普及,基于Android平台的应用软件需求也越来越多。
宁波东蓝数码有限公司是一家规模较大的软件公司,随着公司规模的不断扩大,目前新增了大量基于Android智能手机方面的业务,但由于业务量较大,公司内部开发人员一时无法满足要求,现需要外包一些智能手机应用软件。
现假设你所在的公司承接了该公司智能手机外包项目的开发工作,并明确了外包的项目范围如下:(1)带共享功能的文件管理、多媒体技术制作类项目;(2)带共享功能的地图处理类项目;(3)带有服务器处理的移动端APP。
将其中一项任务下达给你,并提出了如下要求:1.界面美观,功能实用、丰富;2.项目中至少应包含如下四种数据存贮(SharedPreferneces/SQLite/文件/ContentProvider)中的其中一种;3.项目中需要包含地图处理功能;4.项目中需要包含多媒体或物理传感方面的功能;5.项目中对比较费时的工作,需要采用异步处理技术。
二、上交的资料(纸质及电子稿)(1)大作业报告,报告中要求项目分工明确,格式参照模板。
(2)项目源代码,如有服务器端程序,还应包括服务器端程序源码及导出的数据库sql文件。
三、考核方式(1)以小组方式(原则上为3人/组),于18周课外时间安排答辩,按照给定评分标准打分;(2)各小组项目主题不能相同,否则以作品类同处理;(3)各小组答辩完毕,立即将其纸质稿及电子稿上交,截止时间:第十八周周末。
四、评分标准:(写明各项分值,总分值为100分)1、大作业报告(40分)要求及评分标准:1)及时上交。
(5分)2)需求分析:需求描述准确简练,意思表达清楚,无明显错误;需要画出UML需求用例图及用例分析说明。
(10分)3)系统设计:需要画出参与整个系统的各个模块,解释各模块功能;用UML 画出核心模块时序图、类图,及其各个模块之间的关系。
Android程序设计大作业

项目必须能够调试通过;android平台选择选择2.2或是2.3.3。
6. c.作业设计说明,word文件,按照毕业论文的格式进行编写,要求包括 需求(功能描述)、设计(代码说明)与最终实现(截屏)。
7.
可以借鉴网络上的代码。
Android程序设计
期末大作业
作业题目
•
1.
2. 3. 4. 5. 6. •
可以按照自己的兴趣,选择完成如下内容:
设计并实现一个应用,可以完成类似天气,股票,课程 表等显示; 设计并实现一个类似于手机助手的应用; 设计并实现一个播放器,能够完成视频、音频文件的播 放; 设计一个Widget,可以完成事件提醒,工作日志等功能; 设计一个GoogleMap,完成地图相关功能。 其他自己感兴趣的内容 要求:功能完备,界面漂亮。
• 不许相互抄袭,一旦发现成绩为零。
作业要求
1.
2. 3.
作业请在2013年4月9日前,发送至dlutandroid@,过时不候。
作业文件命名及格式:班级+序号+姓名.rar 作业内容包括三部分:
Байду номын сангаас
4.
5.
a.作业内容说明,txt文件。
b.作业项目文件夹,项目命名规则是自己的姓名拼音,例如lidakui;项 目package命名规则:姓名拼音.xh学号,例如:lidakui.xh200992001;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Android应用程序开发》大作业题目:五子棋游戏的设计与实现专业:网络工程学号:*********学生姓名:***指导教师:***完成日期:2015-11-25目录1开发背景 (1)2.需求分析 (1)2.1功能需求 (1)2.2性能需求软件环境: (1)3.概要设计 (1)4.棋盘、棋子的绘制 (1)5.游戏核心设计 (2)5.1手机选择落子位置 (2)5.2判断游戏的输赢 (2)6.运行截图 (2)7.核心代码 (5)7.1首界面 (5)7.2棋盘、棋子的初始化等 (6)7.3 判断输赢 (8)7.4手机落子算法 (10)1开发背景每个人手机上都有手机游戏,上下班以及无聊闲暇时,游戏是人们娱乐的一种方式。
Android 平台下的手机游戏更是受到顾客的青睐,手机游戏不仅玩起来比较方便,还有助于开发我们的思维,使大家在娱乐的同时也增长了见识,拓展了思维。
五子棋对思维及协调能力有益,能使我们注意力集中,耐心也有明显的提升,培养我们的逻辑思维能力,对智力及记忆力都很有帮助。
2.需求分析2.1功能需求1.适合不同阶段的玩家(新手和熟手)2.玩家和手机对弈2.2性能需求软件环境:1.硬件环境:PC机2Windows XP、Android 2.1 以上3.概要设计五子棋分三个模块:开始游戏、设置、退出。
1.开始游戏:点击进入游戏2.游戏设置:音效设置:开启/关闭背景音乐、开启/关闭音效难度设置:简单,中等,较难3.退出游戏关闭游戏4.棋盘、棋子的绘制本设计中棋盘的设置采用drawLine(float startX,float startY,float stopX,float stopY,Paint paint)画线,参数一起始点的X轴位置,参数二起始点的Y轴位置,参数三终点的水平位置,参数四垂直位置,最后的一个参数为Paint画刷对象。
本设计中棋子是用drawCircle在坐标上绘制一个经典几何图形。
先判断是否有棋,是黑子还是白子,然后判断是那个坐标,然后调用drawCircle绘制棋子canvas.drawCircle(float,float,float,Paint)方法用于画圆,前两个参数代表圆心坐标,第三个参数为圆半径,第四个参数是画笔。
5.游戏核心设计5.1手机选择落子位置评估当前棋局中,某个位置的得分。
五子棋要赢,必然要有五个棋子在一起成线,那么我们就可以计算棋盘中每一个五格相连的线,一下称之为五元组。
一般情况(包括专业五子棋)下棋盘是15*15的。
那么应该是572个五元组。
同时,针对五元组中黑子和白子的数量(可以不考虑相对位置)的不同,给该五元组评不同的分。
然后每一个位置的得分就是包含这个位置的所有五元组的得分之和。
说明:当五元组为空,分数为7,不为零的原因是,还有跟糟的情况:五元组中既有黑子又有白子,五元组也就是无效了,这时才给0分。
根据得到的评分,手机选出最佳位置,进行落子。
5.2判断游戏的输赢在判断输赢时,用到的一个巧妙的方法。
从所周知,无论谁下棋赢了以后总会成五子连线,而成五子连线时,第五颗棋总是会着落在棋盘上,所以我们在判断是否有五子连线时,并不是全盘扫描,而是在每着落一子后就扫描该棋子左右、上下、以及斜着的四个方向。
如果扫描出来了那个方向上的棋子首先到达五子,就返回给上级调用,由上级调用者作出相应判断。
如果是其它子,如果某个方向上成了六子或六子以上时,不能算作它赢得了棋,而必是五子才能赢得了棋。
如果是五子以下的棋子时,将要根局相应棋子成子情况,作出相应反应,如加权、减权等操作。
6.运行截图首界面:开始游戏:设置:判断输赢:7.核心代码7.1首界面public class StartActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);this.setContentView(yout.activity_start);Button button1 = (Button) findViewById(R.id.button1);button1.setOnClickListener(new View.OnClickListener(){ @Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent intent1 = new Intent();intent1.setClass(StartActivity.this,MainActivity.class);startActivity(intent1);StartActivity.this.finish();}});Button button2 = (Button) findViewById(R.id.button2);button2.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent2 = new Intent();intent2.setClass(StartActivity.this, settingActivity.class);startActivity(intent2);StartActivity.this.finish();}});Button button3 = (Button) findViewById(R.id.button3);button3.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubStartActivity.this.finish();}});}}7.2棋盘、棋子的初始化等private ChessType[][] chessMap = new ChessType[ROWS][COLS];private static float PADDING = ((float) (screenWidth) / (COLS - 1)) / 2;private static float PADDING_LEFT = ((float) (screenWidth) / (COLS - 1)) / 2;private static float PADDING_TOP = ((float) (screenHeight) / (ROWS - 1)) / 2;private static float ROW_MARGIN= (screenHeight- PADDING* 2) / (ROWS - 1);private static float COL_MARGIN = (screenWidth - PADDING * 2)/ (COLS - 1);private static float MARGIN;public GameView(Context context) {super(context);this.context = context;this.setBackgroundResource(R.drawable.bg);PADDING_LEFT = ((screenWidth) / (COLS - 1)) / 2;PADDING_TOP = ((screenHeight) / (ROWS - 1)) / 2;PADDING = PADDING_LEFT < PADDING_TOP ? PADDING_LEFT : PADDING_TOP;ROW_MARGIN = ((screenHeight - PADDING * 2)) / (ROWS - 1);COL_MARGIN = ((screenWidth - PADDING * 2)) / (COLS - 1);MARGIN= ROW_MARGIN< COL_MARGIN? ROW_MARGIN: COL_MARGIN;PADDING_LEFT = (screenWidth - (COLS - 1) * MARGIN) / 2;PADDING_TOP = (screenHeight - (ROWS - 1) * MARGIN) / 2;// 对棋子进行初始化initChess();// System.out.println(PADDING_LEFT + " " + PADDING_TOP);}//对棋子进行初始化public void initChess() {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {chessMap[i][j] = ChessType.NONE;}}invalidate();}//画棋盘@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.WHITE);// 打印行for (int i = 0; i < ROWS; i++) {canvas.drawLine(PADDING_LEFT, i * MARGIN+ PADDING_TOP, (COLS - 1)* MARGIN+ PADDING_LEFT, i * MARGIN+ PADDING_TOP, paint);}// 打印列for (int i = 0; i < COLS; i++) {canvas.drawLine(PADDING_LEFT+ i * MARGIN, PADDING_TOP,PADDING_LEFT + i * MARGIN, MARGIN * (ROWS - 1)+ PADDING_TOP, paint);}for (int r = 0; r < ROWS; r++) {for (int c = 0; c < COLS; c++) {// System.out.print(chessMap[r][c] + " ");if (chessMap[r][c] == ChessType.NONE)continue;if (chessMap[r][c] == ChessType.BLACK) {paint.setColor(Color.BLACK);canvas.drawCircle(r * MARGIN + PADDING_LEFT, c * MARGIN+ PADDING_TOP, MARGIN / 2, paint);} else if (chessMap[r][c] == ChessType.WHITE) {paint.setColor(Color.WHITE);canvas.drawCircle(r * MARGIN + PADDING_LEFT, c * MARGIN+ PADDING_TOP, MARGIN / 2, paint);}}// System.out.println();}}7.3 判断输赢public boolean hasWin(int r, int c) {ChessType chessType = chessMap[r][c];System.out.println(chessType);int count = 1;// 纵向搜索for (int i = r + 1; i < r + 5; i++) {if (i >= GameView.ROWS)break;if (chessMap[i][c] == chessType) {count++;} elsebreak;}for (int i = r - 1; i > r - 5; i--) {if (i < 0)break;if (chessMap[i][c] == chessType)count++;elsebreak;}// System.out.println(count +" "+"1");if (count >= 5)return true;// 横向搜索count = 1;for (int i = c + 1; i < c + 5; i++) {if (i >= GameView.COLS)break;if (chessMap[r][i] == chessType)count++;elsebreak;}for (int i = c - 1; i > c - 5; i--) {if (i < 0)break;if (chessMap[r][i] == chessType)count++;elsebreak;}// System.out.println(count +" " +"2");if (count >= 5)return true;// 斜向"\"count = 1;for (int i = r + 1, j = c + 1; i < r + 5; i++, j++) { if (i >= GameView.ROWS || j >= GameView.COLS) { break;}if (chessMap[i][j] == chessType)count++;elsebreak;}for (int i = r - 1, j = c - 1; i > r - 5; i--, j--) { if (i < 0 || j < 0)break;if (chessMap[i][j] == chessType)count++;elsebreak;}// System.out.println(count +" " +"3");if (count >= 5)return true;// 斜向"/"count = 1;for (int i = r + 1, j = c - 1; i < r + 5; i++, j--) { if (i >= GameView.ROWS || j < 0)break;if (chessMap[i][j] == chessType)count++;elsebreak;}for (int i = r - 1, j = c + 1; i > r - 5; i--, j++) { if (i < 0 || j >= GameView.COLS)break;if (chessMap[i][j] == chessType)count++;elsebreak;}// System.out.println(count +" " +"4");if (count >= 5)return true;return false;}7.4手机落子算法/* 得到最优点** @return得到最优的点*/private Point getBestPoint() {initValue();for (int r = 0; r < GameView.ROWS; r++) {for (int c = 0; c < GameView.COLS; c++) {if (chessMap[r][c] == ChessType.NONE) {puterMap[r][c] = getValue(r, c, puterType);this.playerMap[r][c] = getValue(r, c,this.playerType);}}}int pcMax = 0, playerMax = 0;Random rd = new Random();Point pcPoint = new Point(-1, -1);Point playerPoint = new Point();// 分别选出pc估分和玩家估分的最大值for (int r = 0; r < GameView.ROWS; r++) {for (int c = 0; c < GameView.COLS; c++) {// 选出电脑估分的最大值if (pcMax == computerMap[r][c]) {if (rd.nextInt(10) % 2 == 0) {pcMax = computerMap[r][c];pcPoint.x = r;pcPoint.y = c;}} else if (pcMax < computerMap[r][c]) {pcMax = computerMap[r][c];pcPoint.x = r;pcPoint.y = c;}// 选出玩家估分的最大值if (playerMax == playerMap[r][c]) {if (rd.nextInt(10) % 2 == 0) {playerMax = playerMap[r][c];playerPoint.x = r;playerPoint.y = c;}} else if (playerMax < playerMap[r][c]) {playerMax = playerMap[r][c];playerPoint.x = r;playerPoint.y = c;}}}// 两者都在90~100分之间,优先选择PCif(pcMax >= 90 && pcMax < 100 && playerMax >= 90 && playerMax < 100) {return pcPoint;} else {return playerMax > pcMax ? playerPoint : pcPoint;}}/* 得到该位置的分数** @param r* 该棋子所在的行数* @param c* 该棋子所在的列数* @param chessType* 棋子的类型* @return得到的分数*/private int getValue(int r, int c, ChessType chessType) { int[] dir = new int[4];dir[0] = this.getHorCount(r, c, chessType);dir[1] = this.getVerCount(r, c, chessType);dir[2] = this.getSloRCount(r, c, chessType);dir[3] = this.getSloLCount(r, c, chessType);// 成五for (int i = 0; i < dir.length; i++) {if (dir[i] >= 5)return ScoreTable.FIVE;}int temp = 0;// 双活四for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] != ChessStatus.DIED) temp++;if (temp == 2)return ScoreTable.DOUBLE_ALIVE_FOUR;}int t1 = 0, t2 = 0;// 活四死四for (int i = 0; i < dir.length; i++) {if(dir[i] == 4 && chessStatus[i] == ChessStatus.ALIVE) t1 = 1;if (dir[i] == 4 && chessStatus[i] != ChessStatus.DIED) t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.ALIVE_FOUR_AND_DEAD_FOUR;}// 活四活三t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] != ChessStatus.DIED) t1 = 1;if(dir[i] == 3 && chessStatus[i] == ChessStatus.ALIVE) t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.ALIVE_FOUR_AND_ALIVE_THREE;}// 活四死三t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] != ChessStatus.DIED) t1 = 1;if (dir[i] == 3 && chessStatus[i] != ChessStatus.DIED) t2 = 1;if (t1 == 1 && t2 == 1) {return ScoreTable.ALIVE_FOUR_AND_DEAD_THREE;}}// 活四活二t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] != ChessStatus.DIED) t1 = 1;if(dir[i] == 2 && chessStatus[i] != ChessStatus.ALIVE) t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.ALIVE_FOUR_AND_ALIVE_TWO;}// 活四for (int i = 0; i < dir.length; i++) {if(dir[i] == 4 && chessStatus[i] == ChessStatus.ALIVE) {return ScoreTable.ALIVE_FOUR;}}// 双死四temp = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] == ChessStatus.DIED)temp++;if (temp == 2)return ScoreTable.DOUBLE_DEAD_FOUR;}// 死四活3t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] == ChessStatus.DIED) t1 = 1;if (dir[i] == 3 && chessStatus[i] != ChessStatus.DIED) t2 = 1;if (t1 == 1 && t2 == 1) {return ScoreTable.DEAD_FOUR_AND_ALIVE_THREE;}}// 死四活2t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] == ChessStatus.DIED) t1 = 1;if (dir[i] == 2 && chessStatus[i] != ChessStatus.DIED) t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.DEAD_FOUR_AND_ALIVE_TWO;}// 双活三temp = 0;for (int i = 0; i < dir.length; i++) {if (dir[i] == 3 && chessStatus[i] != ChessStatus.DIED) temp++;if (temp == 2)return ScoreTable.DOUBLE_ALIVE_THREE;}// 活死三t1 = 0;t2 = 0;for (int i = 0; i < dir.length; i++) {if(dir[i] == 3 && chessStatus[i] == ChessStatus.ALIVE) t1 = 1;if (dir[i] == 3 && chessStatus[i] == ChessStatus.DIED) t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.ALIVE_THREE_AND_DEAD_THREE;}// 活三for (int i = 0; i < dir.length; i++) {if(dir[i] == 3 && chessStatus[i] == ChessStatus.ALIVE) return ScoreTable.ALIVE_THREE;}// 死四for (int i = 0; i < dir.length; i++) {if (dir[i] == 4 && chessStatus[i] == ChessStatus.DIED) return ScoreTable.DEAD_FOUR;}// 半活死3t1 = 0;t2 = 0;for (int i = 0; i < 4; i++) {if (dir[i] == 3 && chessStatus[i] == ChessStatus.DIED) t1 = 1;if (dir[i] == 3 && chessStatus[i] ==ChessStatus.HALFALIVE)t2 = 1;if (t1 == 1 && t2 == 1)return ScoreTable.ALIVE_THREE_AND_DEAD_THREE;}// 双活2temp = 0;for (int i = 0; i < 4; i++) {if(dir[i] == 2 && chessStatus[i] == ChessStatus.ALIVE) temp++;if (temp == 2)return ScoreTable.DOUBLE_ALIVE_TWO;}// 死3for (int i = 0; i < 4; i++)if (dir[i] == 3 && chessStatus[i] == ChessStatus.DIED) return ScoreTable.DEAD_THREE;// 活2for (int i = 0; i < 4; i++)if(dir[i] == 2 && chessStatus[i] == ChessStatus.ALIVE) return ScoreTable.ALIVE_TWO;// 死2for (int i = 0; i < 4; i++)if (dir[i] == 2 && chessStatus[i] == ChessStatus.DIED) return ScoreTable.DEAD_TWO;return 0;}/* 横向搜索** @param r* 该棋子所在的行数* @param c* 该棋子所在的列数* @param chessType* 棋子的类型* @return得到的个数*/private int getHorCount(int r, int c, ChessType chessType) { int count = 1;int t1 = c + 1;int t2 = c - 1;for (int j = c + 1; j < c + 5; j++) {if (j >= GameView.COLS) {chessStatus[0] = ChessStatus.DIED;break;}if (chessMap[r][j] == chessType) {count++;if (count >= 5)return count;} else {chessStatus[0] = (chessMap[r][j] == ChessType.NONE) ? ChessStatus.ALIVE: ChessStatus.DIED;t1 = j;break;}}for (int j = c - 1; j > c - 5; j--) {if (j < 0) {if(chessStatus[0] == ChessStatus.DIED&& count < 5) {return 0;}chessStatus[0] = ChessStatus.DIED;break;}if (chessMap[r][j] == chessType) {count++;if (count >= 5)return count;} else {if (chessStatus[0] == ChessStatus.DIED) {if(count < 5 && chessMap[r][j] != ChessType.NONE) {return 0;}} else {chessStatus[0] = (chessMap[r][j]) == ChessType.NONE ? ChessStatus.ALIVE: ChessStatus.DIED;t2 = j;// 记录遇到的空格// 当两端都活的时候,看是否可以延伸if (chessStatus[0] == ChessStatus.ALIVE) {int tempCount1 = count, tempCount2 = count;boolean isAlive1 = false, isAlive2 = false;for (int i = t1 + 1; i < t1 + 5; i++) {if (i >= GameView.ROWS)break;if (chessMap[r][i] == chessType) {tempCount1++;} else {isAlive1 = (chessMap[r][i] == ChessType.NONE) ? true: false;break;}}for (int i = t2 - 1; i > t2 - 5; i--) {if (i < 0)break;if (chessMap[r][i] == chessType) {tempCount2++;} else {isAlive2 = (chessMap[r][i] == ChessType.NONE) ? true: false;break;}}// 如果两头都是空,直接跳出if(tempCount1 == count && tempCount2 == count)break;if (tempCount1 == tempCount2) {count = tempCount1;chessStatus[0] = (isAlive1 && isAlive2) ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {count = (tempCount1 > tempCount2) ? tempCount1: tempCount2;if (count >= 5)return 0;if (tempCount1 > tempCount2)chessStatus[0] = (isAlive1) ? ChessStatus.HALFALIVE: ChessStatus.DIED;elsechessStatus[0] = (isAlive2) ? ChessStatus.HALFALIVE: ChessStatus.DIED;}}}break;}}return count;}/* 纵向搜索** @param chessType* 要搜索的棋子类型* @param r* 棋子所在的行* @param c* 棋子所在的列* @return*/private int getVerCount(int r, int c, ChessType chessType) { int t1 = r + 1;int t2 = r - 1;int count = 1;for (int i = r + 1; i < r + 5; i++) {if (i >= GameView.ROWS) {chessStatus[1] = ChessStatus.DIED;break;}if (chessMap[i][c] == chessType) {count++;if (count >= 5) {return count;}} else {chessStatus[1] = (chessMap[i][c] == ChessType.NONE) ? ChessStatus.ALIVE: ChessStatus.DIED;t1 = i;break;}}for (int i = r - 1; i > r - 5; i--) {if (i < 0) {if(chessStatus[1] == ChessStatus.DIED&& count < 5) {return 0;}chessStatus[1] = ChessStatus.DIED;break;}if (chessMap[i][c] == chessType) {count++;if (count >= 5) {return count;}} else {if (chessStatus[1] == ChessStatus.DIED) {if(chessMap[i][c] != ChessType.NONE&& count < 5) {return 0;}} else {chessStatus[1] = chessMap[i][c] == ChessType.NONE ? ChessStatus.ALIVE: ChessStatus.DIED;t2 = i;// 如果两头都活,看是否还可以延伸if (chessStatus[1] == ChessStatus.ALIVE) {int tempCount1 = count, tempCount2 = count;boolean isAlive1 = false, isAlive2 = false;for (int j = t1 + 1; j < t1 + 5; j++) {if (j >= GameView.ROWS) {// chessStatus[1] = ChessStatus.DIED;break;}if (chessMap[j][c] == chessType) {tempCount1++;} else {isAlive1 = (chessMap[j][c] == ChessType.NONE) ? true: false;break;}}for (int j = t2 - 1; j > t2 - 5; j--) {if (j < 0) {break;}if (chessMap[j][c] == chessType) {tempCount2++;} else {isAlive2 = (chessMap[j][c] == ChessType.NONE) ? true: false;break;}}if(tempCount1 == count && tempCount2 == count) {break;}if (tempCount1 == tempCount2) {count = tempCount1;chessStatus[1] = (isAlive1 && isAlive2) ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {count = (tempCount1 > tempCount2) ? tempCount1: tempCount2;if (count >= 5)return 0;if (tempCount1 > tempCount2) {chessStatus[1] = isAlive1 ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {chessStatus[1] = isAlive2 ? ChessStatus.HALFALIVE: ChessStatus.DIED;}}}break;}}}return count;}/* 斜向"\"*/private int getSloRCount(int r, int c, ChessType chessType) { int count = 1;int tr1 = r + 1;int tc1 = c + 1;int tr2 = r - 1;int tc2 = c - 1;for (int i = r + 1, j = c + 1; i < r + 5; i++, j++) { if (i >= GameView.ROWS || j >= GameView.COLS) {chessStatus[2] = ChessStatus.DIED;break;}if (chessMap[i][j] == chessType) {count++;if (count >= 5)return count;} else {chessStatus[2] = (chessMap[i][j] == ChessType.NONE) ? ChessStatus.ALIVE: ChessStatus.DIED;tr1 = i;tc1 = j;break;}}for (int i = r - 1, j = c - 1; i > r - 5; i--, j--) { if (i < 0 || j < 0) {if(chessStatus[2] == ChessStatus.DIED&& count < 5) {return 0;}chessStatus[2] = ChessStatus.DIED;break;}if (chessMap[i][j] == chessType) {count++;if (count >= 5) {return count;}} else {if (chessStatus[2] == ChessStatus.DIED) {if(count < 5 && chessMap[i][j] != ChessType.NONE)return 0;} else {chessStatus[2] = chessMap[i][j] == ChessType.NONE ? ChessStatus.ALIVE: ChessStatus.DIED;tr2 = i;tc2 = j;// 两头都活看是否可以延伸if (chessStatus[2] == ChessStatus.ALIVE) {int tempCount1 = count, tempCount2 = count;boolean isAlive1 = false, isAlive2 = false;for (int p = tr1 + 1, q = tc1 + 1; p < tr1 + 5; p++, q++) {if(p >= GameView.ROWS|| q >= GameView.COLS) {break;}if (chessMap[p][q] == chessType) {tempCount1++;} else {isAlive1 = (chessMap[p][q] == ChessType.NONE) ? true: false;break;}}for (int p = tr2 - 1, q = tc2 - 1; p > tr2 - 5; p--, q--) {if (p < 0 || q < 0)break;if (chessMap[p][q] == chessType) {tempCount2++;} else {isAlive2 = (chessMap[p][q] == ChessType.NONE) ? true: false;break;}}if(tempCount1 == count && tempCount2 == count) {break;}if (tempCount1 == tempCount2) {count = tempCount1;chessStatus[2] = (isAlive1 && isAlive2) ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {count = (tempCount1 > tempCount2) ? tempCount1: tempCount2;if (count >= 5)return 0;if (tempCount1 > tempCount2) {chessStatus[2] = isAlive1 ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {chessStatus[2] = isAlive2 ? ChessStatus.HALFALIVE: ChessStatus.DIED;}}}}break;}}return count;}/* 斜向"/"*/private int getSloLCount(int r, int c, ChessType chessType) { int count = 1;int tr1 = r + 1;int tc1 = c + 1;int tr2 = r - 1;int tc2 = c - 1;for (int i = r + 1, j = c - 1; i < r + 5; i++, j--) { if (i >= GameView.ROWS || j < 0) {chessStatus[3] = ChessStatus.DIED;break;}if (chessMap[i][j] == chessType) {count++;if (count >= 5)return count;} else {chessStatus[3] = (chessMap[i][j] == ChessType.NONE) ? ChessStatus.ALIVE: ChessStatus.DIED;tr1 = i;tc1 = j;break;}}for (int i = r - 1, j = c + 1; i > r - 5; i--, j++) { if (i < 0 || j >= GameView.COLS) {if(chessStatus[3] == ChessStatus.DIED&& count < 5) return 0;chessStatus[3] = ChessStatus.DIED;break;}if (chessMap[i][j] == chessType) {count++;if (count >= 5)return count;} else {if (chessStatus[3] == ChessStatus.DIED) {if(count < 5 && chessMap[i][j] != ChessType.NONE) {return 0;}} else {chessStatus[3] = (chessMap[i][j] == ChessType.NONE) ? ChessStatus.ALIVE: ChessStatus.DIED;tr2 = i;tc2 = j;if (chessStatus[3] == ChessStatus.ALIVE) {int tempCount1 = count, tempCount2 = count;boolean isAlive1 = false, isAlive2 = false;for (int p = tr1 + 1, q = tc1 - 1; p < tr1 + 5; p++, q++) {if (p >= GameView.ROWS || q < 0) {break;}if (chessMap[p][q] == chessType) {tempCount1++;} else {isAlive1 = chessMap[p][q] == ChessType.NONE ? true: false;break;}}for (int p = tr2 - 1, q = tc1 + 1; p > tr2 - 5; p--, q++) {if (p < 0 || q >= GameView.COLS) {break;}if (chessMap[p][q] == chessType) {tempCount2++;} else {isAlive2 = chessMap[p][q] ==ChessType.NONE ? true: false;break;}}if(tempCount1 == count && tempCount2 == count) {break;}if (tempCount1 == tempCount2) {count = tempCount1;chessStatus[3] = (isAlive1 && isAlive2) ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {count = (tempCount1 > tempCount2) ? tempCount1: tempCount2;if (count >= 5)return 0;if (tempCount1 > tempCount2) {chessStatus[3] = isAlive1 ? ChessStatus.HALFALIVE: ChessStatus.DIED;} else {chessStatus[3] = isAlive2 ? ChessStatus.HALFALIVE: ChessStatus.DIED;}}}}break;}}return count;}。