井字棋(java修改版,降低耦合性,降低降低冗余代码)

9 篇文章 0 订阅
5 篇文章 0 订阅

Tap.java 类

package jingziqi;
import java.util.Scanner;	
public class Tap {
//	private static int wushaoqi;
	private static int i;
	private static int j;
	private static int lock_1=0;
	private static int lock_2=0;
	private static int count=0;
	public static int size = 3;
	public static int  pass = 0;
	private static int zi_1 = 4;
	shuzu tip=new shuzu(3);
	public  Tap(){
		tip.creatNumber();
	}
	
	//调用成员变量,输出欢迎语句
	private void printWelcom() {
		// TODO Auto-generated method stub
		System.out.println("欢迎来到井字棋游戏!");
		
	}
	
	private static int change(String number) {
		int a = 3;
		if(number.length() == 2) {
		a = Integer.valueOf(number);
//		System.out.println("a的值是"+a);
	//	System.out.println("a的值是:"+a);
		}else {
			System.out.println("输入坐标长度不合法!!!/n");
		}
		return a;
	}
	private static void write(int wushaoqi_1) {
//			System.out.println("修改i,j的数字,wushaoqi是"+wushaoqi_1);	
		 if(wushaoqi_1<10) {
			 i=0;
			 j=wushaoqi_1;
			 
//			 System.out.println("数字小于10的时候的i="+i+",j="+j);
		 }else {
			i = wushaoqi_1/10;
			j = wushaoqi_1%10;
//			System.out.println("数字大于10的时候的i="+i+",j="+j);
		 }
//		 System.out.println("和吴韶棋对应,write里面修改完的数值是i="+i+",j="+j);
	}
	//可视化,调用成员变量的方法
	private void draw() {
		tip.map_1();
	}
	
	//合法性检测
	private  int legal() {
		int i_9 = 0;
		Tap.jiancha();
//		System.out.println("目标节点的zi_1传值是多少"+zi_1);
		Tap.write(zi_1);
		//接下来通过合法的坐标值遍历数组,来判断是否有输入重复,创建接口
//		System.out.println("传入write(zi_1)修改过后的i="+i+"j="+j);
		b_1:
		while(true) {
			//判断之前,数组不能输入坐标
			if(tip.board[i*size+j]==1 | tip.board[i*size+j]==2  ) {
				
				System.out.println("抱歉,玩家一,你所输入的坐标已有棋子了!!!/n"+"请重新输入:");
				
				i_9 = 0;
				break b_1;
			}else {
				i_9=2;
				break b_1;
			}				
		}
		return i_9;
	}
	
	private static void jiancha() {
		@SuppressWarnings("resource")
		Scanner in = new Scanner(System.in);
		b_2:									    
				while(true) { 
					 String la;
					
					 la = in.next();
					 //返回字符串长度
					  zi_1 =Tap.change(la) ;
//					  System.out.println("zi_1="+zi_1);
					//  System.out.println("i="+i+",j="+j);
					 if(zi_1==3) {
						System.out.println("输入坐标长度不合法!!!/n请重新输入:\n");
					 }else {
							if(  ((zi_1/10)==0 |(zi_1/10) == 1 | (zi_1/10) == 2 ) & ((zi_1%10)==0 |(zi_1%10) == 1 | (zi_1%10) == 2 ) ){
								break b_2;
							}else{
								System.out.println("输入的坐标数值越界!!!!\n请重新输入:\n");
							}	
					 } 
				}
		
		
	}
	private void assignment(int i,int j,int a) {
		if(a==1) {
			tip.changeNumber_1(i,j);
		}else if(a == 2) {
			tip.changeNumber_2(i,j);
		}
	}
	
	private int win(int k) {
		//如果传入的是1,则代表是玩家1调用遍历指令
		int p=0;
		if(k==1) {
			p = tip.win_1();
		}else if(k==2){
			p = tip.win_2();
		}else {
			System.out.println("玩家错乱!");
		}
		
		return p;
	}

