为了账号安全,请及时绑定邮箱和手机立即绑定

落子的问题

发现一个问题,为什么白棋下好之后,轮到黑棋的时候,如果点击已经存在白棋的地方,白棋就会变成黑棋???

正在回答

4 回答

package com.imooc.wuziqi;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;


public class WuziqiPanel extends View {
   private int mPanelWidth;
   private float mLineHeight;
   private int MAX_LINE = 10;

   private Paint mPaint = new Paint();
   private Bitmap mWhitePiece;
   private Bitmap mBlackPiece;

   private float ratiPieceOfLineHeight = 3 * 1.0f / 4;

   private boolean mIsWhite = true;
   private List<Point>mWhiteArray = new ArrayList<>();
   private List<Point>mBlackArray = new ArrayList<>();

   public WuziqiPanel(Context context, AttributeSet attrs) {
       super(context, attrs);

       setBackgroundColor(0x44ff0000);
       init();
   }
   private void init(){
       mPaint.setColor(0x88000000);
       mPaint.setAntiAlias(true);
       mPaint.setDither(true);
       mPaint.setStyle(Paint.Style.STROKE);

       mWhitePiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_w2);
       mBlackPiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_b1);
   }
   @Override
   protected void onMeasure(int widthMeasureSpace, int heightMeasureSpaec){
       //super.onMeasure(widthMeasureSpace,heightMeasureSpaec);
       int widthSize = MeasureSpec.getSize(widthMeasureSpace);
       int widthmode = MeasureSpec.getMode(widthMeasureSpace);
       int heightSize = MeasureSpec.getSize(heightMeasureSpaec);
       int heightMode = MeasureSpec.getMode(heightMeasureSpaec);

       int width = Math.min(widthSize,heightSize);
       if (widthmode == MeasureSpec.UNSPECIFIED){
           width = heightSize;
       }else if (heightMode == 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 pieceWidth = (int) (mLineHeight * ratiPieceOfLineHeight);

       mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece,pieceWidth,pieceWidth,false);
       mBlackPiece = Bitmap.createScaledBitmap(mBlackPiece,pieceWidth,pieceWidth,false);

   }
   @Override
   public boolean onTouchEvent(MotionEvent event) {
       int action = event.getAction();
       if( action == MotionEvent.ACTION_UP){
           int x = (int) event.getX();
           int y = (int) event.getY();
           Point p = getValidPoint(x,y);
           if(mWhiteArray.contains(p) || mBlackArray.contains(p)){  //判断本位置是否已下棋子。
               return false;
           }
           if(mIsWhite){
               mWhiteArray.add(p);
           }else{
               mBlackArray.add(p);
           }
           invalidate();
           mIsWhite = !mIsWhite;
           return true;
       }
       return true;    //上面改成ACTION_UP,则此处要改为true,否则不出现棋子。
   }

   private Point getValidPoint(int x, int y){
       return new Point();
   }
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       drawBoard(canvas);
       drawPieces(canvas);
   }

   private void drawPieces(Canvas canvas) {

       for(int i =0,n = mWhiteArray.size();i < n; i++)
       {
           Point whitePoint = mWhiteArray.get(i);
           canvas.drawBitmap(mWhitePiece,
                   (whitePoint.x + (1-ratiPieceOfLineHeight) / 2) * mLineHeight,
                   (whitePoint.y + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,null);
       }
       for(int i =0,n = mBlackArray.size();i < n; i++)
       {
           Point blackPoint = mBlackArray.get(i);
           canvas.drawBitmap(mBlackPiece,
                   (blackPoint.x + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,
                   (blackPoint.y + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,null);
       }
   }


   private void drawBoard(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);
       }
   }
}


0 回复 有任何疑惑可以回复我~
#1

sulo

private Point getValidPoint(int x, int y) { return new Point((int)(x / lineHeight),(int) (y / lineHeight)); }
2016-06-25 回复 有任何疑惑可以回复我~

package com.imooc.wuziqi;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;


public class WuziqiPanel extends View {
   private int mPanelWidth;
   private float mLineHeight;
   private int MAX_LINE = 10;

   private Paint mPaint = new Paint();
   private Bitmap mWhitePiece;
   private Bitmap mBlackPiece;

   private float ratiPieceOfLineHeight = 3 * 1.0f / 4;

