花笙米plus 2017-12-08 08:59 采纳率: 0%
浏览 1862
已结题

Android 围棋 求助大神修改一下代码

我这个主活动加上吃子代码运行不了,但是又没有语法错误,请教一下大神们,哪里出现了错误,谢谢啦。
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; } }

  • 写回答

11条回答 默认 最新

  • shsongtao 2017-12-08 09:37
    关注

    先将你的代码 使用 markdown的格式改为代码类型 现在太难看了, 然后你的问题有点模糊 现在是程序不能跑起来吗 还是单纯的做代码优化?

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)