Android-五子连珠(三)-自定义的view
在Java包下新建一个Java文件,其中添加如下代码,这是整个五子棋最核心的部分
package com.example.administrator.wuziqi;import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;/*** Created by Administrator on 2017/7/22.*/public class wuziqipan extends View{ImageButton button=(ImageButton) findViewById(R.id.Huiqi);ImageButton button1=(ImageButton) findViewById(R.id.Replay);private int panWidth; //棋盘边长private float panLineHeight; //棋盘格子边长private int MAX_LINE=13; //棋盘边长中格子个数private Bitmap mwhitepiece; //白棋子private Bitmap mblackpiece; //黑棋子private float ratio=3*1.0f/4; //设置棋子的直径与格子边长的比例private boolean mIsWhite=true; //是否轮到白旗下private List<Point> mWhiteArray=new ArrayList<>(); //白棋点的链表private List<Point> mBlackArray=new ArrayList<>(); //黑棋点的链表private boolean mIsGameover; //判断游戏是否结束private int MAX_SON=5; //几子棋private Paint paint=new Paint(); //画棋盘的画笔//初始化画笔和棋子public wuziqipan(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}//自定义画笔和棋子private void init(){paint.setColor(0x40000000); //灰paint.setAntiAlias(true); //抗锯齿paint.setDither(true); //防抖动paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(2);mwhitepiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_w2);mblackpiece = BitmapFactory.decodeResource(getResources(),R.drawable.stone_b1);}//设置自定义控件的高度和宽度@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize=MeasureSpec.getSize(widthMeasureSpec);int widthMode=MeasureSpec.getMode(widthMeasureSpec);int heightSize=MeasureSpec.getSize(heightMeasureSpec);int heightMode=MeasureSpec.getMode(heightMeasureSpec);int width=Math.min(widthSize,heightSize);if(widthMode==MeasureSpec.UNSPECIFIED) width=heightSize;else if(heightMode==MeasureSpec.UNSPECIFIED) width=widthSize;setMeasuredDimension(width,width);}//设置棋盘的宽度和格子宽度@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);panWidth=w;panLineHeight=(panWidth * 1.0f) /MAX_LINE;int pieceWidth=(int) (panLineHeight*ratio);mwhitepiece=Bitmap.createScaledBitmap(mwhitepiece,pieceWidth,pieceWidth,false);mblackpiece=Bitmap.createScaledBitmap(mblackpiece,pieceWidth,pieceWidth,false);}//点击事件@Overridepublic boolean onTouchEvent(MotionEvent event) {if(mIsGameover) return false;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;}//将点击的点的位置标准化private Point getValidPoint(int x,int y){return new Point((int)(x/panLineHeight),(int)(y/panLineHeight));}//绘图,用来调用画棋子和画棋盘函数@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawBoard(canvas);drawPieces(canvas);checkGameover();}//判断是否游戏结束private void checkGameover() {boolean whitewin = checkFiveInLine(mWhiteArray);boolean blackwin = checkFiveInLine(mBlackArray);if(whitewin||blackwin){mIsGameover=true;String text;if(whitewin) text="白棋胜";else text="黑棋胜";AlertDialog.Builder builder=new AlertDialog.Builder(this.getContext());builder.setTitle("GAME OVER");builder.setMessage(text+"! 是否重新开局?");builder.setNegativeButton("是的", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {GameAgain();}});builder.setPositiveButton("退出游戏", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.exit(0);}});AlertDialog modalDialog=builder.create();modalDialog.show();}}//重新开局public void GameAgain(){mIsWhite=true;mIsGameover=false;mWhiteArray.clear();mBlackArray.clear();invalidate();Toast.makeText(getContext(),"重新开局",Toast.LENGTH_SHORT).show();}//悔棋public void Huiqi(){if(mIsWhite&&mBlackArray.size()>0){mBlackArray.remove(mBlackArray.size()-1);Toast.makeText(getContext(),"黑棋不要脸",Toast.LENGTH_SHORT).show();}else{if(mWhiteArray.size()>0){mWhiteArray.remove(mWhiteArray.size()-1);Toast.makeText(getContext(),"白棋不要脸",Toast.LENGTH_SHORT).show();}}mIsGameover=false;mIsWhite=!mIsWhite;invalidate();}//判断是否有五个子连成一条线private boolean checkFiveInLine(List<Point> points){for(Point p:points){int x=p.x;int y=p.y;boolean win=checkHorizonal(x,y,points);if(win) return true;}return false;}//具体判断各个方向是否有五个子连成一条线private boolean checkHorizonal (int x,int y,List<Point> points){int cout=1;int cout1=1;int cout2=1;int cout3=1;boolean stop=false;boolean stop1=false;boolean stop2=false;boolean stop3=false;for (int i=1;i<MAX_SON;i++){if(points.contains(new Point(x-i,y))&&!stop){cout++;} else stop=true;if(points.contains(new Point(x,y-i))&&!stop1){cout1++;} else stop1=true;if(points.contains(new Point(x-i,y-i))&&!stop2){cout2++;} else stop2=true;if(points.contains(new Point(x-i,y+i))&&!stop3){cout3++;} else stop3=true;}for (int i=1;i<MAX_SON;i++){if(points.contains(new Point(x+i,y))&&stop){cout++;}else stop=false;if(points.contains(new Point(x,y+i))&&stop1){cout1++;}else stop1=false;if(points.contains(new Point(x+i,y+i))&&stop2){cout2++;}else stop2=false;if(points.contains(new Point(x+i,y-i))&&stop3){cout3++;}else stop3=false;}if(cout>=MAX_SON||cout1>=MAX_SON||cout2>=MAX_SON||cout3>=MAX_SON)return true;return false;}//画棋盘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-ratio)/2)*panLineHeight,(whitepoint.y+(1-ratio)/2)*panLineHeight,null);}for(int i=0,n=mBlackArray.size();i<n;i++){Point blackpoint=mBlackArray.get(i);canvas.drawBitmap(mblackpiece,(blackpoint.x+(1-ratio)/2)*panLineHeight,(blackpoint.y+(1-ratio)/2)*panLineHeight,null);}}//画棋子private void drawBoard(Canvas canvas){int w=panWidth;float lineheight=panLineHeight;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,paint);canvas.drawLine(y,startx,y,endx,paint);}}}
Android-五子连珠(三)-自定义的view相关推荐
- Android五子连珠
绘制棋盘面板: MainActivity.java package com.xbmu.wuziqi;import android.support.v7.app.AppCompatActivity; i ...
- 游戏更新-五子连珠-Android
五子连珠游戏,在9×9方格中,鼠标点击小球移动,每当5个或5个以上同颜色的小球连成1行,则消去并得分,如果移动时没有得分,将随机产生三个小球,当游戏不能放3个球时游戏结束. 下载地址: http:// ...
- 我的五子连珠-android
一直没有写博客了,这段时间在看一些书,提升下自己的理论基础.为了给女友写一个五子连珠,所以开始设计这款游戏,目前完成了游戏的路径寻找和动画移动.代码还是比较乱的,等我整理了会贴出来的,经常在博客里看别 ...
- 五子连珠游戏使用手册
[size=large]使用手册User Manual[/size] 本程序为一款五子连珠游戏,每移动一粒珠子,即随机出现三粒彩色珠子,当同颜色珠子连续排列超过五粒(含五粒)时,该排列成功消除并行分, ...
- 控制台的五子连珠游戏
手写控制台五子连珠游戏 前言 游戏需求 框架 总体框架 main代码 补充和完善 确定游戏中的类 初始化 显示游戏帧 获取输入 更新游戏帧 游戏结束 游戏截图 最终代码(和上面有些不同 如果想cv请看 ...
- 计算机游戏五子连珠怎么出来,Flash游戏制作--五子连珠(一)
五子连珠,在民间俗称"五子棋",是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,传统的玩法是两玩家在围棋棋盘上进行比赛,这里玩 ...
- 一个简单的五子连珠小游戏
一个简单的五子连珠小游戏 程序目的:设计一个五子连珠小游戏 1,棋盘大小是9X9 2,初始状态棋盘上随机分布着7个不同色的棋子. 3,当同色的棋子有5颗连在一起排成横向.纵向或者斜向时,游戏者可以得1 ...
- [从零开始unity3D]“五子连珠”游戏实现,网格数组的创建(1)
大概是一周前,在知乎上偶然看见一位前辈提供的意见,他认为在一个立志于进入游戏行业发展的程序员在大学期间应该多动手,亲自去完成一些项目,在遇到坑,填补坑的过程中快速的提升技术水平.想来我虽然已经入职游戏 ...
- python +pygame 制作五子连珠小游戏
python +pygame 制作五子连珠小游戏 学习python半年了,今天分享一个利用pygame制作的五子连珠游戏. 一.代码: 1.球类,ball.py """ ...
- 计算机游戏五子连珠怎么出来,五子连珠游戏程序流程图
满意答案 五子连珠介绍:玩家只需依照五子棋的基础规则进行相应怪物击杀凑成五子连珠,便能获得丰厚的通关奖励.脑力与战斗力的紧密结合,相信能带给你不一样的五子棋心得.玩家每天可以在五子连珠活动开启时间内进 ...
最新文章
- 【Python基础】学习Python 一定要吃透这 5 个内置函数
- Python自省(反射)指南
- Oracle中rownum用法警示
- matlab课程设计图像处理,MATLAB课程设计--GUI图像处理
- 计算机boot进入u盘启动,暗影精灵5怎么设置u盘启动 暗影精灵5设置u盘启动方法...
- Mysql经常使用函数汇总
- python3.x的改进
- 理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数
- MAC修改.bashrc/.bash_profile无效,默认的用户配置文件是.zshrc,
- Source Insight中的正则表达式和快捷键
- rtc芯片rx8025t在linux 3.10下的的驱动
- 12款华丽的Admin管理后台模板
- 北大30岁女博导获2019 IEEE青年成就奖,全球仅三人,深耕微纳电子、神经形态计算
- obj[key].obj['key'],obj.key的区别
- 隧道测量快速坐标反程序48004850计算器
- 【Unity Shader】 CubeMap(立方体贴图)
- 合并字符串(c++)
- RSA加密算法讲解及C++实现
- java地址簿管理系统
- drawio,程序员最好用的在线画图软件!!!