android 五子棋开发

两天完成基本功能,再对其进行细节bug优化,本小白的思路。
思路:
1.用canvas绘制棋盘:得到手机的分辨率。棋盘大小为19*19。将手机宽屏分为21份,取中间19份为棋盘。上下空白位置为按钮功能。
如下:画出棋盘。
protected void onDraw(Canvas canvas,Paint paint) {
canvas.drawColor(Color.rgb(128,64,0));
//canvas.drawColor(Color.WHITE);
w = chess_W/20;//平均分为21块 横坐标
h =scrren_h/2-chess_W/2;
for(int i =1; i<=19; i++ ){ //21分,画其中的地1份和第19份,0和20不画
canvas.drawLine(i*w,h+w,i*w,h+19*w, paint);
}//绘制直线
for(int i =1; i<=19;i++)
{
canvas.drawLine(w,h+i*w,19*w,h+i*w, paint);
}
paint.setStrokeWidth(3);
canvas.drawLine(w/2,h+w/2,w/2, h+19*w+w/2, paint);
canvas.drawLine(19*w+w/2,h+w/2,19*w+w/2,h+19*w+w/2, paint);
canvas.drawLine(w/2,h+w/2,19*w+w/2, h+w-w/2, paint);
canvas.drawLine(w/2,h+19*w+w/2,19*w+w/2, h+19*w+w/2, paint);
/*
* (w,h+w) (19*w,h+w)
*
*
* (w,h+19*w) (19*w,h+19*w)
* */
//绘制四角
// 绘制这个三角形,你可以绘制任意多边形
paint.setColor(Color.rgb(227,207,0));
Path path = new Path();
path.moveTo(w/2,h+18*w);// 此点为多边形的起点
path.lineTo(w/2,h+19*w+w/2);
path.lineTo(2*w,h+19*w+w/2);
path.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path, paint);
Path path1 = new Path();
path1.moveTo(w/2,h+w/2);// 此点为多边形的起点
path1.lineTo(w/2,h+w+w);
path1.lineTo(2*w,h+w/2);
path1.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path1, paint);
Path path2= new Path();
path2.moveTo(19*w+w/2,h+w/2);// 此点为多边形的起点
path2.lineTo(19*w+w/2,h+2*w);
path2.lineTo(18*w,h+w/2);
path2.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path2, paint);
Path path3 = new Path();
path3.moveTo(19*w+w/2,h+19*w+w/2);// 此点为多边形的起点
path3.lineTo(18*w,h+19*w+w/2);
path3.lineTo(19*w+w/2,h+18*w);
path3.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path3, paint);
}
2.在棋盘上落子:用canvas.bitmap。
需要注意的是:1.落子的地方以前没有被落子
2.落子的要保证落在棋盘的线上
3.落子要保证随心,不能与下棋者按下的棋点有偏差。
4.持黑先行,用步数控制应该下黑白棋。
5.采用一个二维数组存储数据,未落子为0,黑子为1,白子为2.
6.貌似canvas画图需要每次落子都要重新绘图,要从数组的提取数据依次绘图。可以自己设计算法,提高速度,比如根据步数,当发现棋子数量等于步数 后面就不用遍历了。最好不要全部遍历数组。
7.采用数组要注意数组越界问题。
8.边界问题!!!这个很重要。
落子落在棋线上和存储落子数据:
/判断落子
public float downx(float x,float y) { if (x > ChessDraw.w / 2 && x < ChessDraw.w * 19 + ChessDraw.w / 2) {
if (y > ChessDraw.h + ChessDraw.w / 2 && y < ChessDraw.h + 19 * ChessDraw.w + ChessDraw.w / 2) { int kx = (int) (x / ChessDraw.w);
int jx = (int) (x % ChessDraw.w); if (jx >= ChessDraw.w / 2) { //过了格子的一半
kx++;
x = kx * ChessDraw.w;
if(kx>20 || kx<=0) { //防止数组越界
x=-100;
}
}
else{ //未过格子的一半 x = kx * ChessDraw.w;
if(kx>20 || kx<=0) { //防止数组越界
x=-100;
}
} //获取落子的地点x
chess_x=kx;
}
else {
MySurfaceView.downQ = false; //不在棋盘,不允许落子
} }
else {
MySurfaceView.downQ = false; //不在棋盘,不允许落子
}
return x;
}
//判断落子 public float downy(float x, float y) { if (x > ChessDraw.w / 2 && x < ChessDraw.w * 19 + ChessDraw.w / 2) {
if (y > ChessDraw.h + ChessDraw.w / 2 && y < ChessDraw.h + 19 * ChessDraw.w + ChessDraw.w / 2) { //error
int ky = (int) ((y - ChessDraw.w / 2 - ChessDraw.h) / ChessDraw.w);
int jy = (int) ((y - ChessDraw.w / 2 - ChessDraw.h) % ChessDraw.w);
if (jy >= ChessDraw.w / 2) { //如果过了格子的一般
ky++;
y = ky * ChessDraw.w + ChessDraw.h ;
if(ky>20 || ky<=0) { //防止数组越界
y=-100;
} }
else{//如果没有过格子的一半 y=ky * ChessDraw.w + ChessDraw.h;
if(ky>20 || ky<=0) { //防止数组越界
y=-100;
}
}
//获取落子的地点x
chess_y=ky; }
else {
MySurfaceView.downQ = false;
}
}
else {
MySurfaceView.downQ = false; //不在棋盘,不允许落子
}
return y; }
public void downarr(int x, int y,int step){
if(step % 2 != 0)
chess_arr[x][y]=MySurfaceView.BLACK_CHESS;
else
chess_arr[x][y]=MySurfaceView.WRITE_CHESS;
}
3.胜利的判断,一共四个方向。对落子位子四个方向进行判断,如果一个方向累计成功五次以上即可。要注意数组坐标越界,可使用try catch,可优化算法。比如,前9步无需判断等,此处尚未优化,很暴力。
public ChessVictory(){
chessRule = new ChessRule();
}
public void chessvictory(int x, int y) {
int c =chessRule.chess_arr[x][y];
for (int i = 0; i < 4; i++) { //四个方向
linetrue2 = true;
linetrue1 = true;
victory_num=0;
tx1=0;
ty1=0;
tx2=0;
ty2=0;
for (int k = 0; k < 5; k++) {
try {
if (i == 0 && victory == false) {//对Y轴判断
ty1++;
int Ky1 = y+ty1;
ty2--;
int Ky2 = y+ty2;
if (linetrue1 && (chessRule.chess_arr[x][Ky1] == c)) {
victory_num++;
} else {
linetrue1 = false;
}
//y轴--判断,注意数组越界
if (linetrue2 && chessRule.chess_arr[x][Ky2] ==c) {
victory_num++;
} else {
linetrue2 = false;
}
if (victory_num >= 4) {
victory = true;
}
}
//对x轴判断
if (i == 1 && victory == false) {
tx1++;
int Kx1 = x+tx1;
tx2--;
int Kx2 = x+tx2;
if (linetrue1 && chessRule.chess_arr[Kx1][y] == c) {
victory_num++;
} else {
linetrue1 = false;
}
//y轴--判断,注意数组越界
if (linetrue2 && chessRule.chess_arr[Kx2][y] ==c) {
victory_num++;
} else {
linetrue2 = false;
}
if (victory_num >= 4) {
victory = true;
}
}
//斜对角判断
if (i == 2 && victory == false) {
tx1++;
int kx1 = x+tx1;
tx2--;
int kx2 = x+tx2;
ty1++;
int ky1 = y+ty1;
ty2--;
int ky2 = y+ty2;
if (linetrue1 && chessRule.chess_arr[kx2][ky1] == c) {
victory_num++;
} else {
linetrue1 = false;
}
//y轴--判断,注意数组越界
if (linetrue2 && chessRule.chess_arr[kx1][ky2] == c) {
victory_num++;
} else {
linetrue2 = false;
}
if (victory_num >= 4) {
victory = true;
}
}
//斜对角判断
if (i == 3 && victory == false) {
tx1++;
int kx1 = x+tx1;
tx2--;
int kx2 = x+tx2;
ty1++;
int ky1 = y+ty1;
ty2--;
int ky2 = y+ty2;
if (linetrue1 && chessRule.chess_arr[kx2][ky2] == c) {
victory_num++;
} else {
linetrue1 = false;
}
//y轴--判断,注意数组越界
if (linetrue2 && chessRule.chess_arr[kx1][ky1] ==c) {
victory_num++;
} else {
linetrue2 = false;
}
if (victory_num >= 4) {
victory = true;
}
}
} catch (Exception e) {
}
}
}
4.悔棋问题:
若只允许悔棋一次,可以直接对存储数据的数组操作。
若允许多次,可以在new一个数组进行每一步的存储(貌似数组存储不太好,具体实现的时候要考虑),悔棋时从此数组提取位子,在存储数据的数组上修改。
若要保存、载入等等。均可以在上次new的数组上进行保存。这样可以实现打谱。每次下一子,重现对局(未实现,只是思路)。
5.细节优化,比如从游戏进入后台,再从后台打开要保存原来的位置。本以为很难,其实在完成的时候只不过一笔带过。以及其余优化。
6.对战和AI设计。。。。继续完成。
android 五子棋开发的更多相关文章
- Android N开发 你需要知道的一切
title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 【转】Android 底层开发的几点
我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Android安全开发之安全使用HTTPS
Android安全开发之安全使用HTTPS 1.HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验.主机名弱校验.webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易 ...
- Android安全开发之通用签名风险
Android安全开发之通用签名风险 作者:伊樵.舟海.呆狐@阿里聚安全 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险.And ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
随机推荐
- 不输入密码ssh直接登录阿里云Linux主机
服务器环境:阿里云云服务器,Linux版本 - CentOS 客户端环境:Mac OSX Terminal 注意: 如果有3个账号都要无密码登录, 则3个账号都要这么操作 在Terminal中用ssh ...
- 微软嵌入式WEC2013产品研讨会(深圳站---2013.10.16)
主要内容如下: 1. Windows Embedded Compact 2013面向的市场 主要面向工业自动化.医疗设备和零售行业这些市场,和物联网关系非常紧密. 2. Windo ...
- 十条常用nmap命令行格式
十条常用nmap命令行格式 ) 获取远程主机的系统类型及开放端口 nmap -sS -P0 -sV -O <target> 这里的 < target > 可以是单一 IP, 或 ...
- 基于邻接矩阵的广度优先搜索遍历(BFS)
题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2141&cid=1186 #include<stdio.h> #incl ...
- C语言中的malloc和free
最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...
- I.MX6 Android Linux shell MMPF0100 i2c 获取数据
#!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 获取数据 # 说明: # 本文主要记录通过shell脚本来获取 ...
- Spring Bean之间的关系
bean之间的关系:继承和依赖继承bean的配置 Spring允许继承bean的配置,被继承的bean称为父bean,继承这个父bean的bean称为子bean 子bean从父bean中继承配置,包括 ...
- Entity Framework 增删改查和事务操作
1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否 ...
- Java was started but returned exit code=13 C:\ProgramData\Oracle\Java\javapath\javaw.exe
---------------------------Eclipse---------------------------Java was started but returned exit code ...
- 017QTP 描述性编程的使用方法
一.什么时候使用描述性编程 在测试过程中,有些界面元素是动态出现或动态变化的,在录制的时候并没有添加到对象库中 二.描述性编程的运行原理 用描述性编程编写的测试脚本在运行时,QTP会使用测试脚本中给出 ...