Android自定义View实现五子棋小游戏
作者:wzjhoutai 时间:2022-05-18 14:56:59
本文实例为大家分享了Android实现五子棋小游戏的具体代码,供大家参考,具体内容如下
配图:
代码:
package com.example.fiveson;
import java.util.LinkedList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class FiveSon extends View {
public FiveSon(Context context) {
super(context);
// TODO Auto-generated constructor stub
init(context, null);
}
public FiveSon(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init(context, attrs);
}
public FiveSon(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
init(context, attrs);
}
private Paint paint = new Paint();
private Paint circlePaint = new Paint();
// 旗子: 信息 代表 第几行 第几列?
private List<int[]> chesses = new LinkedList<int[]>();
private void init(Context context, AttributeSet attrs)
{
chesses.add(new int[]{3,5});
chesses.add(new int[]{3,6});
}
int spacing = 100;
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
//1 绘制 X 坐标
int num = width / spacing;
paint.setColor(Color.BLACK);
for(int i=0;i<=num;i++)
{
canvas.drawLine(spacing*i, 0, spacing*i, height, paint);
}
num = height/spacing;
for(int i=0;i<=num;i++)
{
canvas.drawLine(0,spacing*i, width,spacing*i, paint);
}
//2 绘制Y 坐标
//3 绘制 旗子
if(!chesses.isEmpty())
{
int count = chesses.size();
for(int i=0;i<count;i++)
{
// 行列 信息
int[] location = chesses.get(i);
int rawX = location[1] * spacing;
int rawY = location[0] * spacing;
if(i%2==0)
{
circlePaint.setColor(Color.BLACK);
}else {
circlePaint.setColor(Color.GREEN);
}
canvas.drawCircle(rawX, rawY, 20, circlePaint);
}
}
}
/**
* 全然自己定义空间:
*
* 处理你恶不处理时间爱你的方法:
* onTouchEvent()
* onKeyEvent()
*
* 当然 也能够通过
* setOnTouchListener()
* setOnKeyListener();
*
* 外部操作:
* setOnTouchListener(OnTouchListener l)
* setOnKeyListener(OnKeyListener l)
*
*
*
* */
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean isComsumed = false;
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN)
{
// 分析点击的坐标 来推断 点击的 行数和 列数
int ex = (int)event.getX();
int ey = (int)event.getY();
int colNum = (int)(ex / spacing);
int rowNum = (int)(ey / spacing);
int colcc = ex % spacing;
int rowcc = ey % spacing;
if(colcc>=(spacing/2))
{
colcc++;
}
if(rowcc>=(spacing/2))
{
rowcc++;
}
// 推断什么时候add
int len = chesses.size();
if(len>0)
{
boolean has = false;
for(int i = len-1;i>=0;i--)
{
int[] chs = chesses.get(i);
if(rowNum == chs[0] && colNum == chs[1])
{
has = true;
break;
}
}
if(!has)
{
chesses.add(new int[]{rowNum,colNum});
invalidate();
}
}else {
chesses.add(new int[]{rowNum,colNum});
invalidate();
}
isComsumed = true;
}else {
isComsumed = super.onTouchEvent(event);
}
return super.onTouchEvent(event);
}
}
来源:https://www.cnblogs.com/wzjhoutai/p/6745197.html
标签:Android,五子棋
0
投稿
猜你喜欢
C#中ValueTuple的原理详解
2023-10-26 06:40:34
Android实现网易新闻客户端首页效果
2023-06-09 02:21:06
Android如何获取APP启动时间
2021-11-13 06:13:47
java如何判断一个对象是否为空对象
2023-12-11 06:53:59
java实现mp3合并的方法
2023-11-09 03:47:08
C#从命令行读取参数的方法
2023-07-12 15:23:11
Android中实现地址栏输入网址能浏览该地址网页源码并操作访问网络
2022-08-21 16:11:42
SpringMVC中的handlerMappings对象用法
2023-01-09 21:38:36
jvm垃圾回收之GC调优工具分析详解
2023-08-17 12:40:20
Springboot中如何通过yml为实体类注入属性
2021-08-10 13:51:28
swagger中如何给请求添加header
2023-05-15 14:27:52
浅析Java的Hibernate框架中的缓存和延迟加载机制
2023-04-12 15:58:00
Android 6.0指纹识别App开发案例
2021-06-05 10:30:07
ASP.NET C#中Application的用法教程
2023-09-16 14:09:32
详解Android版本适配:9.0 Pie
2022-08-07 05:37:43
Android实现ViewPage轮播图效果
2023-08-12 16:25:43
C#遍历List并删除某个元素的方法
2023-03-22 10:22:08
IDEA安装详细步骤(多图预警)
2022-02-28 14:38:39
Java实现简单酒店管理系统
2023-02-22 12:41:21
详解C#多线程之线程同步
2023-10-09 02:23:21