# 安卓项目五子棋代码详解（四）

private boolean IsGameOver; //判断游戏是否结束
private boolean IsWhitewin; //判断白棋是否胜利

private void checkGameover() {
boolean whitewin = checkFiveInline(Whitearray);
boolean blackwin = checkFiveInline(Blackarray);
boolean textflag = false;
if(whitewin){
IsGameOver = true;
IsWhitewin = true;
textflag = true;
showDlog("白棋胜利");
}
if(blackwin){
IsGameOver = true;
IsWhitewin = false;
textflag = true;
showDlog("黑棋胜利");
}
if(textflag){
String text = IsWhitewin?"白棋胜利":"黑棋胜利";
Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
}
}

checkFiveInLine()中传入的参数就是白棋坐标和黑棋坐标

private boolean checkFiveInline(List<Point> myarray) {
for(Point p:myarray){
int x = p.x;
int y = p.y;
boolean flag = checkHorizontal(x , y ,myarray)||checkVertical(x,y,myarray)||checkLeftDiagonal(x,y,myarray)||checkRightDiagonal(x,y,myarray);
if(flag){
return true;
}
}
return false;
}

这里中，for(Point p:myarray)这一个循环其实是相当于for(Point p=0;p<myarray.length();p++),用来遍历Point型数组myarray的,每一次访问数组myarray的时候读取的数据放入Point型的p中

flag有数值之后，再用一个if语句判断并返回boolean数值

//水平方向检查是否五子
private boolean checkHorizontal(int x,int y,List<Point> myarray){
int count=1;
//右边检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x+i,y))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}
//左边检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x-i,y))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}

return false;
}

//垂直方向检查五子
private boolean checkVertical(int x,int y,List<Point> myarray){
int count=1;
//下边检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x,y+i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}
//上边检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x,y-i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}
return false;
}

//左斜方向检查是否五子
private boolean checkLeftDiagonal(int x,int y,List<Point> myarray){
int count=1;
//左上角向右下角检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x+i,y+i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}
//右下角向左上角检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x-i,y-i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}

return false;
}
//右斜方向检查是否五子
private boolean checkRightDiagonal(int x,int y,List<Point> myarray){
int count=1;
//左下角向右上角检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x+i,y-i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}
//右上角想左下角检查是否五子
for(int i = 1;i < 5; i++){
if (myarray.contains(new Point(x-i,y+i))) {
count++;
}else {
break;
}
}
if (count == 5) {
return true;
}

return false;
}

if(IsGameOver){
return false;
}

private void checkGameover() {
boolean whitewin = checkFiveInline(Whitearray);
boolean blackwin = checkFiveInline(Blackarray);
boolean textflag = false;
if(whitewin){
IsGameOver = true;
IsWhitewin = true;
textflag = true;
showDlog("白棋胜利");
}
if(blackwin){
IsGameOver = true;
IsWhitewin = false;
textflag = true;
showDlog("黑棋胜利");
}
if(textflag){
String text = IsWhitewin?"白棋胜利":"黑棋胜利";
Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
}
}

虽然上面所说可以判断一个游戏的输赢，但是没有提示玩家怎么知道谁输谁赢，所以我们就得弄一个Toast提示，个人觉得加了一个Toast体验还不够好，于是就是再多加了一个对话框提示，在游戏结束的时候弹出。

String text = IsWhitewin?"白棋胜利":"黑棋胜利";

if(IsWhitewin==true){　　String text = "白棋胜利";}else{　　String text = "黑棋胜利";}

之后调用Toast的makeTex()t的show()方法弹出Toast

getContext()是View提供的一个获取View显示的当前的activity方法

showDlog()方法如下

//弹出对话框
private void showDlog(String winner) {
builder.setTitle("对战结果");
builder.setMessage(winner);

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
restart();
}
});
builder.create().show();

}

在游戏结束的时候弹出对话框，提示胜利的一方，之后下面有着两个按钮，一个是确定，另外一个是再来一局，我为这两个按钮设置了监听器，当用户点击确定按钮的时候，就会取消对话框，当用户点击再来一局按钮的时候，就会取消对话框，同时再来一局，可以看到，再来一局按钮的onClick()方法中有一个定义的方法restart()方法，这个方法就是用来实现再来一局的功能

public void restart(){//重新开始
Whitearray.clear();
Blackarray.clear();
IsGameOver = false;
IsWhitewin = false;
invalidate();

}

(⊙o⊙)哦，差点忘了，还有我自定义的个性功能啊，嗯，那就多加一期，下一期见了！！

posted @ 2017-08-22 20:41  Stars-one  阅读(2502)  评论(0编辑  收藏  举报