package com.barry.wuziqionline.widget;
import android.app.AlertDialog;
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.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import com.barry.wuziqionline.R;
import com.barry.wuziqionline.domain.Room;
import java.util.ArrayList;
import java.util.List;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.UpdateListener;
/**
* Created by Administrator on 2017/6/8.
*/
//f0c5a3
public class WuZiQionline extends View {
public static final String TAG = "WuZiQi";
private static final float TEXT_SIZE = 400;
private int mPanelWidth;//棋盘的宽度
private float mLineHeight;//每行的高度
private int MAX_LINE = 14;//棋盘行数
private int MAX_COUNT_IN_LINE = 5;
private Paint mPaint = new Paint();
private Bitmap mWhitePiece;
private Bitmap mBlackPiece;
private float ratioPiceOfLineHeight = 1f;
private boolean mIsWhite;
private ArrayList<Point> mWhiteArray = new ArrayList<>();
private ArrayList<Point> mBlackArray = new ArrayList<>();
private boolean mIsGameOver;
private boolean mIsWhiteWinner;
private Room room;
private int who;
int i;
public void input(Room r,int status,int i) {
this.mBlackArray = r.getBlackArray();
this.mWhiteArray = r.getWhiteArray();
this.mIsGameOver = r.isGameOver();
this.mIsWhiteWinner = r.isWhiteWinner();
this.room = r;
this.who =status;
this.i=i;
invalidate();
}
public WuZiQionline(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mPaint.setColor(0xee000000);
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStrokeWidth(5);
mPaint.setStyle(Paint.Style.STROKE);
mWhitePiece = BitmapFactory.decodeResource(getResources(), R.drawable.white);
mBlackPiece = BitmapFactory.decodeResource(getResources(), R.drawable.black);
}
@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_LINE;
int piceWidth = (int) (mLineHeight * ratioPiceOfLineHeight);
mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece, piceWidth, piceWidth, false);
mBlackPiece = Bitmap.createScaledBitmap(mBlackPiece, piceWidth, piceWidth, false);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(0x44000000);
paint.setTextSize(TEXT_SIZE);
canvas.drawText(who==1 ? "白" : "黑", (mPanelWidth - TEXT_SIZE) / 2, (mPanelWidth) / 2, paint);
drawBorad(canvas);
drawPiece(canvas);
checkGameOver();
}
private void checkGameOver() {
boolean whitewin = checkFiveInLine(mWhiteArray);
boolean blackwin = checkFiveInLine(mBlackArray);
if (whitewin || blackwin) {
mIsGameOver = true;
mIsWhiteWinner = whitewin;
String text = mIsWhiteWinner ? "白棋胜利" : "黑棋胜利";
showAlert(text);
}
}
private void showAlert(String text) {
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.alert_result, null);
TextView result = (TextView) inflate.findViewById(R.id.result);
result.setText(text);
new AlertDialog.Builder(getContext(), R.style.dialog)
.setView(inflate)
.show();
}
private boolean checkFiveInLine(List<Point> points) {
for (Point p : points) {
int x = p.x;
int y = p.y;
boolean win = checkHorizontal(x, y, points);
if (win) return true;
win = checkVetical(x, y, points);
if (win) return true;
win = checkLeftDiagonal(x, y, points);
if (win) return true;
win = checkRightDiagonal(x, y, points);
if (win) return true;
}
return false;
}
/**
* 判断x,y位置的旗子,是否横向有五个
*
* @param x
* @param y
* @param points
* @return
*/
private boolean checkHorizontal(int x, int y, List<Point> points) {
int count = 1;
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x - i, y))) {
count++;
} else {
break;
}
}
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x + i, y))) {
count++;
} else {
break;
}
}
if (count == 5) {
return true;
}
return false;
}
/**
* 判断x,y位置的旗子,是否纵向有五个
*
* @param x
* @param y
* @param points
* @return
*/
private boolean checkVetical(int x, int y, List<Point> points) {
int count = 1;
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x, y - i))) {
count++;
} else {
break;
}
}
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x, y + i))) {
count++;
} else {
break;
}
}
if (count == 5) {
return true;
}
return false;
}
/**
* 判断x,y位置的旗子,是否左斜有五个
*
* @param x
* @param y
* @param points
* @return
*/
private boolean checkLeftDiagonal(int x, int y, List<Point> points) {
int count = 1;
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x - i, y + i))) {
count++;
} else {
break;
}
}
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x + i, y - i))) {
count++;
} else {
break;
}
}
if (count == 5) {
return true;
}
return false;
}
/**
* 判断x,y位置的旗子,是否右斜有五个
*
* @param x
* @param y
* @param points
* @return
*/
private boolean checkRightDiagonal(int x, int y, List<Point> points) {
int count = 1;
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x - i, y - i))) {
count++;
} else {
break;
}
}
for (int i = 1; i < MAX_COUNT_IN_LINE; i++) {
if (points.contains(new Point(x + i, y + i))) {
count++;
没有合适的资源?快使用搜索试试~ 我知道了~
联网五子棋WuZiQiOnline.zip
共31个文件
xml:11个
png:9个
java:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 64 浏览量
2024-05-12
17:17:11
上传
评论
收藏 1.73MB ZIP 举报
温馨提示
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
联网五子棋WuZiQiOnline.zip (31个子文件)
WuZiQiOnline-master
app
src
main
java
com
barry
wuziqionline
WuZiQiOnline
WuZiQiapplication.java 1KB
ui
PlayActivity.java 2KB
OnlineActivity.java 9KB
MainActivity.java 1KB
domain
RoomBean.java 4KB
Room.java 2KB
widget
WuZiQi.java 12KB
WuZiQionline.java 13KB
res
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
drawable-xhdpi
wq.png 975KB
drawable-xxhdpi
gg.png 725KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
values-w820dp
dimens.xml 358B
values
dimens.xml 211B
colors.xml 208B
strings.xml 72B
styles.xml 931B
layout
activity_online.xml 1KB
dailog_createroom.xml 2KB
alert_result.xml 547B
activity_main.xml 850B
activity_play.xml 1KB
drawable
white.png 7KB
black.png 10KB
AndroidManifest.xml 2KB
proguard-rules.pro 641B
build.gradle 1KB
.gitignore 7B
共 31 条
- 1
资源评论
枫蜜柚子茶
- 粉丝: 6293
- 资源: 4641
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功