JAVA五子棋双版本

目录

JAVA五子棋

纯面向对象版本

        五子棋类:

        测试类:

JAVA五子棋纯方法版本


JAVA五子棋

纯面向对象版本

五子棋类:

public class GoBang {
		//长度
		private	int len = 20;
		//棋盘容器
		private	String[][] goBang = new String[len][len];
		//坐标的容器
		private	String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"};
		//棋盘符号
		private	String add = "╋";
		private	String black = "■";
		private	String white = "○";
		/**
		 * 无参构造并初始化期盼数据以及打印棋盘
		 */
		public GoBang(){
			init();
			print();
		}
		
		//初始化棋盘数据
		private void init(){
			for (int i = 0; i < goBang.length; i++) {//i - 表示行数
				for (int j = 0; j < goBang[i].length; j++) {//j - 表示列数
					if(j == len-1){//每一行的最后一列,设置行数的坐标
						goBang[i][j] = nums[i];
					}else if(i == len-1){//最后一行,设置列数的坐标
						goBang[i][j] = nums[j];
					}else{
						goBang[i][j] = add;
					}
				}
			}
		}
		//打印棋盘
		public void print(){
			for (String[] ss : goBang) {
				for (String e : ss) {
					System.out.print(e);
				}
				System.out.println();
			}
		}	
		/**
		 * 
		 * @param x 行
		 * @param y 列
		 * @param flag ture为白棋 false黑棋
		 * @return 状态码
		 * 			-1超出棋盘范围
		 * 			-2棋盘已落棋子
		 * 			 1落子成功
		 */
		public int play(int x,int y ,boolean flag){
			if(x<0 || x>len-2 || y<0 || y>len-2){
				return -1;
			}
			if(!goBang[x][y].equals(add)){
				return -2;
			}
			goBang[x][y] = (flag)?black:white;
			return 1;
		}
		
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num表示右边及落下位置的棋子和
		 */
		private  int right(int x,int y,boolean flag){
			int num =1;
			for(int i=y;i<=18;i++){
				boolean bool =goBang[x][i+1].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
				}
				}
			return num;
		}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的左边及落下位置的棋子和
		 */
		private  int left(int x,int y,boolean flag){
			int num =1;
			for(int i=y;i>=1;i--){
				boolean bool =goBang[x][i-1].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
				}
				}
			return num;
		}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的下边及落下位置的棋子和
		 */
		private  int down(int x,int y,boolean flag){
			int num =1;
			for(int i=x;i<=18;i++){
				boolean bool =goBang[i+1][y].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
				}
				}
			return num;
		}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的上边及落下位置的棋子和
		 */
		private int up(int x,int y,boolean flag){
			int num =1;
			for(int i=x;i>=1;i--){
				boolean bool =goBang[i-1][y].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
				}
				}
			return num;
		}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的右下边及落下位置的棋子和
		 */
		private int rightAndDown(int x,int y,boolean flag){
			int num =1;
			int j=x;
			int i=y;
				for(;i<=18 && j<=18;){
					boolean bool =goBang[j+1][i+1].equals((flag)?black:white);
					if(bool==true){
						num++;	
					}else{
						break ;
					}
					j++;
					i++;
					}
				return num;
			}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的左上边及落下位置的棋子和
		 */
		private  int leftAndUp(int x,int y,boolean flag){
			int num =1;
			int j=x;
			int i=y;
				for(;i>=1 && j>=1;){
					boolean bool =goBang[j-1][i-1].equals((flag)?black:white);
					if(bool==true){
						num++;	
					}else{
						break ;
						}
					j--;
					i--;
					}
				return num;
			}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的左下边及落下位置的棋子和
		 */
		private  int leftAndDown(int x,int y,boolean flag){
			int num =1;
			int j=x;
			int i=y;
				for(;i>=1 && j<=18;){
					boolean bool =goBang[j+1][i-1].equals((flag)?black:white);
					if(bool==true){
						num++;	
					}else{
						break ;
						}
					j++;
					i--;
					}
				return num;
			}
		/**
		 * @param x 行
		 * @param y 列
		 * @param flag	ture为白棋 false黑棋
		 * @return	num 表示 落子的右上边及落下位置的棋子和
		 */
		private  int rightAndup(int x,int y,boolean flag){
			int num =1;
			int j=x;
			int i=y;
				for(;j>=1 && i<=18;){
					boolean bool =goBang[j-1][i+1].equals((flag)?black:white);
					if(bool==true){
						num++;	
					}else{
						break ;
						}
					j--;
					i++;
					}
				return num;
			}
		/**
		 * 
		 * @param x
		 * @param y
		 * @param flag	ture为白棋 false黑棋
		 * @return	赢了返回ture 输了返回false
		 */
		public  boolean isWin(int x,int y ,boolean flag){
			
			int right =right(x, y, flag); //落子的右边及落下位置的棋子和
			int left =left(x, y, flag);	//落子的左边及落下位置的棋子和
			
			int down =down(x, y,  flag); //落子的下边及落下位置的棋子和
			int up =up(x,y,flag);	//落子的上边及落下位置的棋子和
			
			int  rightAndup=rightAndup(x,y,flag);	//落子的右上边及落下位置的棋子和
			int  leftAndDown =leftAndDown(x,y,flag);	//落子的左下边及落下位置的棋子和
			
			int  rightAndDown=rightAndDown(x,y,flag);	//落子的右下边及落下位置的棋子和
			int  leftAndUp =leftAndUp(x,y,flag);	//落子的左上边及落下位置的棋子和
			
			/*
			 * (一条直线上棋子的数量-1 ) 是否大于等于五     
			 */
			if(((right+left-1)>=5) || ((down+up-1)>=5) || ((rightAndup+leftAndDown-1)>=5) || ((rightAndDown+leftAndUp-1)>=5)){
				System.out.println("恭喜"+((flag)?black:white)+"获得胜利");
				return true;
			}
			return false;
			
			
			}
}

