移动互联网开发
课程设计报告
学生姓名:
袁壮苗
学 号: 031740315
专
业: 计算机科学与技术 班 级: 0317403
设计题目:连珠五子棋游戏系统
学年学期:
2019
年 秋 季学期
指导教师:
张华
目
录 (示例)
一、 设计题目................................................................................................................................... 1
二、 设计目的................................................................................................................................... 1
三、 设计原理及方案....................................................................................................................... 1
1 使用的软件工具和环境........................................................................................................... 1
2 需求分析与概要设计............................................................................................................... 1
3 数据库设计(若有)............................................................................................................... 3
4 详细设计和关键问题............................................................................................................... 3
四、 实现效果................................................................................................................................. 17
五、 设计体会................................................................................................................................. 20
参 考 文 献............................................................................................................................................................... 22
一、 设计题目
连珠五子棋游戏系统
二、 设计目的
用面向对象语言 JAVA 和移动开发平台 Android Studio 及 Android 语言开发一款基于安卓环境的游戏,
在开发过程中熟练使用 Java 和安卓语法,熟练调用 API 函数,熟练使用 Android Studio 开发环境,以此加深
对移动互联网这门课程的学习和实践。通过本课程设计,巩固软件工程的基本概念、原理,熟悉安卓应用开发环境和技
术,学会完成一个移动终端应用软件的分析、设计、编码测试和安装,将理论与实际相结合,强化学生的项目开发和团队意识,
提高分析能力和创新能力
三、 设计原理及方案
1 使用的软件工具和环境
安卓应用程序开发环境如下:
1 JDK
5
or
JDK
6
(JRE
alone
is
not
sufficient)
2 Eclipse
3.3
(Europa),
3.4
(Ganymede)
3 Android
SDK
4 ④ADT 0.8.0
5 ⑤Eclipse 安装 ADT 插件
2 需求分析与概要设计
五子棋作为一款休闲益智游戏,它最大的优点在于游戏规则家喻户晓,简单,上手快,趣
味性强,所以受广大用户青睐,在各大提供棋牌类游戏的平台都可以看到玩五子棋游戏的人很
多。休闲益智游戏中等级并不是最重要的追求目标,通过对游戏规则的熟悉,能很快上手掌握
其操作方式,也更适合男女老幼全家共同娱乐,花费时间简短,速战速决,在短时间内感受到
游戏的乐趣,完全享受气氛轻松活跃的游戏过程。此种娱乐方式既不耽误时间也能轻松调剂娱
乐,充分适合现代人们的娱乐需求。更主要的是开发了人的智力,成为年轻一代最流行的游戏,
据统计,五子棋游戏的玩家中,学生占了接近三分之一的比例,对学生的智力健康成长起一定
作用,正所谓休闲娱乐两不误。
需求分析:
1. 棋盘和棋子绘制。
2. 按照五子棋的规则制定游戏胜负规则。
3. 触摸响应,在对战中需要通过手指触摸点击下棋进行游戏的基本操作。
1
4. 游戏模式为双人对战,两人交替落子,双方孰先孰后随机决定。
5. 棋子的形式和作用:棋子分为黑白两种棋子, 双方各持一种棋子, 通过黑先白后的方式来
进行对局。
6. 通过棋子完成五连珠结束游戏。
五子棋的规则如下:
(1)棋盘:采用 10×10 的棋盘。
(2)下法玩家一执黑先手,玩家二执白后手,轮流在棋盘上选择一个无子的交叉点落子。
无子的交叉点又被称为空点。
(3)输赢判断:黑、白双方有一方的 5 颗棋子在横、竖或斜方向上连接成一线即为该方赢。
(4)对于五子棋可分为禁手和无禁手两类,本游戏采用三三禁手。可用 15×15 的二维数
表示棋盘内各点状态 (空、白子、黑子) ; 五子棋游戏规则简单,在每次玩家或电脑落棋
后,都要去判断是否游戏是否分出胜负,如没有,另一方才能继续下棋。一局游戏结束后,可
以选择再来一盘,这时将棋盘数据清空,又开始新的棋局。
游戏过程示意图如图 1 所示
2
图 1
游戏过程示意图
3 数据库设计
没使用数据库
4 详细设计和关键问题
(分功能模块描述设计细节,例如详细功能图、类图和关键流程图等。遇到的关键 Android
3
问题是如何解决的)
遇到的问题:
1. WebView 中图片等资源加载失败
有些情况下 WebView 中加载一些资源会失败,其中一个原因就是在 Android 5.0 开始
WebView 默认不允许加载 http 与 https 混合页面,即不支持同时加载 Https 和 Http 请求,比
如 https 页面加载 http 图片或者 http 页面加载 https 图片,那图片就显示不出来;这时可以
通过如下方法进行设置
该方法设置 WebView 的加载模式,参数有三种选择:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
MIXED_CONTENT_NEVER_ALLOW:Webview 不允许一个安全的站点(https)去加载非安全的
站点内容(http),比如 https 网页内容中的图片是 http 链接
MIXED_CONTENT_ALWAYS_ALLOW:WebView 是可以在一个安全的站点(Https)里加载非安全
的站点内容(Http), 这是 WebView 最不安全的操作模式,但是一般是一了百了的写法
MIXED_CONTENT_COMPATIBILITY_MODE:当涉及到混合内容时,WebView 会尝试去兼容最新
Web 浏览器的风格。一些不安全的内容(Http)能被加载到一个安全的站点上(Https),而其
他类型的内容将会被阻塞。这些内容的类型是被允许加载还是被阻塞,可能会随着版本的不同
而改变,官网并没有给出明确的定义。这种模式主要用于在 App 里面不能控制内容的渲染,但
是又希望在一个安全的环境下运行
2. PhotoView+ViewPager 发生 java.lang.IllegalArgumentException: pointerIndex out
of range 异常
描述: 当 PhotoView 和 ViewPager 组合时 ,用双指进行放大时 是没有问题的,但是用
双指进行缩小的时候,程序就会崩掉
原因: 多次触发触摸屏事件,导致对同一个事件处理的消息过多,当第一个消息已处理完
事件并销毁事件时,
由于该事件已销毁但还没来得及通知销毁第二个同样的消息,当主线程执行第二个消息时,
由于获取不了该事件,
所以抛出异常。简单理解就是 2 个控件对同一个 MotionEvent 出现了冲突.
解决:自定义一个类去继承 ViewPager ,然后重写 Viewpager 的 onInterceptTouchEvent()
的方法,捕捉该异常。
3. viewpageradapter 调用 notifyDataSetChanged()时不刷新页面.
原因: 在 getItemPosition()方法的源码中如果 item 的位置如果没有发生变化,则返回
POSITION_UNCHANGED。
如果返回了 POSITION_NONE,表示该位置的 item 已经不存在了。默认的实现是假设 item
的位置永远不会发生变化,
而返回 POSITION_UNCHANGED。
4
解决: 修改适配器的写法,覆盖 getItemPosition()方法,当调用 notifyDataS
etChanged 时,
让 getItemPosition 方法人为的返回 POSITION_NONE,从而达到强迫 viewpager 重绘所有
item 的目的。
4. didn’t find class on path dexpathlist
保证工程和引用库文件用同一个支持包,删除 build 目录,clean 工程
eq:第一个 activity 引用 android.app.activity 包,第二个 activity 引用 v7 包的
AppcompantActivity,这样可能就会报找不到第一个 activity
5. AndroidStudio 打包时报错 The same input jar is specified twice
原因 是 build.gradle 文件配置了
dependencies {
compile fileTree(include: '.jar’, dir: ‘libs’)
}
这里面已经添加过 jar 包,但是又在混淆文件 proguard.cfg 里面又加了句-libraryjars
libs/**.jar,
将-libraryjars libs/***.jar 前面用#号注释或者直接删掉即可。
注意:sdk 通过 proguard 混淆代码时默认已经将 lib 目录中的 jar 都已经添加到打包
脚本中,所以不需要再次手动添加。
6.Activity 当中的 EditText 的软键盘弹出问题
这个在 mainfest.xml 中 activity 下面有一个属性为 windowSoftInputMode,它共有 10 个
值可以配置,每个配置都对页面输入法弹出框影响不同
stateUnspecified :即未指定状态,当没有设置 android:windowSoftInputMode 属性的时
候,默认是这样的交互方式,系统会依据界面採取对应的软键盘的显示模式。比如当界面上
仅仅有文本和 button 的时候,软键盘就不会自己主动弹出。由于没有输入的必要
stateUnchanged:即状态不改变。就是当前界面的软键盘状态,取决于上一个界面的软键盘
状态。比如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;当前界面是
显示的,那么跳转之后的界面,软键盘也是显示状态
stateHidden:假设我们设置了这个属性,那么键盘状态一定是隐藏的,无论上个界面什么
状态。也无论当前界面有没有输入的需求,反正就是不显示。因此,我们能够设置这个属性,
来控制软键盘不自己主动的弹出
stateAlwaysHidden:这个属性也能够让软键盘隐藏。
stateVisible:能够将软键盘自动弹出来,即使在界面上没有输入框的情况下也能够强制弹
出来
stateAlwaysVisible:也是可以主动将软键盘弹出来,可是与 stateVisible 属性有小小的
5
不同之处。举个样例,当我们给 A 界面设置为 stateVisible 属性,假设当前的界面键盘是
显示的,当我们跳转到下个界面再回到当前界面的时候,键盘这个时候是隐藏的;可是假设
我们设置为 stateAlwaysVisible,我们跳转到下个界面再次回来的时候。软键盘是会显示
出来的
adjustUnspecified:设置软键盘与软件的显示内容之间的显示关系。当没有设置这个值的
时候,这个选项也是默认的设置模式,第一:页面没有滚动控件的时候,当输入框会被弹出
软键盘挡住的情况下,将输入框上移,以保证输入框处于用户视野范围,其它视图不变,如
果不会被挡住,页面视图位置不会变动;第二:页面有滚动控件的时候,将页面整体视图上
移,保证处于软键盘上方
adjustResize:同上,但是有两点不同,第一:这个属性是将 Activity 整个界面往上移动,
保证处于软键盘的上方,全部 View 可见;第二:会自动将软键盘弹出
adjustPan:与 adjustUnspecified 属性类似,但是有一点不同,就是页面有滚动控件的时
候,只会保证输入控件不被软键盘挡住,其它视图不保证
adjustNothing:这个属性没有实际意义,软键盘弹出的时候,页面所有 View 不会变动
代码设计:
1. 重写创造按钮的方法:
package com.imooc.wuziqi;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
private WuziqiPanel wuziqiPanel;//////////创建对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wuziqiPanel = (WuziqiPanel)findViewById(R.id.WuziqiPanel);////调用文件
}
///////////重写创造按钮的方法///////////
6