目录
一、项目概述 1
(一)安卓游戏发展趋势 1
(二)开发安卓游戏的意义 1
二、项目需求分析 2
(一)功能需求分析 2
(二)性能需求分析 2
(三)可行性分析 3
(四)项目开发目标 5
(五)软硬件需求 5
三、项目概要设计 5
(一)五子棋解释 5
(二)五子棋的基本规则 6
(三)五子棋的相关术语 6
(四)程序设计分析 6
(五)数据流图 7
四、功能模块的详细设计与实现 7
(一)用例图 7
(二)类图 9
(三)棋盘界面设计 12
(四)核心实现代码 14
五、运行测试 17
(一)程序测试 17
(二)测试方法和测试用例 19
(三)测试结论 19
(四)运行效果图 20
六、结论与展望 22
(一)功能需求分析
该五子棋游戏比较简单,进入界面,不会有提示的,且主要是人机对战,是由人先开局,电脑会智能的选择该在哪处下子,并会在每次下棋结束后判断是否有哪方已经获胜,如果获胜则结束本局游戏,并提示玩家游戏结束。故每次玩家在棋盘上点击鼠标,需要实现界面出现棋子,而电脑需要立即作出回复,在最适合的地方落子。因此,可以将本程序需要实现的功能,概括如下:
1.判断该坐标是否在棋盘之外,如果不是,记录下该坐标值以进行下一步操作。
2.判断该位置是否已有棋子,没有的话用类graphics. Paint画出棋子,并记录下棋盘的状态。
3.判断该颜色棋子的上下左右是否满足连续五个,是的话提醒相应玩家获胜,不是的话,更换玩家,监听事件处理结束。
4.对于玩家的更换是程序自动的,每次用户点击鼠标后,都会变换为电脑,从而画出对应黑方白方的棋子供玩家查看。
(二)性能需求分析
使用eclipse开发工具,使用Java开发语言,在Android 2. 1-update 1的虚拟环境下进行编程开发,需要套用android-7才能使程序进行运行。另外,需要计算出电脑每次需要落子的位置,不仅要阻止玩家的五子连线机会,还要主动发起攻势。必要的情况下,需要用户掌握一定的五子棋规则及技巧,避免由于盲目落子,造成个人的失败。但作为用户自己设计的智能电脑玩家,需要由参数来控制落子位置,这就要求对棋盘上的坐标进行仔细的研究。
(三)可行性分析
(1)经济可行性
经济可行性是指可以使用的资源的可能性(资源包括人力资源、自然资源和资金条件)。
本次设计注重游戏功能的实现,达到设计目的,不用于其他的商业用途。通过此次设计增强Java技术和实践的结合。同时了解可视化界面,设计操作界面和页面的跳转更换。操作环境需要Eclipse。相关资料可以上网查询。硬件方面可以普通笔记本可以达到要求。
(2)技术可行性
对于本游戏,可以使用如VB,Java,Delphi等相关的编程语言,但是考虑到编写程序的难易程度以及对编译语言的了解程度,本游戏选择Java程序语言作为编程语言。需要对变量定义、变量初始化、界面初始化、游戏初始化等,然后就可以进入游戏,处理游戏过程中的各种操作。同时进行技术可行性分析时,要注意以下一些问题。
1.全面考虑系统开发过程所涉及的所有技术问题
软件开发涉及多方面的技术,包括开发方法、软硬件平台、网络结构、系统布局和结构、输入输出技术、系统相关技术等。应该全面和客观地分析软件开发所涉及的技术,以及这些技术的成熟度和现实性。
2.尽可能采用成熟技术
成熟技术是被多人采用并被反复证明行之有效的技术,因此采用成熟技术一般具有较高的成功率。另外,成熟技术经过长时间、大范围使用、补充和优化,其精细程度、优化程度、可操作性、经济性等方面要比新技术好。鉴于以上原因,软件项目开发过程中,在可以满足系统开发需要、能够适应系统发展、保证开发成本的条件下,应该尽量采用成熟技术。
3.慎重引入先进技术
在软件项目开发过程中,有时为了解决系统的特定问题,为了使所开发系统具有更好的适应性,需要采用某些先进或前沿技术。在选用先进技术时,需要全面分析所选技术的成熟程度。有许多报道的先进技术或科研成果实际上仍处在实验室阶段,其实用性和适应性并没有得到完全解决,也没有经过大量实践验证,在选择这种技术时必须慎重。例如,许多文章中已经报道了指纹识别技术,而且市场上也有实验性产品,但指纹识别技术至今仍有许多重大技术难题没有突破,离具体应用仍有一定距离。因此,在项目开发中要谨慎选用这种技术。如果不加分析,在项目中盲目采用指纹识别技术,应用时肯定会出现许多难以解决的具体问题。
4.着眼于具体的开发环境和开发人员
许多技术总的来说可能是成熟和可行的,但是在开发队伍中如果没有人掌握这种技术,而且在项目组中又没有引进掌握这种技术的人员,那么这种技术对本系统的开发仍然是不可行的。例如,分布对象技术是分布式系统的一种通用技术,但是如果在开发队伍中没有人掌握这种技术,那么从技术可行性来看就是不可行的。
5.技术可行性评价
技术可行性评价是通过原有系统和欲开发系统的系统流程图和数据流图,对系统进行比较,分析新系统具有的优越性,以及对设备、现有软件、用户、系统运行、开发环境、运行环境和经费支出的影响,然后评价新系统的技术可行性。
(3)管理可行性
此次设计基于Java,有面向对象,可移植性,安全性,并发机制,支持可视化图形界面等特点。易于管理。
(4)法律可行性
法律可行性是考虑开发系统是否存在任何侵犯、妨碍和责任问题。本项目是自行开发的,所有技术资料都为合法,本文转载自http://www.biyezuopin.vip/onews.asp?id=14594开发过程中不存在知识产权问题,未抄袭任何已存在的的产品,所以开发这个系统即法律上是可行的。
(四)项目开发目标
该款五子棋游戏功能虽然简单,但最主要的还是实现了人与智能电脑对战的模式,所以从这个角度来说,该款游戏需要能很好的设计出电脑的智能。虽然程序不复杂,但要在满足玩家的基本要求的情况下,电脑有一定的智能,能给于新手一定的帮助。另外,通过研究五子棋游戏,帮助更好的运用自身所学,将理论付诸于程序设计中。
(五)软硬件需求
硬件环境需求:
CPU:Intel i5-6500;
内存:4G;
内存剩余资源:500M;
软件环境需求:
JDK 1.7及其以上的版本。
Eclipse。
package com.group.fivechess;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends Activity {
public static int arrWidth = 10, arrHeight = 12;
public static int[][] arr = new int[arrHeight][arrWidth];
public static boolean bo = false, bMusic = true;
public static int X = 0, Y = 0, P = 0;
private Draw view;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnExit = (Button) findViewById(R.id.button2);
Button btnStart = (Button) findViewById(R.id.button1);
Button btnMusic = (Button) findViewById(R.id.button3);
btnExit.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.angel.Android.MUSIC");
stopService(intent);
MainActivity.this.finish();
}
});
btnStart.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
P = 0;
MainActivity.bo = false;
MainActivity.initArr();
//MainActivity.this.finish();
//Intent intent = new Intent(MainActivity.this, MainActivity.class);
//startActivity(intent);
view.invalidate();
}
});
initArr();
init();
Intent intent = new Intent("com.angel.Android.MUSIC");
startService(intent);
btnMusic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
bMusic = !bMusic;
Intent intent = new Intent("com.angel.Android.MUSIC");
if (!bMusic)
stopService(intent);
else
startService(intent);
}
});
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onTouchEvent(MotionEvent event) {
// 在这里判断一下如果是按下操作就获取坐标然后执行方法
if (P == 0)
if (event.getAction() == MotionEvent.ACTION_DOWN) {
X = (int) event.getX();
Y = (int) event.getY();
onClickScreen();
}
return super.onTouchEvent(event);
}
public static void initArr() {
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = 0;
}
}
private void init() {
LinearLayout layout = (LinearLayout) findViewById(R.id.ll_canver);
view = new Draw(this);
view.setMinimumHeight(500);
view.setMinimumWidth(300);
// 通知view组件重绘
view.invalidate();
layout.addView(view);
}
public void onClickScreen() {
if (X > 65 && X < 425 && Y > 295 && Y < 735) {
if ((X - 65) % Draw.WIDTH > (Draw.WIDTH / 2)) {
X = (X - 65) / Draw.WIDTH + 1;
} else {
X = (X - 65) / Draw.WIDTH;
}
if ((Y - 295) % Draw.HEIGHT > (Draw.HEIGHT / 2)) {
Y = (Y - 295) / Draw.HEIGHT + 1;
} else {
Y = (Y - 295) / Draw.HEIGHT;
}
if (arr[Y][X] != 0) {
Toast.makeText(MainActivity.this, "已经有棋子了!请重新下子",
Toast.LENGTH_SHORT).show();
return;
} else {
if (bo)
arr[Y][X] = 1;// 黑
else
arr[Y][X] = 2;// 白
if (isWin(Y, X)) {
if (bo) {
Toast.makeText(MainActivity.this, "黑棋胜利!",
Toast.LENGTH_SHORT).show();
dialog();
} else {
Toast.makeText(MainActivity.this, "白棋胜利!",
Toast.LENGTH_SHORT).show();
dialog();
}
}
MainActivity.bo = !MainActivity.bo;
}
}
view.invalidate();
}
protected void dialog() {
P = 1;
}
static boolean isWin(int ro, int co) {
int count = 1;
// 右
for (int i = co + 1; i < arr[ro].length; i++) {
if (arr[ro][i] == arr[ro][co]) {
count++;
} else
break;
}
// 左
for (int i = co - 1; i >= 0; i--) {
if (arr[ro][i] == arr[ro][co]) {
count++;
} else
break;
}
if (count >= 5)
return true;
count = 1;
// 下
for (int i = ro + 1; i < arr.length; i++) {
if (arr[i][co] == arr[ro][co]) {
count++;
} else
break;
}
// 上
for (int i = ro - 1; i >= 0; i--) {
if (arr[i][co] == arr[ro][co]) {
count++;
} else
break;
}
if (count >= 5)
return true;
count = 1;
// 左上
for (int i = ro - 1, j = co - 1; i >= 0 && j >= 0; i--, j--) {
if (arr[i][j] == arr[ro][co]) {
count++;
} else
break;
}
// 右下
for (int i = ro + 1, j = co + 1; i < arr.length && j < arr[ro].length; i++, j++) {
if (arr[i][j] == arr[ro][co]) {
count++;
} else
break;
}
if (count >= 5)
return true;
count = 1;
// 左下
for (int i = ro + 1, j = co - 1; i < arr.length && j >= 0; i++, j--) {
if (arr[i][j] == arr[ro][co]) {
count++;
} else
break;
}
// 右上
for (int i = ro - 1, j = co + 1; i >= 0 && j < arr[i].length; i--, j++) {
if (arr[i][j] == arr[ro][co]) {
count++;
} else
break;
}
if (count >= 5)
return true;
return false;
}
}