之前用数组实现的五子棋-查看文章

之前用数组实现的五子棋

发表于:2017-06-20 07:11:04 分类:JAVA 阅读:650次

image

玩法:白先黑后,输入横纵坐标点回车就会在对应位置落子。

两个坐标之间用英文,分割。

import java.util.*;public class WuZiQi
{
	private static final String BAIZI="○";
	private static final String HAIZI="●";
	private static final String KONG="┼";
	private boolean bai=true;
	private boolean isOver=false;
	private String winner="";
 	private Scanner scanner=new Scanner(System.in);
	private String[][] qiPan=new String[11][11];
	
	public static void main(String[] args){
		WuZiQi game=new WuZiQi();
		game.run();
	}
	public void run(){
		innt();
		printView();
		while(!isOver){
			if(bai){
				System.out.println("白棋出棋:");
			}else{
				System.out.println("黑棋出棋:");
			}
			String qi=scanner.next();
			if(chuQi(qi,bai)){
				bai=!bai;
				printView();
				
			}else{
				System.out.println("出棋不合规,请重新出棋!");
			}
		}
		if(isOver){
			System.out.println(winner+"胜!");
		}
	}
	private void innt(){
		for(int i=0;i<11;i++){
			for(int j=0;j<11;j++){
				//System.out.print("┼");
				if(i==0){
					qiPan[i][j]=j+" ";
				}else if(j==0){
					qiPan[i][j]=(i==10)?(i+""):(i+" ");
				}else{
					qiPan[i][j]=KONG;
				}
			}
		}
	}
	private void printView(){
		System.out.println("  一二三四五六七八九十");
		for(int i=1;i<11;i++){
			for(int j=0;j<11;j++){
				System.out.print(qiPan[i][j]);
			}
			System.out.println();
		}
	}
	private boolean chuQi(String qi,boolean isBai){
		String[] qis=qi.split(",");
		if(qis.length!=2){
			return false;
		}
		try{
			int qi1=Integer.parseInt(qis[0]);
			int qi2=Integer.parseInt(qis[1]);
			if(qi1>10||qi2>10){
				return false;
			}else if(qi1<1||qi2<1){
				return false;
			}else{
				if(!qiPan[qi1][qi2].equals(KONG)){
					return false;
				}else{
					qiPan[qi1][qi2]=bai?BAIZI:HAIZI;
					//scanWinner(qi1,qi2);
					scanGame(qi1,qi2);
					return true;
				}
			}
		}catch (Exception e){
			return false;
		}
	}
	//该方法不再使用。
	private void scanWinner(int x,int y){
		int i=1;
		if(i==1){
			int index=y-1;
			int count=1;
			while(qiPan[x][y].equals(qiPan[x][index])){
                count++;
				if(count==5){
					isOver=true;
					winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
					return;
				}
				if(index>1){
					index--;
				}else{
					break;
				}
			}
			index=y+1;
			while(qiPan[x][y].equals(qiPan[x][index])){
                count++;
				if(count==5){
					isOver=true;
					winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
					return;
				}
				if(index<10){
					index++;
				}else{
					break;
				}
			}
		    i++;
			
		}
		if(i==2){
			int index=x-1;
			int count=1;
			while(qiPan[x][y].equals(qiPan[index][y])){
				count++;
				if(count==5){
					isOver=true;
					winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
					return;
				}
				if(index>1){
					index--;
				}
				else{
					break;
				}
			
			}
			index=x+1;
			while(qiPan[x][y].equals(qiPan[index][y])){
				count++;
				if(count==5){
					isOver=true;
					winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
					return;
				}
				if(index<10){
					index++;
				}
				else
				{
					break;
				}
			}
			i++;
		}
		
	}
	private void scanGame(int x,int y){
		for(int i=0;i<4;i++){
			if(scanWinner(x,y,i)){
				return;
			}
		}
	}
	private boolean scanWinner(int x,int y,int way){
		int indexX=0;
		int indexY=0;
		if(way==0){
			//——向匹配
			indexX=x;
			indexY=y-1;
		}else if(way==1){
			// \向匹配
			indexX=x-1;
			indexY=y-1;
		}else if(way==2){
			// |向匹配
			indexX=x-1;
			indexY=y;
		}else if(way==3){
			// /向匹配
			indexX=x+1;
			indexY=y-1;
		}
		int count=1;
		while(qiPan[x][y].equals(qiPan[indexX][indexY])){
			count++;
			if(count==5){
				isOver=true;
				winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
				return true;
			}
			if(way==0){
				//——向匹配
                if(indexY>1){
					indexY--;
				}else{
					break;
				}
			}else if(way==1){
				// \向匹配
				if(indexX>1&&indexY>1){
					indexX--;
					indexY--;
				}else{
					break;
				}
			}else if(way==2){
				// |向匹配
				if(indexX>1){
					indexX--;
				}else{
					break;
				}
			}else if(way==3){
				// /向匹配
				if(indexX<10&&indexY>1){
					indexX++;
					indexY--;
				}else{
					break;
				}
			}
		}
		if(way==0){
			//——向匹配
			indexX=x;
			indexY=y+1;
		}else if(way==1){
			// \向匹配
			indexX=x+1;
			indexY=y+1;
		}else if(way==2){
			// |向匹配
			indexX=x+1;
			indexY=y;
		}else if(way==3){
			// /向匹配
			indexX=x-1;
			indexY=y+1;
		}
		while(qiPan[x][y].equals(qiPan[indexX][indexY])){
			count++;
			if(count==5){
				isOver=true;
				winner=qiPan[x][y].equals(BAIZI)?"白棋":"黑棋";
				return true;
			}
			if(way==0){
				//——向匹配
                if(indexY<10){
					indexY++;
				}else{
					break;
				}
			}else if(way==1){
				// \向匹配
				if(indexX<10&&indexY<10){
					indexX++;
					indexY++;
				}else{
					break;
				}
			}else if(way==2){
				// |向匹配
				if(indexX<10){
					indexX++;
				}else{
					break;
				}
			}else if(way==3){
				// /向匹配
				if(indexX>1&&indexY<10){
					indexX--;
					indexY++;
				}else{
					break;
				}
			}
		}	
		return false;
	}
}


关键词:java,五子棋


验证码:

  1. author
    吴青烈(伪装者) 2017-06-27 16:13:23
    alert
  2. author
    黄蓉(伪装者) 2017-06-20 10:10:50
    这个五子棋很简单的,只有几个逻辑。我中间写了一段废弃的代码 删掉会简洁许多。