五子棋

来源:互联网 发布:unity3d 去掉启动画面 编辑:程序博客网 时间:2024/04/29 21:51
 

package day05.day5;

import java.util.Scanner;

public class WuZiQi {

  public static void main(String[] args) {
    int space = 0;
    int black = 1;
    int white = 2;
    String[] chessName = {"空","黑","白"};
    int[] board = new int[16*16];  //定义一个棋盘
    Scanner console = new Scanner(System.in);
    int idx = 0;
    while(true){
      print(board);  //调用打印棋盘的方法
      int color = idx++%2+1;//执黑先行(1,2,1,2,1,2)
      int i,j;
      do{
        System.out.print("请 "+chessName[color]+" 方下子(i j):");
        i = console.nextInt(16);
        j = console.nextInt(16);
      }while(board[i*16+j]!=space);
      board[i*16+j]=color;
      if(isWin(board, color, i, j)){
        print(board);
        System.out.println("恭喜"+ chessName[color]);
        break;
      }
    }
  }
  public static boolean isWin(int[] board, int color, int i, int j) {
    return n2sWin(board, color, i, j) ||
    w2eWin(board, color, i, j) ||
    wn2esWin(board, color, i, j) ||
    en2wsWin(board, color, i, j) ;
  }
  /** 东北到西南 */
  private static boolean en2wsWin(int[] board, int color, int i, int j) {
    while( board[i * 16 +j] == color ){
      j++;
      i--;
      if(j==16 || i==-1)
        break;
    }
    //i,j 是第一个空白子
    j--;i++;
    int c = 0;//计数变量
    while(board[i * 16 +j] == color){
      c++;
      j--;
      i++;
      if(j==-1 || i==16)
        break;
    }
    return c>=5;
  }
  /** 西到东 */
  private static boolean w2eWin(int[] board, int color, int i, int j) {
    while( board[i * 16 +j] == color ){
      j--;
      if(j==-1)
        break;
    }
    //i,j 是第一个空白子
    j++;
    int c = 0;//计数变量
    while(board[i * 16 +j] == color){
      c++;
      j++;
      if(j==16)
        break;
    }
    return c>=5;
  }
  /** 西北到东南 */
  private static boolean wn2esWin(int[] board, int color, int i, int j) {
    while( board[i * 16 +j] == color ){
      j--;
      i--;
      if(j==-1 || i==-1)
        break;
    }
    //i,j 是第一个空白子
    j++;i++;
    int c = 0;//计数变量
    while(board[i * 16 +j] == color){
      c++;
      j++;
      i++;
      if(j==16 || i==16)
        break;
    }
    return c>=5;
  }
  /** 北到南方向 */
  private static boolean n2sWin(int[] board, int color, int i, int j) {
    while( board[i * 16 +j] == color ){
      i--;
      if(i==-1)
        break;
    }
    //i,j 是第一个空白子
    i++;
    int c = 0;//计数变量
    while(board[i * 16 +j] == color){
      c++;
      i++;
      if(i==16)
        break;
    }
    return c>=5;
  }
  public static void print(int[] board){
    char[] ico = {'.','*','O'};
    char[] hex = "0123456789abcdef".toCharArray();
//    for(int i=0; i<board.length; i++){
//      System.out.print(ico[board[i]]);
//      if((i+1)%16==0){
//        System.out.println();
//      }
//    }
    System.out.print(" ");
    for(int i=0; i<16; i++){
      System.out.print(" "+hex[i]);
    }
    System.out.println();
    for(int i=0; i<16; i++){
      System.out.print(hex[i]+" ");
      for (int j = 0; j < 16; j++) {
        System.out.print(ico[board[i*16+j]]+" ");
      }
      System.out.println();
    }
  }
}