测试类:

import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {
		
		//创建对象,并初始化数据及打印棋盘
		GoBang goBang = new GoBang();
		
		//循环的落子
		
		@SuppressWarnings("all")//正压警告的注解 -- 让这段代码不要报警告
		Scanner scan = new Scanner(System.in);
		
		boolean flag = true;//true-黑子 false-白子
		while(true){
			
			//输入坐标
			System.out.println("请" + ((flag)?"黑":"白") +"子输入坐标:");
			int x = scan.nextInt()-1;
			int y = scan.nextInt()-1;
			
			//落子
			int  play= goBang.play(x, y, flag);
			if(play==-1){
				System.out.println("坐标超出棋盘范围,请重新输入...");
				continue;
			}else if(play==-2){
				System.out.println("坐标上已有棋子,请重新输入...");
				continue;
			}
			
			//打印棋盘
			goBang.print();
			
			//判断输赢
			boolean win =goBang.isWin(x, y, flag);
			
			if(win){
				break;
			}
			//置反
			flag = !flag;
			
			}
	}
}

JAVA五子棋纯方法版本

import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {
		/**
		 * 知识点:五子棋
		 * 
		 * 提升作业:如何判断五子棋输赢
		 */
		
		//长度
		int len = 20;
		//棋盘容器
		String[][] goBang = new String[len][len];
		//坐标的容器
		String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"};
		//棋盘符号
		String add = "╋";
		String black = "■";
		String white = "○";
		
		//初始化棋盘数据
		for (int i = 0; i < goBang.length; i++) {//i - 表示行数
			for (int j = 0; j < goBang[i].length; j++) {//j - 表示列数
				if(j == len-1){//每一行的最后一列,设置行数的坐标
					goBang[i][j] = nums[i];
				}else if(i == len-1){//最后一行,设置列数的坐标
					goBang[i][j] = nums[j];
				}else{
					goBang[i][j] = add;
				}
			}
		}
		
		//打印棋盘
		for (String[] ss : goBang) {
			for (String e : ss) {
				System.out.print(e);
			}
			System.out.println();
		}
		
		//循环的落子
		
		@SuppressWarnings("all")//正压警告的注解 -- 让这段代码不要报警告
		Scanner scan = new Scanner(System.in);
		
		boolean flag = true;//true-黑子 false-白子
		while(true){
			
			//输入坐标
			System.out.println("请" + ((flag)?"黑":"白") +"子输入坐标:");
			int x = scan.nextInt()-1;
			int y = scan.nextInt()-1;
			
			//判断坐标是否超出棋盘范围
			if(x<0 || x>len-2 || y<0 || y>len-2){
				System.out.println("坐标超出棋盘范围,请重新输入...");
				continue;
			}
			
			//判断坐标上是否有棋子
			if(!goBang[x][y].equals(add)){
				System.out.println("坐标上已有棋子,请重新输入...");
				continue;
			}
			
			//落子
			goBang[x][y] = (flag)?black:white;
			
			
			
			//打印棋盘
			for (String[] ss : goBang) {
				for (String e : ss) {
					System.out.print(e);
				}
				System.out.println();
			}
				
		if(isWin(x, y, goBang, black, white, flag)){
			break;
		}

			//置反
			flag = !flag;
		}
	}
	//右边的
	public static int right(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		for(int i=y;i<=18;i++){
			boolean bool =goBang[x][i+1].equals((flag)?black:white);
			if(bool==true){
				num++;	
			}else{
				break ;
			}
			}
		return num;
	}
	//左边的
	public static int left(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		for(int i=y;i>=1;i--){
			boolean bool =goBang[x][i-1].equals((flag)?black:white);
			if(bool==true){
				num++;	
			}else{
				break ;
			}
			}
		return num;
	}
	//下面
	public static int down(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		for(int i=x;i<=18;i++){
			boolean bool =goBang[i+1][y].equals((flag)?black:white);
			if(bool==true){
				num++;	
			}else{
				break ;
			}
			}
		return num;
	}
	//上面
	public static int up(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		for(int i=x;i>=1;i--){
			boolean bool =goBang[i-1][y].equals((flag)?black:white);
			if(bool==true){
				num++;	
			}else{
				break ;
			}
			}
		return num;
	}
	//右下
	public static int rightAndDown(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		int j=x;
		int i=y;
			for(;i<=18 && j<=18;){
				boolean bool =goBang[j+1][i+1].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
				}
				j++;
				i++;
				}
			return num;
		}
	//左上
	public static int leftAndUp(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		int j=x;
		int i=y;
			for(;i>=1 && j>=1;){
				boolean bool =goBang[j-1][i-1].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
					}
				j--;
				i--;
				}
			return num;
		}
	//左下
	
	public static int leftAndDown(int x,int y,String[][] goBang,String black,String white,boolean flag){
		int num =1;
		int j=x;
		int i=y;
			for(;i>=1 && j<=18;){
				boolean bool =goBang[j+1][i-1].equals((flag)?black:white);
				if(bool==true){
					num++;	
				}else{
					break ;
					}
				j++;
				i--;
				}
			return num;
		}
		//右上
	public static int rightAndup(int x,int y,String[][] goBang,String black,String white,boolean flag){
			int num =1;
			int j=x;
			int i=y;
				for(;j>=1 && i<=18;){
					boolean bool =goBang[j-1][i+1].equals((flag)?black:white);
					if(bool==true){
						num++;	
					}else{
						break ;
						}
					j--;
					i++;
					}
				return num;
			}
	public static boolean isWin(int x,int y,String[][] goBang,String black,String white,boolean flag){
		
		int right =	right(x,y,goBang,black,white,flag);
		int left = left(x, y, goBang, black, white, flag);
		int down =down(x, y, goBang, black, white, flag);
		int up =up(x,y,goBang,black,white,flag);
		int rightAndDown =rightAndDown(x,y,goBang,black,white,flag);
		int leftAndUp =leftAndUp(x,y,goBang,black,white,flag);
		int rightAndUp =rightAndup(x,y,goBang,black,white,flag);
		int leftAndDown =leftAndDown(x,y,goBang,black,white,flag);
		
		if((right+left-1)>=5 ||(down+up-1)>=5  || (rightAndDown+leftAndUp-1)>=5 || (rightAndUp+leftAndDown-1)>=5){
			System.out.println("恭喜"+((flag)?black:white)+"获得胜利");
			return true;
		}
		return false;
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值