欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定义View实现五子棋小游戏

程序员文章站 2023-11-14 17:10:40
本文实例为大家分享了android实现五子棋小游戏的具体代码,供大家参考,具体内容如下 配图: 代码: package com.example.fives...

本文实例为大家分享了android实现五子棋小游戏的具体代码,供大家参考,具体内容如下

配图:

Android自定义View实现五子棋小游戏

Android自定义View实现五子棋小游戏

Android自定义View实现五子棋小游戏

Android自定义View实现五子棋小游戏

代码:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。