簡單五子棋問題,java實現

**題目要求:**實現一個控制檯下五子棋的程序。用一個二維數組模擬一個15*15路的五子棋棋盤,把每個元素賦值位“┼”可以畫出棋盤, “○”代表該交叉點下了一顆白棋子,“●”代表該交叉點下了一顆黑棋子。每次用戶輸入要下棋的座標,然後程序顯示出下完後的棋盤,默認黑子先行。

遇到問題:
不知道如何用代碼實現判斷哪一方先贏。
(內心os:在網上搜的結果給出的代碼完成的功能太多了,我這種渣渣的初學者根本看不懂。)
--------------------分割線------------------------------9.21號---------------------------
採用了最簡單的方法來完成,每輸入一個點的座標就進行遍歷,看是否有五子相連的;一開始想不明白的問題有:不知道怎末判斷是不是五子相連;把五子相連的判斷函數寫出來之後不知道main()函數怎末寫了,每輸入一個點座標就進行判斷,需要循環,循環條件是什莫呢?while(!judge(x,y))?當然不對,因爲這時候都沒有輸入座標怎末調用方法呢,一開始寫的時候把輸入黑子座標及白子座標分開來寫成兩個方法了,後來發現這樣不行,因爲main方法裏就沒有點的座標了,這樣judge方法也不能調用了,於是在main方法裏定義了x和Y,然後輸入點的座標,用了一個t值來控制循環。
代碼如下:

/**
 * 五子棋遊戲,二維數組
 * 五子相連判斷算法
 * 每輸入一個點,就遍歷判斷一次輸贏
 */
package shiyan5;
import java.util.Scanner;
public class shiyan5 {
	public static String [][]arr;//全局變量
	public static final String BLACK_CHESS="●";
	public static final String WHITE_CHESS="○";//棋子
	public static void main(String [] args) {
		int x;
		int y;
		int t=0;
		init();
		while(t==0) {
		System.out.println("輸入黑子座標");
		Scanner sc=new Scanner(System.in);
		System.out.print("請輸入x:");
		 x=sc.nextInt();
		System.out.print("請輸入y:");
		 y=sc.nextInt();
		black(x,y);
		if(!judge(x,y)) {
			t=0;
		}else {
			t=1;
		}
		
		System.out.println("輸入白子座標");
		System.out.print("請輸入x:");
		 x=sc.nextInt();
		System.out.print("請輸入y:");
		 y=sc.nextInt();
		white(x,y);
		if(!judge(x,y)) {
			t=0;
		}else {
			t=1;
		}
		}
		

		
	}
	
	/**
	 * 對棋盤進行初始化
	 */
	public static void init() {
	arr=new String[15][15];
	for(int i=0;i<arr.length;i++) {
		for(int j=0;j<arr[i].length;j++) {
			arr[i][j]="+";
		}
	}
	}
	public static void show() {
			for(int i=0;i<arr.length;i++) {
		for(int j=0;j<arr[i].length;j++) {
			System.out.print("  "+arr[i][j]);
		}
		System.out.println();
	}
	}
	/*
	 * 輸入黑子座標
	 */
	public static void black(int x,int y) {

		arr[x][y]=BLACK_CHESS;
		show();

	}
	/*
	 * 輸入白子的座標
	 */
	public static void white(int x,int y) {

		arr[x][y]=WHITE_CHESS;
		show();

	}
	/*
	 * 判斷輸贏
	 */
	public static boolean judge(int x,int y) {
		int i;
		int j;
		int count=0;//計數
		int winflag=1;
		
		//垂直方向
		//向上讀取
		for(i=x-1,j=y;i>=0&&count++<5;i--) {
				
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			
			}else {
				break;
			}
		}
		//向下讀取
		count=0;
		for(i=x+1,j=y;i<15&&count++<5;i++) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		if(winflag>=5) {
			System.out.println(arr[x][y]+"勝利");
			return true;
		}else {
			winflag=1;
		}
		//水平方向
		//向右讀取
		for(i=x,j=y+1;j<15&&count++<5;j++) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		//向左讀取
		for(i=x,j=y-1;j>=0&&count++<5;j--) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		if(winflag>=5) {
			System.out.println(arr[x][y]+"勝利");
			return true;
		}else {
			winflag=1;
		}
		//主對角線方向
		//右下
		for(i=x+1,j=y+1;i<15&&j<3&&count++<5;i++,j++) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		//左上
		for(i=x-1,j=y-1;i>=0&&j>=0&&count++<5;i--,j--) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		if(winflag>=5) {
			System.out.println(arr[x][y]+"勝利");
			return true;
		}else {
			winflag=1;
		}
		//斜對角線方向
		//右上
		for(i=x-1,j=y+1;i>=0&&j<15&&count++<5;i--,j--) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		for(i=x+1,j=y-1;i<15&&y>=0&&count++<5;i++,j--) {
			if(arr[x][y].equals(arr[i][j])) {
				winflag++;
			}else {
				break;
			}
		}
		count=0;
		if(winflag>=5) {
			System.out.println(arr[x][y]+"勝利");
			return true;
		}else {
			winflag=1;
			
		}
		return false;//所有方向讀取完,沒有
	}
	
}

---------------------分割線------------------------------------------
學習java的路剛剛開始,要繼續加油呀,
2019.9.21

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章