我这个主活动加上吃子代码运行不了,但是又没有语法错误,请教一下大神们,哪里出现了错误,谢谢啦。
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;
/**
/**
/**
/**
测量
*/
@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));
}
/**
/**
存储状态
*/
@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(INSTANCE, super.onSaveInstanceState());
return bundle;
}
/**
/**
/**
/**
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化?
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化?
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化 你试试
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化 你试试
先将你的代码 使用 markdown的 格式改为代码类型 现在太 难看了, 然后你的问题 有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化 你试试
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化 你试试
我觉得你公开代码对你不是很有利,其实你。。。。。
http://blog.csdn.net/u013787595/article/details/23158031希望对你有帮助
你可以使用 markdown 格式改为代码类型 是在有点难看~然后把代码逻辑整理一下
是运行效率?还是AI能力?还是不稳定?
先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化 你试试看