	@SuppressWarnings("unused")
	public static void main(String [] args) {
		//等待用户输入		
		Scanner in = new Scanner(System.in);
		//定义方阵长度
		//int size = in.nextInt();
		//默认长度是3
		//定义数组对象,进行相应操作
//		shuzu tip = new shuzu(3);
		//初始化数组
//		tip.creatNumber();
		
		//定义游戏对象,开始游戏
		Tap tap=new Tap();
		//输入开头语句
		tap.printWelcom();
//		tip.map_1();
		tap.draw();
a:	do {
//		System.out.println("请玩家一输入坐标:(例如\"11\")\n");
//		//玩家一输入并检查输入是否越界
		int pass=0;
	N:	while(true) {
		//调用判断合法性的函数
		 System.out.println("请玩家一输入坐标:(例如\"11\")\n");
		 pass = tap.legal();
//		 根据返回值来判断字符是否合法,合法则跳出循环
		 if(pass==2) {
			 break N;
		 }
	   }
//			tap.jiancha();
//			Tap.write( zi_1);
//			//接下来通过合法的坐标值遍历数组,来判断是否有输入重复,创建接口
//			b:
//			while(true) {
//				if(tip.board[i*size+j]==1 | tip.board[i*size+j]==2  ) {
//					System.out.println("抱歉,玩家一,你所输入的坐标已有棋子了!!!/n"+"请重新输入:");
//					break b;
//				}else {
//					break N;
//				}				
//			}
		
			//经历以上的输入合法判断之后,进行对数组赋值			
			//System.out.println(tip.board[i*size+j]);
		   //对对象进行幅值
	        count++;
			tap.assignment(i,j,1);
//			tip.changeNumber_1(i,j);
			//可视化数组(已经在数组赋值时候完成)
			
//			tip.map_1();
						
//			System.out.println("玩家一"+"第"+count+"次");
			//检查是否赢比赛,是否可以结束
			//判断输赢
			lock_1 = tap.win(1);
//			System.out.println("lock_1的值是:"+lock_1);
			if(lock_1 == 1 ) {
				System.out.println("恭喜玩家一,你赢啦!");
				break a;
			}else if(count==9) {
				System.out.println("恭喜你们打成平局!");
				break a;
			}
			
//玩家二:
		int pass_2 = 0;
		M:while(true){		
				System.out.println("请玩家二输入坐标:(例如\"11\")\n");
				pass_2 = tap.legal();
				if(pass_2 == 2) {
					break M;
				}
		}		
		 count++;
		 tap.assignment(i,j,2);	
		 		
			//检查是否赢比赛,是否可以结束
//		   玩家二传入参数,以调用成员对象的方法,来判断key值输赢
			lock_2 = tap.win(2);
			
//			System.out.println("lock_2的值是:"+lock_2);
			if(lock_2 == 2) {
				System.out.println("恭喜玩家二,你赢啦!");				
			}
			
		}while(count<9);

		System.out.println("游戏结束,未来可期!");
	}
	
}

shuzu工具类

package jingziqi;
public class shuzu {
	public int con_o = 0;
	public int con_x = 0;
	public int count = 0;
	public int size = 3;
	public int length =9 ;
	private int key_1=0;
	private int key_2=0;
	;
//	private static int hang=0;
//	private static int lie=0;
	public  int[]  board=new int[length];

	
	public shuzu(int size){
		//定义结构函数,调用成员函数构造数组
		creatNumber();
//		map_1();
		//根据传入的参数,修改数组长度
		 
	}

				
	//初始化数组
	public void creatNumber() {
		for(int n=0;n<length;n++) {
			
			board[n]=0;
		}
	}
	public void  changeNumber_1(int i,int j) {	

		this.board[i*size+j] = 1;
		//读入数组的时候就调用初始化方法
		this.map_1();
		
	}
	public void  changeNumber_2(int i,int j) {		
		this.board[i*size+j] = 2;
		//读入数组的时候就调用初始化方法
		this.map_1();
	}
	