   private boolean mIsWhite = true;
   private List<Point>mWhiteArray = new ArrayList<>();
   private List<Point>mBlackArray = new ArrayList<>();

   public WuziqiPanel(Context context, AttributeSet attrs) {
       super(context, attrs);

       setBackgroundColor(0x44ff0000);
       init();
   }
   private void init(){
       mPaint.setColor(0x88000000);
       mPaint.setAntiAlias(true);
       mPaint.setDither(true);
       mPaint.setStyle(Paint.Style.STROKE);

       mWhitePiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_w2);
       mBlackPiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_b1);
   }
   @Override
   protected void onMeasure(int widthMeasureSpace, int heightMeasureSpaec){
       //super.onMeasure(widthMeasureSpace,heightMeasureSpaec);
       int widthSize = MeasureSpec.getSize(widthMeasureSpace);
       int widthmode = MeasureSpec.getMode(widthMeasureSpace);
       int heightSize = MeasureSpec.getSize(heightMeasureSpaec);
       int heightMode = MeasureSpec.getMode(heightMeasureSpaec);

       int width = Math.min(widthSize,heightSize);
       if (widthmode == MeasureSpec.UNSPECIFIED){
           width = heightSize;
       }else if (heightMode == 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 pieceWidth = (int) (mLineHeight * ratiPieceOfLineHeight);

       mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece,pieceWidth,pieceWidth,false);
       mBlackPiece = Bitmap.createScaledBitmap(mBlackPiece,pieceWidth,pieceWidth,false);

   }
   @Override
   public boolean onTouchEvent(MotionEvent event) {
       int action = event.getAction();
       if( action == MotionEvent.ACTION_UP){
           int x = (int) event.getX();
           int y = (int) event.getY();
           Point p = getValidPoint(x,y);
           if(mWhiteArray.contains(p) || mBlackArray.contains(p)){  //判断本位置是否已下棋子。
               return false;
           }
           if(mIsWhite){
               mWhiteArray.add(p);
           }else{
               mBlackArray.add(p);
           }
           invalidate();
           mIsWhite = !mIsWhite;
           return true;
       }
       return true;    //上面改成ACTION_UP,则此处要改为true,否则不出现棋子。
   }

   private Point getValidPoint(int x, int y){
       return new Point();
   }
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       drawBoard(canvas);
       drawPieces(canvas);
   }

   private void drawPieces(Canvas canvas) {

       for(int i =0,n = mWhiteArray.size();i < n; i++)
       {
           Point whitePoint = mWhiteArray.get(i);
           canvas.drawBitmap(mWhitePiece,
                   (whitePoint.x + (1-ratiPieceOfLineHeight) / 2) * mLineHeight,
                   (whitePoint.y + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,null);
       }
       for(int i =0,n = mBlackArray.size();i < n; i++)
       {
           Point blackPoint = mBlackArray.get(i);
           canvas.drawBitmap(mBlackPiece,
                   (blackPoint.x + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,
                   (blackPoint.y + (1- ratiPieceOfLineHeight) / 2) * mLineHeight,null);
       }
   }


   private void drawBoard(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);
       }
   }
}

0 回复 有任何疑惑可以回复我~
@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();
    if( action == MotionEvent.ACTION_UP){
        int x = (int) event.getX();
        int y = (int) event.getY();
        Point p = getValidPoint(x,y);
        if(mWhiteArray.contains(p) || mBlackArray.contains(p)){  //判断本位置是否已下棋子。
            return false;
        }
        if(mIsWhite){
            mWhiteArray.add(p);
        }else{
            mBlackArray.add(p);
        }
        invalidate();
        mIsWhite = !mIsWhite;
        return true;
    }
    return true;    //上面改成ACTION_UP,则此处要改为true,否则不出现棋子。
}


0 回复 有任何疑惑可以回复我~
#1

随忆

还是不行啊,我Android studio也没有报错
2016-05-18 回复 有任何疑惑可以回复我~

有在落子的时候,也就是往对应的集合存放Point的时候先对集合进行判断吗?如果有值了Touch处理那块要返回false,代表不关心这个点击,这样就不会把子放到已经有的位置上了。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android-五子连珠
  • 参与学习       38994    人
  • 解答问题       174    个

Android游戏开发-五子连珠,本教程通过UI与逻辑实现双人对战

进入课程

落子的问题

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号