[要诀]五子连珠项目文档
第一章 需求分析 1
1.1功能与数据需求 ................................................................... 1 1.2界面需求 ............................................................................... 1 1.3开发与运行环境需求 ........................................................... 2 第二章 系统的设计实现............................................................... 3 2.1程序总体结构 ....................................................................... 3 2.2设计实现 ............................................................................... 3 第三章 测试................................................................................... 5 3.1鼠标响应测试 ....................................................................... 5 3.2移动消除小球测试 ............................................................... 6 第四章 用户手册........................................................................... 6
第五章 总结提高........................................................................... 6
5.1游戏设计总结 ....................................................................... 6 5.2对本项目的意见与建议 ....................................................... 6 附录:源代码................................................................................. 7
第一章 需求分析
1.1功能与数据需求
游戏区有一个9*9的方阵、用户鼠标点击一个球;用户选中一个小球后单击空白位置,可以把选中的小球移动到该位置。
游戏开始阶段,点击游戏图标,进入游戏。
规则:球移动时,只有同色球五个相同颜色相邻并组成一条直线(横向、竖向、斜向)的小球才可以消除并得分。
每次移动球后,如果达不到5个一组的,自动产生屏幕上方提示的三个球,每消失一组,得消失数目*2的分数。
1.2界面需求
游戏开始时直接显示初始界面,玩家开始游戏,默认伴随着音乐。
游戏开始后随机生成四色棋子(共5个)。
游戏界面包括:四种色小球、网格、游戏最高分、当前得分、下次即将产生的三个球、音乐设置菜单。
1.3开发与运行环境需求
开发环境为eclipse,操作系统windows98以上皆可。
第二章 系统的设计实现 2.1程序总体结构
初始界面:定义网格坐标位置。
出球模块:游戏开始阶段系统随机产生五个球和以后随机产生三个个不同颜色的球。
鼠标相应模块:判断所控制的球与、设置音、退出等操作;(该函数中已经包括了对于竖排、横排、斜排消去的小球的判断以及对应分数的累加) 2.2设计实现
单击游戏图片进入过程的界面:
进入游戏状态的界面:
第三章 测试 3.1鼠标响应测试
调试将鼠标点入开始框后随机产生球。 错误:点完后无反应。原因:开始状态的点坐标选错。
3.2移动消除小球测试
错误:每次移动完小球后,原地无法再次放小球。原因:每次移完小球后,该点的坐标没有更新为0,0为无球。
第四章 用户手册
本软件是一款娱乐游戏,名字为五子连珠,进入游戏画面后按返回键可以,结束游戏,开始后回随机出现四的小球共五个,以用鼠标选定你要选的小球,选定后,可用鼠标选在你要落的位置,直到小球连成一线,且数量不少于五,消去,加分,并且在出现三种不同颜色的小球。运行环境在windows98以上均可,无需安装,运行软件即可。
第五章 总结提高
5.1游戏设计总结
做完这个游戏后,我分厂的激动。起初以为不肯能完成的任务。现在全部完成了。但仍有不足之处,需要进一步改进。做完这个手机游戏项目之后,我觉得我在Java程序设计这个专业上有了一个质的飞跃,制作程序的过程中,遇到困难自己想办法去解决,弥补了自己以前在学Java语言的不足与学习上漏洞。编程时,往往遇到解决不了的问题,我常常和同学们一起探讨,最终解决我的问题,在交流的同时,自己的知识也会有很大的补充。尽管这个游戏还有很多的不足,但毕竟这是我的第一次,自己完成了一个以前全然没有接触过的领域的成果。当然我还是要努力的,在此,感谢老师还有同学们对我的帮助。我认为课设是一件十分有意义的事情,因为它让我们做到了学以致用,通过设计游戏的过程,我们学会了应用这学期所学的知识,来做一个小游戏。五子连珠的设计过程是艰苦但也是快乐的,艰苦是当设计遇到困难时的沮丧,而快乐是当问题用所学的知识解决是的成就感。
5.2对本项目的意见与建议
我认为这次游戏设计给的时间不是很充裕,没有充足的时间来美化自己的游戏。在制作过程中,有许多函数是教材和课设书内没有涉及的知识,需要我们上网进行搜索。Java语言的课结时间较早,我们在课设上有问题不能询问老师,不是很方便。另外,作为重点以及难点的指针和链表,这学期所用的课时不是很多,这方面的知识掌握的不是很牢固。只有拓宽了知识面,才能为将来做好准备
附录,源代码 球移动路径的代码文件PathArithmetic.java: package org.yxp.gobang.arithmetic;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.yxp.gobang.domain.Bead;
import android.graphics.Point;
public class PathArithmetic {
/** 记录已经过的点--张会敏 */
private List
invalidatePoints;
/** 记录路径上的点--张会敏 */
private List pathPoints;
private static PathArithmetic pathArithmetic = new PathArithmetic();
private PathArithmetic(){}
/** 单例模式 --张会敏*/
public static PathArithmetic getInstance(){
return pathArithmetic;
}
/**
* 获取2个珠子之间的路径
* --张会敏
*/
public List getPath(Bead[][] beads, Point from, Point to) {
invalidatePoints = new ArrayList();
pathPoints = new ArrayList();
boolean flag = isLink(beads , from , to);
System.out.println(flag);
System.out.println(pathPoints);
return pathPoints;
}
/**
* 宽度优先搜索算法
* --张会敏
*/
private boolean isLink(Bead[][] beads, Point from, final Point to) {
//第一步:记录经过的点
invalidatePoints.add(from);
//第二步:获取上、下、左、右四个点
Point[] points = {
new Point(from.x , from.y - 1),
new Point(from.x , from.y + 1),
new Point(from.x - 1 , from.y),
new Point(from.x + 1 , from.y)
};
//第三步:判断四个点是否有效或者是目的点
List lists = new ArrayList();
for(Point point : points){
if(point.equals(to)){
pathPoints.add(to);
return true;
}
if(check(beads , point)){
lists.add(point);
}
}
//第四步:判断有效点是否全部被占完
if(lists.isEmpty()) return false;
//第五步:对有效点进行按最短路径排序
Collections.sort(lists, new Comparator() {
//对lists集合按照compare方法进行比较
@Override
public int compare(Point lhs, Point rhs) {
//x*x + y*y开平方根
double r1 = Math.sqrt((lhs.x - to.x)*(lhs.x - to.x) + (lhs.y - to.y)*(lhs.y - to.y));
System.out.println("r1:" + r1);
double r2 = Math.sqrt((rhs.x - to.x)*(rhs.x - to.x) + (rhs.y - to.y)*(rhs.y - to.y));
System.out.println("r2:" + r2);
if(r1 < r2) return -1;
return 0;
}
});
//第六步:递归找出有效点及到搜索到目的点或有效点全部搜索完毕
for(Point p : lists){
boolean flag = isLink(beads , p , to);
if(flag){
pathPoints.add(p);
return true;
}
}
return false;
}
/**
* 检查点的有效性
* --张会敏
*/
private boolean check(Bead[][] beads, Point point) {
if(invalidatePoints.contains(point)){
//搜索过的点不需要再搜索
return false;
}
return point.x >= 0 && point.x < beads.length
&& point.y >= 0 && point.y < beads.length
&& beads[point.x][point.y].getBitmap() == null;
}
}
游戏初始化后的界面代码Welcome.java: package org.yxp.gobang.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class Welcome extends Activity {
/** 用Handler来设置自动跳转--张会敏*/
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == 1314){
Intent intent = new Intent(Welcome.this , main.class);
startActivity(intent);
}
};
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
//延迟3秒发送消息
handler.sendEmptyMessageDelayed(1314, 3000);
}
@Override
protected void onPause() {
this.finish();
super.onPause();
}
}
五子相消约束代码文件ScanArithmetic.java: package org.yxp.gobang.arithmetic;
import java.util.ArrayList;
import java.util.List;
import org.yxp.gobang.domain.Bead;
import org.yxp.gobang.util.Constant;
import android.graphics.Point;
public class ScanArithmetic {
/** 定义要消除的点的集合--张会敏 */
private static List> lists = new ArrayList>();
/**
* 扫描珠盘,找到可以消除的珠子,并返回点的集合
* --张会敏
*
*/
public static List> scan(Bead[][] beads) {
/** 四个方位的扫描--张会敏 */
lists.clear();
List point_1 = horizontalScan(beads);
List point_2 = verticalScan(beads);
List point_3 = leftSlantingScan(beads);
List point_4 = rightSlantingScan(beads);
if(point_1 != null){
lists.add(point_1);
}
if(point_2 != null){
lists.add(point_2);
}
if(point_3 != null){
lists.add(point_3);
}
if(point_4 != null){
lists.add(point_4);
}
return lists;
}
/**
* 右斜扫描
* --张会敏
*/
private static List rightSlantingScan(Bead[][] beads) {
//取区间: (4,0-8,0-8,4)
for(int i = 4 ; i <= 12 ; i ++){
String colors = "";
List points = new ArrayList();
if(i < beads.length){//基于0,4点往右上扫描
for(int j = 0 ; j <= i ; j ++){
Bead bead = beads[j][i - j];
colors += bead.color;
points.add(new Point(j , i - j));
}
}else{//基于8,1点往左下扫描
for(int j = beads.length - 1 ; j > i - beads.length ; j --){
Bead bead = beads[j][i - j];
colors += bead.color;
points.add(new Point(j , i - j));
}
}
for(String str : Constant.FINAL_COLORS){
//假如有五种颜色的珠子连在一起
if(colors.contains(str)){
//算出连在一起的珠子的起始与结束位置
int start = colors.indexOf(str);
int end = colors.lastIndexOf(str) + str.length();
List res = new ArrayList();
for(int k = start ; k < end ; k ++){
res.add(points.get(k));
}
return res;
}
}
}
return null;
}
/**
* 左斜扫描
* --张会敏
*/
private static List leftSlantingScan(Bead[][] beads) {
//取区间[0,4-0,0-4,0]
for(int i = -4 ; i <= 4 ; i ++){
String colors = "";
List points = new ArrayList();
if(i <= 0){//基于0,4点往右下扫描
for(int j = 0 ; j < beads.length + i ; j ++){
Bead bead = beads[j][j - i];
colors += bead.color;
points.add(new Point(j , j - i));
}
}else{//基于8,7点往左上扫描
for(int j = beads.length - 1 ; j >= i ; j --){
Bead bead = beads[j][j - i];
colors += bead.color;
points.add(new Point(j , j - i));
}
}
for(String str : Constant.FINAL_COLORS){
//假如有五种颜色的珠子连在一起
if(colors.contains(str)){
//算出连在一起的珠子的起始与结束位置
int start = colors.indexOf(str);
int end = colors.lastIndexOf(str) + str.length();
List res = new ArrayList();
for(int k = start ; k < end ; k ++){
res.add(points.get(k));
}
return res;
}
}
}
return null;
}
/**
* 竖向扫描
* --张会敏
*/
private static List verticalScan(Bead[][] beads) {
for(int i = 0 ; i < beads.length ; i ++){
List points = new ArrayList();
String colors = "";
for(int j = 0 ; j < beads.length ; j ++){
//把一列的珠子颜色用一个字符串存储,并存储每一列的所有点的集合
Bead bead = beads[i][j];
colors += bead.color;
points.add(new Point(i , j));
}
for(String str : Constant.FINAL_COLORS){
//代表有五种相同颜色的珠子连在一起
if(colors.contains(str)){
int start = colors.indexOf(str);
int end = colors.lastIndexOf(str) + str.length();
List res = new ArrayList();
//得到可以消除的珠子的点的集合,并返回出去
for(int k = start ; k < end ; k ++){
res.add(points.get(k));
}
return res;
}
}
}
return null;
}
/**
* 横向扫描
* --张会敏
*/
private static List horizontalScan(Bead[][] beads){
for(int i = 0 ; i < beads.length ; i ++){
List points = new ArrayList();
String colors = "";
for(int j = 0 ; j < beads.length ; j ++){
//把一行的珠子颜色用一个字符串存储,并存储每一行的所有点的集合
Bead bead = beads[j][i];
colors += bead.color;
points.add(new Point(j , i));
}
for(String str : Constant.FINAL_COLORS){
//代表有五种相同颜色的珠子连在一起
if(colors.contains(str)){
int start = colors.indexOf(str);
int end = colors.lastIndexOf(str) + str.length();
List res = new ArrayList();
//得到可以消除的珠子的点的集合,并返回出去
for(int k = start ; k < end ; k ++){
res.add(points.get(k));
}
return res;
}
}
}
return null;
}