	public int win_1() {
		//检查四周,检查每行,每列,每个斜对角线
		//先检查每行
		con_o=0;
		for(int m=0;m<size;m++) {
			con_o=0;
			for(int n=0;n<size;n++) {
				//这里的this代表的是调用次成员函数的对象数组
				if(this.board[m*size+n]==1) {
					con_o++;
					
				}
				
				//	System.out.println("1检查每行的次数"+con_o);
			}
			if(con_o==size) {
				key_1 = 1;
			}
		}

		//检查每列
		con_o=0;
		for(int m=0;m<size;m++) {
			con_o=0;
			for(int n=0;n<size;n++) {
				//这里的this代表的是调用次成员函数的对象数组
				if(this.board[n*size+m]==1) {
					con_o++;
					
				//	System.out.println("1检查每列的次数"+con_o);
				}
			}
			if(con_o==size) {
				key_1 = 1;
			}
		}

		//检查正对角线
		con_o=0;
		for(int m=0;m<size;m++) {
			
			if(this.board[m*size+m]==1) {
				con_o++;

			}
		}
		if(con_o==size) {
			key_1 = 1;
		}
		
		//检查副对角线
		con_o=0;
		for(int m=1;m<=size;m++) {
			if(this.board[size*m-m]==1) {
				con_o++;

			}
		}
		if(con_o==size) {
			key_1 = 1;
		}
		
		return key_1;
	}
	//玩家二的遍历
	public int win_2() {
		//检查四周,检查每行,每列,每个斜对角线
		//先检查每行
		con_x=0;
		for(int m=0;m<size;m++) {
			con_x=0;
			for(int n=0;n<size;n++) {
				//这里的this代表的是调用次成员函数的对象数组
				if(this.board[m*size+n]==2) {
					con_x++;					
				}
			}
			if(con_x==size) {
				key_2 = 2;			
			}
		}

		
		//检查每列
		con_x=0;
		for(int m=0;m<size;m++) {
			con_x=0;
			for(int n=0;n<size;n++) {
				//这里的this代表的是调用次成员函数的对象数组
				if(this.board[n*size+m]==2) {
					con_x++;
					
				}
			}
			if(con_x==size) {
				key_2 = 2;
				
			}
		}

		//检查正对角线
		con_x=0;
		for(int m=0;m<size;m++) {
			
			if(this.board[m*size+m]==2) {
				con_x++;				
			}
		}
		if(con_x==size) {
			key_2 = 2;
			
		}
		//检查副对角线
		con_x=0;
		for(int m=1;m<=size;m++) {
			if(this.board[(size-1)*m]==2) {
				con_x++;
				
			}
		}
		if(con_x==size) {
			key_2 = 2;
			
		}
		return key_2;
		
	}
	//可视化
//	public void  map() {
//	//根据	0 1 2  可视化
//		//先搞题头
//		System.out.print("\t 0 \t 1 \t 2 \t\n\n");
//		for(int i=0;i<size;i++){
//			System.out.print(i+"\t ___\t___\t___\t\n\n");
//		}		
//	}
	//玩家的可视化
	public void map_1() {
		System.out.print("\t 0 \t 1 \t 2 \t\n\n");
		System.out.print("0\t");
			//定义换行的图形
			int ope=0;
			for(int i = 0;i<length;i++) {
				if(board[i]==0) {
					System.out.print("___");
					ope++;
					if(ope%size==0){
						if(ope/size==size){
							System.out.print("\n\n\n");
						}else if(ope/size<size){
							
							System.out.print("\n\n\n"+(ope/size)+"\t");
						}
					}else{
						System.out.print("\t");
					}

				}else if(board[i]==1){
					
					System.out.print("_O_");
					ope++;
					if(ope%size==0){
						if(ope/size==size){
							System.out.print("\n\n\n");
						}else if(ope/size<size){
							
							System.out.print("\n\n\n"+(ope/size)+"\t");
						}
					}else {
						System.out.print("\t");	
					}
				}else if(board[i]==2) {
					System.out.print("_X_");
					ope++;
					if(ope%size==0){
						if(ope/size==size){
							System.out.print("\n\n\n");
						}else if(ope/size<size){
							
							System.out.print("\n\n\n"+(ope/size)+"\t");
						}
					}else{
						System.out.print("\t");
					}	

				}
				
			}
		}

	}

	
	
	
	
	

 

后续会陆续更新,代码思路,融汇贯通.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值