先来整点运行示例给各位看下
要实现肯定是需要自定义控件这里我们继承View,然后我们需要定义一些变量
private Context mContext;
private Paint biankuangPaint;
private Paint greenPaint;
private Paint bluePaint;
//边界的框
private int measureWidth;
//边界的高
private int measureHeight;
//每个网格的大小
private int gridWidth = 80;
//最大的横向网格数量
private int allXIndex;
//最大的纵向网格数量
private int allYIndex;
//所有点得集合
private List<PjPoint> pjPointList;
//最新旗子得标志画板
private Paint currentPointPaint;
//当前得最新分数(即分辨正反方得标志)
private int fiveQiNumber = 1;
//获取分数回调
private OnGetScore onGetScore;
//当前最新得点
private PjPoint currentPoint = null;
//是否退出当前页面
//private boolean isOver = false;
//是否有一方赢得胜利
private boolean isWin = true;
先初始化
private void init(Context context){
mContext = context;
biankuangPaint = new Paint();
biankuangPaint.setStrokeWidth(1);
biankuangPaint.setColor(context.getResources().getColor(R.color.w66));
greenPaint = new Paint();
greenPaint.setColor(context.getResources().getColor(R.color.colorAccent));
bluePaint = new Paint();
bluePaint.setColor(context.getResources().getColor(R.color.colorPrimary));
currentPointPaint = new Paint();
currentPointPaint.setColor(context.getResources().getColor(R.color.red));
currentPointPaint.setAntiAlias(true); //设置画笔为无锯齿
//currentPointPaint.setColor(Color.BLACK); //设置画笔颜色
//canvas.drawColor(Color.WHITE); //白色背景
currentPointPaint.setStrokeWidth((float) 5.0); //线宽
currentPointPaint.setStyle(Paint.Style.STROKE);
pjPointList = new ArrayList<>();
}
测量先固定每个网格的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureWidth = getMeasuredWidth();
measureHeight= getMeasuredHeight();
allXIndex = measureWidth / gridWidth;
measureWidth = allXIndex * gridWidth;
allYIndex = measureHeight / gridWidth;
measureHeight = allYIndex * gridWidth;
}
绘画(主要是画边框,绿方,蓝方的棋子,和当前最新的棋子标志)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//初始化边框
for (int i = 0; i <= allXIndex; i++) {
canvas.drawLine(gridWidth * i,0, gridWidth * i, measureHeight, biankuangPaint);
}
for (int i = 0; i <= allYIndex; i++) {
canvas.drawLine(0,gridWidth * i, measureWidth, gridWidth * i, biankuangPaint);
}
//画所有得点
drawPoint(canvas);
//画当前得点
drawCurrentPoint(canvas);
}
画当前的标志棋子
private void drawCurrentPoint(Canvas canvas){
if(currentPoint != null){
//canvas.drawCircle(currentPoint.x * gridWidth + gridWidth / 2, currentPoint.y * gridWidth + gridWidth / 2, gridWidth / 2, greenPaint);
RectF rectF = new RectF(currentPoint.x * gridWidth, currentPoint.y * gridWidth, (currentPoint.x + 1) * gridWidth, (currentPoint.y + 1) * gridWidth);
canvas.drawOval(rectF, currentPointPaint);
}
}
画蓝、绿棋子
private void drawPoint(Canvas canvas){
int size = pjPointList.size();
for (int i = 0; i < size; i++) {
PjPoint pjPoint = pjPointList.get(i);
int wb = pjPoint.wb;
if(wb == 0){
canvas.drawCircle(pjPoint.x * gridWidth + gridWidth / 2, pjPoint.y * gridWidth + gridWidth / 2, gridWidth / 2 - 1, greenPaint);
}else if(wb == 1){
canvas.drawCircle(pjPoint.x * gridWidth + gridWidth / 2, pjPoint.y * gridWidth + gridWidth / 2, gridWidth / 2 - 1, bluePaint);
}
}
}
下面的点击屏幕画棋子,然后判断师傅有五颗棋子
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN){
int pressX = (int) event.getX();
int pressY = (int) event.getY();
int currentX = pressX / gridWidth;
int currentY = pressY / gridWidth;
if(isWin == false){
if(currentX >=0 && currentX < allXIndex && currentY >= 0 && currentY < allYIndex){
PjPoint pjPoint = new PjPoint(currentX, currentY);
if(isContainChessAll(pjPoint) == false){
pjPoint.wb = fiveQiNumber % 2;
pjPointList.add(pjPoint);
onGetScore.onGetScoreInfo(fiveQiNumber);
fiveQiNumber ++;
Message message = Message.obtain();
message.obj = pjPoint;
message.what = 1;
mainHandler.sendMessage(message);
}
}
}
}
return true;
}
下面是悔棋
public void backChess(){
//首先判断没分出胜负的时候
if(isWin == false){
//在判断总共的棋子大于0
if(pjPointList.size() > 0){
//删除最新一条记录
pjPointList.remove(pjPointList.size() -1);
//把当前得标志减一
fiveQiNumber--;
//分数减一
onGetScore.onGetScoreInfo(fiveQiNumber);
if(pjPointList.size() > 0){
//重新绘制当前最新标志
currentPoint = pjPointList.get(pjPointList.size() -1);
}else{
currentPoint = null;
}
mainHandler.sendEmptyMessage(2);
}
}
}
下面是五指棋核心算法, 判断是否有五颗棋子
private boolean isWinChess(PjPoint pjPoint) {
//棋手输入的坐标为1-15,转换0-14
int xPos = pjPoint.x;
int yPos = pjPoint.y;
//横向检测
int x1 = 0;
for (int i = 1; i < 5; i++) {
//超出棋盘
if ((xPos - i) < 0) {
//结束左横向检测
break;
}
//统计相同棋子数
if (isContainChessWB(new PjPoint(xPos - i, yPos, pjPoint.wb))) {
x1++;
} else {
break;
}
}
int retainIndex = 5 - x1;
for (int i = 1; i < retainIndex; i++) {
//超出棋盘
if (xPos + i > allXIndex - 1) {
//结束右横向检测
break;
}
if (isContainChessWB(new PjPoint(xPos + i, yPos, pjPoint.wb))) {
x1++;
} else {
break;
}
}
if (x1 >= 4) {
return true;
}
//纵向检测
int x2 = 0;
for (int i = 1; i < 5; i++) {
//超出棋盘
if ((yPos - i) < 0) {
//结束上纵向检测
break;
}
//统计相同棋子数
if (isContainChessWB(new PjPoint(xPos, yPos - i, pjPoint.wb))) {
x2++;
} else {
break;
}
}
int retainIndex1 = 5 - x2;
for (int i = 1; i < retainIndex1; i++) {
//超出棋盘
if (yPos + i > allYIndex - 1) {
//结束下纵向检测
break;
}
if (isContainChessWB(new PjPoint(xPos, yPos + i, pjPoint.wb))) {
x2++;
} else {
break;
}
}
if (x2 >= 4) {
return true;
}
//斜下检测
int x3 = 0;
for (int i = 1; i < 5; i++) {
//超出棋盘
if ((xPos - i) < 0 || (yPos - i) < 0) {
//结束上斜下向检测
break;
}
//统计相同棋子数
if (isContainChessWB(new PjPoint(xPos - i, yPos - i, pjPoint.wb))) {
x3++;
} else {
break;
}
}
int retainIndex2 = 5 - x3;
for (int i = 1; i < retainIndex2; i++) {
//超出棋盘
if (xPos + i > allXIndex - 1 || (yPos + i) > allYIndex - 1) {
//结束下斜下向检测
break;
}
if (isContainChessWB(new PjPoint(xPos + i, yPos + i, pjPoint.wb))) {
x3++;
} else {
break;
}
}
if (x3 >= 4) {
return true;
}
//斜上检测
int x4 = 0;
for (int i = 1; i < 5; i++) {
//超出棋盘
if ((xPos + i) > 14 || (yPos - i) < 0) {
//结束上斜上向检测
break;
}
//统计相同棋子数
if (isContainChessWB(new PjPoint(xPos + i, yPos - i, pjPoint.wb))) {
x4++;
} else {
break;
}
}
int retainIndex3 = 5 - x4;
for (int i = 1; i < retainIndex3; i++) {
//超出棋盘
if (xPos - i < 0 || (yPos + i) > allYIndex - 1) {
//结束下斜下向检测
break;
}
if (isContainChessWB(new PjPoint(xPos - i, yPos + i, pjPoint.wb))) {
x4++;
} else {
break;
}
}
if (x4 >= 4) {
return true;
}
return false;
}
其实五指棋就是画点然后判断是否有五颗就行了, 如果对你感兴趣有用的可以点个赞,或者关注