先来整点运行示例给各位看下

要实现肯定是需要自定义控件这里我们继承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<>();}

测量先固定每个网格的大小

   @Overrideprotected 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;}

绘画(主要是画边框,绿方,蓝方的棋子,和当前最新的棋子标志)

    @Overrideprotected 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);}}}

下面的点击屏幕画棋子,然后判断师傅有五颗棋子

    @Overridepublic 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){//在判断总共的棋子大于0if(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-14int 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;}

其实五指棋就是画点然后判断是否有五颗就行了, 如果对你感兴趣有用的可以点个赞,或者关注

Android 最完整的五指棋代码示例相关推荐

  1. 【Groovy】Groovy 脚本调用 ( Groovy 配置文件格式 | Groovy 配置文件读取 | 完整配置文件及解析代码示例 )

    文章目录 前言 一.Groovy 配置文件格式 二.Groovy 配置文件读取 二.完整配置文件及解析代码示例 前言 在 Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 G ...

  2. Android发送接收短信的代码示例

    1.SMS Activity 短信发送Class package cn.dccssq; import java.util.List; import android.app.Activity; impo ...

  3. android java ibinder_Java IBinder.isBinderAlive方法代码示例

    import android.os.IBinder; //导入方法依赖的package包/类 /** * 获取已注册服务的IBinder对象,前提是该服务是静态服务,即默认一直存在,或者自己已经启动并 ...

  4. android java ibinder_Java IBinder.pingBinder方法代码示例

    import android.os.IBinder; //导入方法依赖的package包/类 /** * 获取已注册服务的IBinder对象,前提是该服务是静态服务,即默认一直存在,或者自己已经启动并 ...

  5. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

  6. android 给图片蒙上蒙层_Android 新手引导蒙层效果实现代码示例

    先上效果图: 这个效果一开始我是想直接让UI给个切图,后来发现这样不行,适配很差,达不到效果.所以就自己动手写代码,其实思路也很简单:在这个布局的父布局上面再手动添加一个view(通常LinearLa ...

  7. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  8. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  9. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

最新文章

  1. Android APK加壳技术方案----代码实现
  2. h3c telnet
  3. Mac OS使用技巧之三:发射无线网络信号的方法
  4. 陶哲轩实分析引理10.4.1:反函数定理
  5. android权限适配 简书,Android动态权限适配
  6. 计算机工程学院迎新晚会,计算机与信息工程学院2016级迎新晚会举行
  7. fork-join详解(1)
  8. 机械制图之平面与圆柱体表面的交线
  9. 35岁是继续做测试,还是回家送外卖?
  10. JAVA 实现银行卡归属地查询
  11. PLM系统应包括什么
  12. Beetlsql自学笔记
  13. 中国的程序员培训是不是有问题?
  14. (黑)群晖系统 ds photo 相机自动备份 无法识别DICM下的Camera解决方案
  15. Python-元祖-字典
  16. BUUCTF刷题记录 Harley Quinn
  17. 潇洒郎: 解决EDAS论文上传文字没有嵌入问题:Upload failed: The font Arial,Italic is not embedded in the file.
  18. CANopen协议,上位机开发(C#)
  19. sanicOpenApi 学习
  20. windows通过独立ip形式访问docker容器

热门文章

  1. 微信公众平台java开发
  2. 稠密的无人机激光雷达点云数据处理与分析方法与工具科普系列(五)
  3. mongo 使用命令行连接总是一直报验证失败 { ok: 0.0, errmsg: auth failed, code: 18, codeName: AuthenticationFailed
  4. 抄袭率检测过高 要避免哪些抄袭
  5. Word中页眉、页脚、页码设置
  6. 狂神说SpringCloud学习笔记(附带源码和笔记)
  7. 关于Dynamo-All Things Distributed
  8. 企业怎样才能成功推行精益生产?
  9. 用友谢志华:汇集企业云服务,构建云生态
  10. 【AUTOSAR】【Lin通信】Lin