前幾期介紹完了各種方法,就是可以實現下棋的功能了,但是,還無法判斷輸贏,這一期就是講解判斷輸贏的方法
正文開始———
首先,我們得聲明兩個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<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中
將得到的橫坐標與縱坐標給x與y,之后再是聲明一個boolean類型的flag變量,將x與y作為參數傳入到橫向,縱向,斜向是否有五子方法中,之后由檢查橫向,縱向,斜向是否有五子方法的返回值經過邏輯與的邏輯計算得到數值
邏輯與計算,只要有一個為真,結果都是為真
flag有數值之后,再用一個if語句判斷並返回boolean數值
檢查橫向,縱向,斜向是否有五子方法代碼如下,具體的都有注釋了,這里需要注意的是,x和y坐標原點是在屏幕左上角,也就是說,x+是往右邊,y+是往下邊,這里應該不難,理解一個就是能舉一反三了
//水平方向檢查是否五子
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; }
回到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⊙)哦,差點忘了,還有我自定義的個性功能啊,嗯,那就多加一期,下一期見了!!