博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓项目五子棋代码详解(四)
阅读量:4553 次
发布时间:2019-06-08

本文共 6849 字,大约阅读时间需要 22 分钟。

 

前几期介绍完了各种方法,就是可以实现下棋的功能了,但是,还无法判断输赢,这一期就是讲解判断输赢的方法

 

正文开始———

首先,我们得声明两个boolean类型的变量

 

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

两个变量的作用已经注释了,这里便不解释了

 

之后,定义一个方法来实现判断输赢,在这个方法之中还加入了弹出对话框与Toast提示,具体的之后详解

 

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

 

这里代码有点多,我一个个解释。

首先,我定义了两个两个boolean变量用来判断游戏中是白棋胜利还是黑棋胜利,这两个boolean的值由checkFiveInLine()方法返回可得

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

 

private boolean checkFiveInline(List
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中

得到的横坐标与纵坐标给x与y,之后再是声明一个boolean类型的flag变量,将x与y作为参数传入到横向,纵向,斜向是否有五子方法中,之后由检查横向,纵向,斜向是否有五子方法的返回值经过逻辑与的逻辑计算得到数值

逻辑与计算,只要有一个为真,结果都是为真

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

检查横向,纵向,斜向是否有五子方法代码如下,具体的都有注释了,这里需要注意的是,x和y坐标原点是在屏幕左上角,也就是说,x+是往右边,y+是往下边,这里应该不难,理解一个就是能举一反三了

//水平方向检查是否五子    private boolean checkHorizontal(int x,int y,List
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
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
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
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; }

 

 

回到checkGameOver()这个方法中来,先忽略掉textflag这个boolean变量,前面的两个boolean变量已经获得了数值,之后便是由两个if语句判断,之后给相应的全局变量赋值其实赋值的话可以提取出来放在两个if语句之后,或者作为一个方法,这样的话可以省一些代码,不过,为了方便理解,我就是写进了if语句之中),到这一步是可以判断输赢了,但是还是可以画棋子的,我们还需要在onTouchEvent事件中加入一个if判断,如果IsGameOver这个boolean变量数值为true的话,就返回一个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体验还不够好,于是就是再多加了一个对话框提示,在游戏结束的时候弹出。

在这里就先说Toast,首先声明了一个textflag的boolean变量,用来判断状态,由最后一个if语句判断,由textflag的数值我们可以知道,最后一个的if语句中的代码一定会执行

解释一下

 

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

 

上面的代码相当于下面

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

 

 

 

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

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

我自己写了一个对话框,那个showDlog就是我自己定义的用来实现弹出对话框的方法

showDlog()方法如下

 

//弹出对话框    private void showDlog(String winner) {        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());        builder.setTitle("对战结果");        builder.setMessage(winner);        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.cancel();            }        }).setNegativeButton("再来一局", new DialogInterface.OnClickListener() {            @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(); }

 

 

 

清除数组里的坐标,改变两个boolean变量的数值,之后用invalidate()方法刷新界面

 

 

到这里,一个能玩的五子棋安卓项目就是弄好了,详解正式完结了~撒花~~撒花~~

 

 

众人:喂,你更换背景的功能还没有讲呢?

 

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

 

 

 

 

 

 

转载于:https://www.cnblogs.com/kexing/p/7413565.html

你可能感兴趣的文章
[kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)
查看>>
计蒜客 最长不下降子序列 (贪心+二分nlogn算法)
查看>>
[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069
查看>>
Relatives POJ - 2407(不打表的欧拉函数 单求)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher A - Number Sequence HDU - 1711 (kmp)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher F - The Minimum Length HUST - 1010 (kmp循环节)...
查看>>
C - Aladdin and the Flying Carpet LightOJ - 1341 (唯一分解,素数筛法,因子个数)
查看>>
七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I - Blue Jeans POJ - 3080 (找多个字符串的最长公共子序列,字典序最小)...
查看>>
F - Goldbach`s Conjecture LightOJ - 1259(素数筛)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J - Simpsons’ Hidden Talents HDU - 2594(kmp前后缀)...
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherC - 剪花布条 HDU - 2087 (kmp不覆盖匹配)...
查看>>
统计难题 HDU - 1251(字典树)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher :G - Power Strings POJ - 2406(kmp简单循环节)...
查看>>
Let the Balloon Rise HDU - 1004 (字典树和map两种写法)
查看>>
[kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK - Count the string HDU - 3336(前缀数量问题)...
查看>>
2019百度之星初赛一1001Polynomial(数学的函数收敛)
查看>>
Flying to the Mars HDU - 1800(字典树)
查看>>
Hat’s Words HDU - 1247 (字典树)
查看>>
2019百度之星初赛二 1001 度度熊与数字(因子问题)
查看>>