1. 程式人生 > >五子棋小遊戲

五子棋小遊戲

public class WuZhiQi {
	public static void main(String[] args) {

		// 棋盤編號
		char[] bianhao = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E' };
		
		int SIZE = 15; //常數
			
		// 建立棋盤
		char[][] qipan = new char[SIZE][SIZE];
		for (int i = 0; i < qipan.length; i++) {
			for (int j = 0; j < qipan[i].length; j++) {
				qipan[i][j] = '+';
			}
		}

		// 建立棋盤上的星
		qipan[3][3] = '#';
		qipan[3][7] = '#';
		qipan[3][11] = '#';
		qipan[7][3] = '#';
		qipan[7][7] = '#';
		qipan[7][11] = '#';
		qipan[11][3] = '#';
		qipan[11][7] = '#';
		qipan[11][11] = '#';

		/**
		 * 橫五子 qipan[5][5] = '@'; qipan[5][6] = '@'; qipan[5][7] = '@';
		 * qipan[5][8] = '@'; qipan[5][9] = '@';
		 * 
		 * 豎五子 qipan[6][6] = 'O'; qipan[7][6] = 'O'; qipan[8][6] = 'O';
		 * qipan[9][6] = 'O'; qipan[10][6] = 'O';
		 * 
		 * 斜五子 qipan[8][9] = '@'; qipan[9][10] = '@'; qipan[10][11] = '@';
		 * qipan[11][12] = '@'; qipan[12][13] = '@';
		 * 
		 * 反斜五子 qipan[5][2] = 'O'; qipan[4][3] = 'O'; qipan[3][4] = 'O';
		 * qipan[2][5] = 'O'; qipan[1][6] = 'O';
		 * 
		 */
		char curQiZi = '@'; 	//黑子先落
		boolean isOver = false; //遊戲結束標誌

		// 迴圈
		while (true) {
			System.out.print("  "); // 第一行編號前面的兩個空格
			for (int i = 0; i < qipan.length; i++) { // 給列編號
				System.out.print(bianhao[i] + " ");
			}
			
			System.out.println(); // 第一行換行

			// 顯示棋盤
			for (int i = 0; i < qipan.length; i++) {
				System.out.print(bianhao[i] + " "); // 給行編號
				for (int j = 0; j < qipan[i].length; j++) {
					System.out.print(qipan[i][j] + " ");
				}
				System.out.println();
			}
			
			//結束了
			if(isOver){
				System.out.println(curQiZi + "方勝利");
				return;
			}
			
			// 從螢幕輸入棋子
			Scanner scanner = new Scanner(System.in);
			
			System.out.print("請輸入Y座標:");
			int y = scanner.nextInt();
			// 判斷輸入是否正確
			if (y > 14 || y < 0) {
				System.out.println("您輸入錯誤,請輸入0~14,按回車鍵重新輸入!");
				new Scanner(System.in).nextLine();
				continue;
			}

			System.out.print("請輸入X座標:");
			int x = scanner.nextInt();
			// 判斷輸入是否正確
			if (x > 14 || x < 0) {
				System.out.println("你輸入錯誤,請輸入0~14,按回車鍵重新輸入!");
				new Scanner(System.in).nextLine();
				continue;
			}
			
			// 判斷該位置有無落子
			if (qipan[y][x] == '@' || qipan[y][x] == 'O') {
				System.out.println("該位置已落子,請按回車鍵重新下子!");
				new Scanner(System.in).nextLine();
				continue;
			}
	
			/**
			 * 1 交替下棋 2 勝負判斷
			 *
			 */
			qipan[y][x] = curQiZi;
			// 勝負判斷
			// 橫判斷
			int count = 1;
			for(int i = x - 1; i >= 0; i--){
				if(qipan[y][i] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			for(int i = x + 1; i < SIZE ; i++){
				if(qipan[y][i] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			if(count >= 5){
				isOver = true;
				continue;
			}
			
			//判斷豎向
			count = 1;
			for(int i = y - 1; i >= 0; i--){
				if(qipan[i][x] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			for(int i = y + 1; i < SIZE ; i++){
				if(qipan[i][x] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			if(count >= 5){
				isOver = true;
				continue;
			}
			
			//判斷斜向
			count = 1;
			for(int i = y - 1,j = x - 1; i >= 0 && j >= 0; i--, j--){
				if(qipan[i][j] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			for(int i = y + 1,j = x + 1; i <= SIZE && j <= SIZE; i++, j++){
				if(qipan[i][j] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			if(count >= 5){
				isOver = true;
				continue;
			}
			
			//判斷反斜向
			count = 1;
			for(int i = y + 1,j = x - 1; i <= SIZE && j >= 0; i++, j--){
				if(qipan[i][j] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			for(int i = y - 1,j = x + 1; i <= SIZE && j >= 0; i--, j++){
				if(qipan[i][j] == qipan[y][x]){
					count++;
				}else{
					break;
				}
			}
			if(count >= 5){
				isOver = true;
				continue;
			}
			
			// 交替黑白落子
			curQiZi = curQiZi == '@' ? 'O' : '@';
		}

	}
}