我这个主活动加上吃子代码运行不了,但是又没有语法错误,请教一下大神们,哪里出现了错误,谢谢啦。
package com.example.gwongsam.zonghenggo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
/**
- 游戏主类
-
Created by sam on 2017/12/8.
*/
public class GameView extends View {//线条数量
private static final int MAX_LINE = 19;//线条的宽度
private int mPanelWidth;//线条的高度
private float mLineHeight;//画笔
private Paint mPaint = new Paint();//黑棋子
private Bitmap mBlack;//白棋子
private Bitmap mWhite;//比例,棋子的大小是高的四分之三
private float rowSize = 3 * 1.0f / 4;//存储用户点击的坐标
private ArrayList mWhiteArray = new ArrayList<>();
private ArrayList mBlackArray = new ArrayList<>();public GameView(Context context) {
super(context);
}//标记,是执黑子还是白子 ,白棋先手
private boolean mIsBlack = true;/**
- 构造方法 */ public GameView(Context context, AttributeSet attrs) { super(context, attrs); //测试颜色 //setBackgroundColor(0x44ff0000); initPaint(); initBitmap(); }
/**
- 初始化棋子 */ private void initBitmap() { //拿到图片资源 mBlack = BitmapFactory.decodeResource(getResources(), R.drawable.stone_black); mWhite = BitmapFactory.decodeResource(getResources(), R.drawable.stone_white); }
/**
- 初始化画笔 */ private void initPaint() { //设置颜色 mPaint.setColor(Color.BLACK); //设置线条宽度 mPaint.setStrokeWidth(3); //抗锯齿 mPaint.setAntiAlias(true); //设置防抖动 mPaint.setDither(true); //设置Style mPaint.setStyle(Paint.Style.STROKE); }
/**
-
测量
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//获取高宽值
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);int hightSize = MeasureSpec.getSize(heightMeasureSpec);
int hightMode = MeasureSpec.getMode(heightMeasureSpec);//拿到宽和高的最小值,也就是宽
int width = Math.min(widthSize, heightMeasureSpec);//根据测量模式细节处理
if (widthMode == MeasureSpec.UNSPECIFIED) {
width = hightSize;
} else if (hightMode == MeasureSpec.UNSPECIFIED) {
width = widthSize;
}//设置这样就是一个正方形了
setMeasuredDimension(width, width);
}
/**
-
测量大小
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);//拿到宽
mPanelWidth = w;
//分割
mLineHeight = mPanelWidth * 1.0f / MAX_LINE;//棋子宽度
int mWhiteWidth = (int) (mLineHeight * rowSize);//修改棋子大小
mWhite = Bitmap.createScaledBitmap(mWhite, mWhiteWidth, mWhiteWidth, false);
mBlack = Bitmap.createScaledBitmap(mBlack, mWhiteWidth, mWhiteWidth, false);
}
/**
-
绘制棋盘的方法
*/
private void drawLine(Canvas canvas) {
//获取高宽
int w = mPanelWidth;
float lineHeight = mLineHeight;//遍历,绘制线条
for (int i = 0; i < MAX_LINE; i++) {
//横坐标
int startX = (int) (lineHeight / 2);
int endX = (int) (w - lineHeight / 2);//纵坐标 int y = (int) ((0.5 + i) * lineHeight); //绘制横 canvas.drawLine(startX, y, endX, y, mPaint); //绘制纵 canvas.drawLine(y, startX, y, endX, mPaint);
}
}
/**
-
绘制棋子的方法
*/
private void drawPieces(Canvas canvas) {
for (int i = 0; i < mWhiteArray.size(); i++) {
//获取白棋子的坐标
Point whitePoint = mWhiteArray.get(i);
canvas.drawBitmap(mBlack, (whitePoint.x + (1 - rowSize) / 2) * mLineHeight, (whitePoint.y + (1 - rowSize) / 2) * mLineHeight, null);
}for (int i = 0; i < mBlackArray.size(); i++) {
//获取黑棋子的坐标
Point blackPoint = mBlackArray.get(i);
canvas.drawBitmap(mWhite, (blackPoint.x + (1 - rowSize) / 2) * mLineHeight, (blackPoint.y + (1 - rowSize) / 2) * mLineHeight, null);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);drawLine(canvas); drawPieces(canvas); //绘制完成之后判断是否提子 checkGrape();
}
/**
-
判断是否吃子
*/
public void checkGrape(){
int blockLength;
int[] block;
int[][] map={};
for(int i = 0;i < 19; i++){
for(int j = 0;j < 19; j++){
if(map[i][j] == 0)
continue;
else{
block = new int[361];
blockLength = 1;
block[0] = i*100 + j;recursion(i,j); if(hasQi()) continue; else { for(int t = 0;t < blockLength; t++) map[block[t]/100][block[t]%100] = 0; } } }
}
}
/** 递归检测块
/
public void recursion(int i,int j){
int blockLength=0;
int[] block={};
int[][] map={};
//Left
if(i-1 >= 0 && map[i-1][j] == map[i][j] && isInBlock((i-1)*100+j)){
block[blockLength] = (i-1)*100 + j;
blockLength++;
recursion(i-1,j);
}
//Up
if(j-1 >= 0 && map[i][j-1] == map[i][j] && isInBlock(i*100+j-1)){
block[blockLength] = i*100 + j-1;
blockLength++;
recursion(i,j-1);
}
//Right
if(i+1 < 19 && map[i+1][j] == map[i][j] && isInBlock((i+1)*100+j)){
block[blockLength] = (i+1)*100 + j;
blockLength++;
recursion(i+1,j);
}
//Down
if(j+1 < 19 && map[i][j+1] == map[i][j] && isInBlock(i*100+j+1)){
block[blockLength] = i*100 + j+1;
blockLength++;
recursion(i,j+1);
}
}
/*检测块是否有气
/
public boolean hasQi(){
int i,j;
int blockLength=0;
int[] block={};
int[][] map={};
for(int t = 0;t < blockLength; t++){
i = block[t]/100;
j = block[t]%100;
if(i-1 >= 0 && map[i-1][j] == 0) return true;
if(i+1 < 19 && map[i+1][j] == 0) return true;
if(j-1 >= 0 && map[i][j-1] == 0) return true;
if(j+1 < 19 && map[i][j+1] == 0) return true;
}
return false;
}
/*检测是否重复遍历
*/
public boolean isInBlock(int neighbor){
int blockLength=0;
int[] block={};
for(int i = 0;i < blockLength; i++)
{
if (block[i] == neighbor) return false;
}
return true;
}
/**
-
触摸事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
//按下事件
case MotionEvent.ACTION_DOWN:int x = (int) event.getX(); int y = (int) event.getY(); //封装成一个Point Point p = getValidPoint(x, y); //判断当前这个点是否有棋子了 if (mWhiteArray.contains(p) || mBlackArray.contains(p)) { //点击不生效 return false; } //判断如就存白棋集合,反之则黑棋集合 if (mIsBlack) { mWhiteArray.add(p); } else { mBlackArray.add(p); } //刷新 invalidate(); //改变值 mIsBlack = !mIsBlack; break;
}
return true;
}
/**
-
不能重复点击
*/
private Point getValidPoint(int x, int y) {return new Point((int) (x / mLineHeight), (int) (y / mLineHeight));
}
/**
- 系统状态 */ private static final String INSTANCE = "instace";
/**
-
存储状态
*/
@Override
protected Parcelable onSaveInstanceState() {Bundle bundle = new Bundle();
bundle.putParcelable(INSTANCE, super.onSaveInstanceState());
return bundle;
}
/**
- 再来一局 */ public void RestartGame() { mWhiteArray.clear(); mBlackArray.clear(); invalidate(); mIsBlack = true; }
/**
- 悔棋 */ public void Regret() { if (mBlackArray.size() > 0 || mWhiteArray.size() > 0) { if (mIsBlack) { mBlackArray.remove(mBlackArray.size() - 1); mIsBlack = !mIsBlack; } else { mWhiteArray.remove(mWhiteArray.size() - 1); mIsBlack = !mIsBlack; } invalidate(); } }
/**
- 只下黑棋 */ public void HeiOnly() { mIsBlack = true; }
/**
- 只下白棋 */ public void BaiOnly() { mIsBlack = false; } }