好长时间没有学习了,昨天晚上在家看了《慕课网》最Android的最新视屏“五子棋”开发部分,就趁现在还有印象做个学习笔记。
public class GobangView extends View {
private Bitmap mWhiteChess;//白棋图片
private Bitmap mBlackChess;//黑棋图片
private int mPanelWidth;//棋盘宽度
private float mLineHeight;//每一格的高度
private final static int MAX_LINES = 10;//棋盘多少格(10*10)
private Paint mPaint;//画笔
private float mChessRatio = 3.0f / 4;//设置棋子大小
private List<Point> mBlackList = new ArrayList<>();//黑棋子数据
private List<Point> mWhiteList = new ArrayList<>();//白棋子数据boo
private boolean isWhiteFirst = false;//是否先出白棋
private boolean isBlackWin = false;//黑棋子赢
private boolean isWhiteWin = false;//白棋子赢
private boolean isGameOver = false;//游戏是否结束
private final static int LINE_MAX_NUMS = 5;//同色五子成线表示结束
public interface IChessResultListener {
void ResultListerer(int result);
}
private IChessResultListener mListener;
public void setIChessResultListener(IChessResultListener mListener) {
this.mListener = mListener;
}
public GobangView(Context context) {
this(context, null);
}
public GobangView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GobangView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setBackgroundColor(0x44ff0000);//设置背景色
initPaintAndBitmap();
}
/**
* 初始化及设置画笔
*/
private void initPaintAndBitmap() {
mPaint = new Paint();
mPaint.setColor(0x88000000);
mPaint.setAntiAlias(true);//设置抗锯齿
mPaint.setDither(true);//设置防抖动
mPaint.setStyle(Paint.Style.STROKE);//设置图形是空心的
//设置白棋和黑棋图片
mBlackChess = BitmapFactory.decodeResource(getResources(), R.drawable.black);
mWhiteChess = BitmapFactory.decodeResource(getResources(), R.drawable.white);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawChessBoard(canvas);//绘制棋盘(10*10网格)
drawChesses(canvas);//绘制棋子
// checkGameResult();//游戏结束处理
}
private void drawChesses(Canvas canvas) {
//绘制白棋
int wSize = mWhiteList.size();
for (int i = 0; i < wSize; i++) {
Point wp = mWhiteList.get(i);
canvas.drawBitmap(mWhiteChess, (wp.x + (1 - mChessRatio) / 2) * mLineHeight, (wp.y + (1 - mChessRatio) / 2) * mLineHeight, null);
}
//绘制黑棋
int bSize = mBlackList.size();
for (int i = 0; i < bSize; i++) {
Point bp = mBlackList.get(i);
canvas.drawBitmap(mBlackChess, (bp.x + (1 - mChessRatio) / 2) * mLineHeight, (bp.y + (1 - mChessRatio) / 2) * mLineHeight, null);
}
}
private void drawChessBoard(Canvas canvas) {
for (int i = 0; i < MAX_LINES; i++) {
int startX = (int) (mLineHeight / 2);
int endX = (int) (mPanelWidth - mLineHeight / 2);
int y = (int) ((0.5 + i) * mLineHeight);
canvas.drawLine(startX, y, endX, y, mPaint);//绘制横线
canvas.drawLine(y, startX, y, endX, mPaint);//绘制纵线
}
}
@Override
protected 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);//设置大小
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mPanelWidth = w;
mLineHeight = mPanelWidth * 1.0f / MAX_LINES;
int chessSize = (int) (mLineHeight * mChessRatio);
mBlackChess = Bitmap.createScaledBitmap(mBlackChess, chessSize, chessSize, false);//通过图片缩放设置棋子大小
mWhiteChess = Bitmap.createScaledBitmap(mWhiteChess, chessSize, chessSize, false);
}
/**
* 处理棋子的移动(下棋)
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isGameOver) {//如果游戏结束,则直接return
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();
Point p = getValidPoint(x, y);
if (mWhiteList.contains(p) || mBlackList.contains(p)) {
return false;
}
if (isWhiteFirst) {
mWhiteList.add(p);
} else {
mBlackList.add(p);
}
invalidate();
isWhiteFirst = !isWhiteFirst;
}
return true;
}
private Point getValidPoint(int x, int y) {
return new Point((int) (x / mLineHeight), (int) (y / mLineHeight));
}
}
界面及布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_again"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="再来一次"
android:layout_margin="10dp"/>
<com.ldm.test.GobangView
android:id="@+id/gobang"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btn_again"
android:background="@mipmap/wuzi_bg" />
</RelativeLayout>
public class MainActivity extends Activity {
private GobangView gobangView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gobangView = (GobangView) findViewById(R.id.gobang);
gobangView.setIChessResultListener(new GobangView.IChessResultListener() {
@Override
public void ResultListerer(int result) {
if (result == 0) {
showMst("黑棋赢了!");
} else {
showMst("白棋赢了!");
}
}
});
}
视频教程还没有看完成,下次继续写接下来的部分:如何判断输赢以及再来一局等。感谢老师的无私传授!