• java练习:质数,匿名内部类创建接口,抽象类派生子类,画圆,字节截取字符串,数字变钱币,五子棋,梭哈


    java学习-质数的孤独

    正在看质数的孤独,,,于是写了一个练习代码,输出1-100之间的质数

    代码比较烂。待完善吧。

    这里用到了continue和break,continue指结束当前轮次循环,跳入下一个循环,break指结束当前循环,进入下一步。

    在网上找了别人的代码做参考,优化如下:

    上面的代码不正确,只能到3 5 7,需要改成下面的代码:

    原因是,flag定义在循环体外面,所以一旦从true改成false之后,状态是不能回去的,就一直false了,后面那句话永远不能输出。

    定义一个接口,使用匿名内部类方式创建接口的实例

    public interface Oil{
    String color="yellow";
    public String use();
    public String msg(String tool);
    }
    public class Pen {
    public void test(Oil o,String tool){
    System.out.println(o.use());
    System.out.println(o.msg(tool));
    }
    public static void main(String[]args){
    Pen p=new Pen();
    
    String tool="The tool is Pen";
    p.test(
    new Oil(){
    public String use(){
    return "It is for write";
    }
    public String msg(String tool){
    
    return tool+",the color is "+color;
    }
    },tool);
    }
    
    }
    

      

    java - 练习,定义一个抽象类,通过抽象的类来派生子类

    public abstract class Car{
    {
    System.out.println("init car");
    }
    private String color;
    //public abstract String Certificate();
    public abstract String getType();
    public Car(){}
    public Car(String color){
    System.out.println("exe car");
    this.color=color;//without this ,the color couldn't send to the car Object
    }
    
    public void setColor(String color)
    {
    this.color = color;
    }
    public String getColor()
    {
    return this.color;
    }
    }
    public class Tractor extends Car{
    private int paWeight;//weight of passenger
    private int toolWeight;//weight of tool
    public void setWeight(int paWeight,int toolWeight){
    if(paWeight<=0||toolWeight<=0){
    System.out.println("the weight of passenger and tools can't be less than 0");
    }
    this.paWeight=paWeight;
    this.toolWeight=toolWeight;
    }
    public Tractor(String color,int paWeight,int toolWeight){
    super(color);
    this.setWeight(paWeight,toolWeight);
    }
    
    public String getType(){
    return "the paWeight is :"+paWeight+",the toolWeight is :"+toolWeight+"; the color is "+getColor();
    };
    public static void main(String[]args){
    Car c1=new Tractor("yellow",2,300);
    System.out.println(c1.getType());
    }
    }
    

     

    java -练习 给定半径 圆大小随之变化

    参考:https://www.cnblogs.com/TaoLeonis/p/6507052.html

    画圆代码

    	public static void paint(int r){
    		for(int i = r;i>=r*(-1);i--){
    			int a=r-(int)Math.sqrt((r*r)-(i*i)); //*左侧的间隔数
    			int b=r-a;//两个*之间的间隔数
    			String str=space(a)+"*"+space(b*2)+"*";
    			System.out.println(str);
    		}
    	}
    	public static String space(int x){
    		String str = "";
    		for(int i=0;i<x;i++){
    			str = str+"--";
    		}
    		return str;
    	}
    	
    	public static void main(String []args){
    		//int r = getInput();
    		//paint(r);
    		paint(6);
    	}  

    原理:

     

    输入数字代码

    public static int getInput(){
    		int a =-1;
    		while(true){
    		Scanner scan = new Scanner(System.in);
    		if(scan.hasNextInt()){
    			 a=scan.nextInt();
    			if (a>0){
    			System.out.println("输入的数据为:" + a);
    			break;}
    			else{
    				System.out.println("请重新输入");
    			}
    		}else{
    			System.out.println("请重新输入");
    		}
    		}
    		return a ;
    	}
    

      

     

    按字节来截取字符串子串

    public class SubStringTest { public static void main(String[]args){ String str="中国国国abcb"; System.out.println(str.substring(1, 8)); System.out.println(test(str,1,8)); } public static String test(String str ,int a,int b){ for(int i=a;i<b;i++){ if(str.charAt(i)<0||str.charAt(i)>127){ b=b-1; } } return str.substring(a,b); } }

      输出结果

    国国国abcb
    gggggab
    国国国a
    

      

    把数字转化为钱币

    写到最后懒得写小数部分了,反正逻辑都是一样绕。

    package chapter4;
    
    public class FloatToRmb {
    	public static void main(String[] args) {
    		double f = 1006.789;
    		String[] ds = num(f);
    		String begin = ds[0];
    		String after = ds[1];
    		String str = "";
    		if (begin.length() > 0)
    			str = handleBefore(begin);
    		if (after.length() > 0) {
    			str = str + handleAfter(after);
    		}
    		System.out.println(str);
    	}
    
    	public static String handleBefore(String str) {// 1006
    		String str1 = "";
    		if (str.length() > 0) {// 2{
    			if (!str.substring(str.length() - 1).equals("0"))// 6
    				str1 = str.substring(str.length() - 1) + "元";
    			str = str.substring(0, str.length() - 1);
    			System.out.println(str.length());
    		}
    		if (str.length() > 0) {// 2
    			if (!str.substring(str.length() - 1).equals("0"))// 6
    			{
    				str1 = str.substring(str.length() - 1) + "shi" + str1;
    			} else {
    				str1 = "零" + str1;
    			}
    			str = str.substring(0, str.length() - 1);
    		}
    
    		if (str.length() > 0) {// 2
    			if (!str.substring(str.length() - 1).equals("0"))// 6
    			{
    				str1 = str.substring(str.length() - 1) + "bai" + str1;
    			} else if (!str1.startsWith("零")) {
    				str1 = "零" + str1;
    			}
    			str = str.substring(0, str.length() - 1);
    		}
    
    		if (str.length() > 0) {// 2
    			if (!str.substring(str.length() - 1).equals("0"))// 6
    				str1 = str.substring(str.length() - 1) + "qian" + str1;
    		}
    
    		return str1;
    	}
    
    	public static String toChineseNum(int a) {
    		String str = "";
    		switch (a) {
    		case 1:
    			str = "壹";
    		case 2:
    			str = "贰";
    		case 3:
    			str = "叁";
    		case 4:
    			str = "肆";
    		case 5:
    			str = "伍";
    		case 6:
    			str = "陆";
    		case 7:
    			str = "柒";
    		case 8:
    			str = "捌";
    		case 9:
    			str = "久";
    		}
    		return str;
    	}
    
    	public static String handleAfter(String str) {
    		return "2";
    	}
    
    	public static String[] num(double d) {
    		String[] ds = { "", "" };
    		String str = String.valueOf(d);
    		int num = str.indexOf(".");
    		ds[0] = str.substring(0, num);
    		ds[1] = str.substring(num + 1);
    		return ds;
    	}
    
    }
    

      改进版

    思路想好了

    对所有数值,都转换成  xxxxxxx的格式

    即 1006 转为 1006000,10067转为1006700 ,6.7转为0006700;

    对任意7位数,插入字符

    String 1 ="1234567";

    String 2 = "千百十元角分毫"

    str="1千2百3十4元5分6角7毫";

    package chapter4;
    
    public class FloatToRmb {
    	public static void main(String[] args) {
    		double d=10.078;
    		int a=(int)(d*1000);//1066789
    		String str=String.valueOf(a);
    		if(str.length()<=1){
    			str="零";
    		}
    		while(str.length()!=7){
    			str="0"+str;
    		}
    		String str1="千百十元角分毫";//3
    		String str2="";
    		for(int i=str.length();i>0;i--){
    			if(!str.substring(i-1,i).equals("0")){
    			str2=str.substring(i-1,i)+str1.substring(i-1, i)+str2;
    			}else if (str.substring(i-1,i).equals("0")
    					&&(!str2.startsWith("零"))
    					&&((i-1)<3)
    					&&(!str.startsWith("0"))
    					&&!str2.startsWith("元")//元
    					){//indexof 似乎不能识别中文?
    				System.out.println(str1.indexOf("元")+","+(i-1));
    				str2="零"+str2;
    			}else if(!str2.startsWith("元")
    					&&((i-1)==3)){
    				str2="元"+str2;
    			}
    			System.out.println(str.substring(i-1, i));
    			str1=str1.substring(0, i-1);
    			str=str.substring(0, i-1);
    		}
    		System.out.println(str2);
    	}
    	
    
    }
    

      逻辑判断的部分太垃圾了。。。。还需要改进

    改进后的版本:

    1.先把位数插入到字符串中

    2.再分析语义,字符串中需要做处理的只有 元 和零这两个字。修改代码,在字符串基础上,分别插入元和零这两个字就可以了。

    package chapter4;
    
    public class FloatToRmb {
    	public static void main(String[] args) {
    		double d=010.078;
    		int a=(int)(d*1000);//1066789
    		String str=String.valueOf(a);
    		String str2="";
    		if(str.length()<=1&&str.toString().equals("0")){
    			str2="零";
    		}else if(str.length()<=1&&(!str.toString().equals("0"))){
    			str2=str+"毫";
    		}
    		while(str.length()!=7){
    			str="0"+str;
    		}
    		String str1="千百十元角分毫";//3
    		if(str2.equals("")){
    		for(int i=str.length();i>0;i--){
    			if(!str.substring(i-1,i).equals("0")){//给不等于0的位数加上单位
    			str2=str.substring(i-1,i)+str1.substring(i-1, i)+str2;
    			}
    			else if(str.substring(i-1,i).equals("0")//当前位数为0时
    					&&((i-1)==3)//整数部分
    					&&notAllZero(str)){//给个位数为0,但整数部分不全为零的部分 ,加上元单位
    				str2="元"+str2;
    				System.out.println("当前位数为:"+(i-1)+",整数部分不全为0?:"+notAllZero(str));
    			}
    			else if((!str2.startsWith("元"))
    					&&(notAllZero(str))
    					&&str.substring(i-1,i).equals("0")
    					&&(i-1<=3)){//整数部位中,str2不以元开头,整数部分不全为零,当前单位str为0,加上“零”
    				str2="零"+str2;
    			}
    			str=str.substring(0,i-1);//每个循环,缩短一下str的尾部
    		}
    		}
    		System.out.println(str2);
    	}
    	public static boolean notAllZero(String str){
    		boolean b = false;//默认全0
    		while(str.length()>0){
    			if(!(str.substring(str.length()-1, str.length()).equals("0"))){
    				b=true;
    				break;
    			}
    				str=str.substring(0,str.length()-1);
    		}
    		return b;
    	}
    
    }
    

      

    其实还是很辣鸡。。。。_(:з)∠)_

      

    看了下,网上的大多数解决办法是把浮点数和整数分开处理,然后用数组来循环。

    唔。。。。好吧

    改进了一下代码

    可以处理4位的亿的数值

    package chapter4;
    
    public class FloatToRmb {
    	static String []bigDigit={"元","万","亿"};
    	static String []staticDigit={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    	static String zero="零";
    	public static void main(String[] args) {
    		double l=100000.1;
    		System.out.println(toChinese(getString(l)));
    	}
    	public static String getString(double l){
    		long a=(long) Math.floor(l);
    		long b=Math.round((l-a)*100);
    		String inte=String.valueOf(a);
    		String floate=String.valueOf(b);
    		String str="";
    		String[]intee=cutNum(inte);
    		if(!((inte.length()==1)&&inte.equals("0"))){
    			for(int i=0;i<intee.length;i++){
    //			System.out.print(intee[i]);
    			str=handleNum(intee[i])+bigDigit[i]+str;
    			}
    		}
    		return str=str+handleFloat(floate);
    	}
    	
    	public static String toChinese(String num){
    		String result="";
    		for(int i =0;i<num.length();i++){
    			//对每一位进行遍历,每一位从0~9,分别赋值staticDigit[0]~[9]
    			if(num.substring(i,i+1).matches("\d")){
    				int j =Integer.valueOf(num.substring(i,i+1));
    				result=result+staticDigit[j];
    			}else{
    				result=result+num.substring(i,i+1);
    			}
    			
    		}
    		return result;
    	}
    	
    	
    	public static String handleFloat(String num){//11
    		String a ="";
    		String [] f={"角","分"};
    //		System.out.println(num.length());
    		if(num.length()!=0){
    			for(int i =0;i<num.length();i++){
    				if(!num.substring(i, i+1).equals("0")){
    					a=a+num.substring(i,i+1)+f[i];
    				}
    			}
    		}
    		return a;
    	}
    	public static String[] cutNum(String num){
    		int digit=getDigit(num.length());
    		String []a=new String[digit];
    		while(num.length()<4*digit){
    			num="0"+num;
    		}
    		for(int i=0;i<digit;i++){
    			//将num进行四位切割
    			a[i]=num.substring((digit-i-1)*4,(digit-i)*4);//从后往前填充 
    		}
    		return a;
    	}
    	public static String handleNum(String num){
    		String []smallDigit={"千","百","拾",""};
    		String newNum="";
    		for(int i=num.length();i>0;i--){//1010 i=1
                if(!num.substring(i-1,i).equals("0")){//给不等于0的位数加上单位
                	newNum=num.substring(i-1,i)+smallDigit[i-1]+newNum;
                }
                else if(
                		num.substring(i-1,i).equals("0")//当前位的数值为0,后面数值有,前面数值不全为0,补“零"
                        &&(newNum.length()!=0)
                        &&(notAllZero(num))
                		){
                	newNum=zero+newNum;
                }
                num=num.substring(0,i-1);//每个循环,缩短一下str的尾部
            }
    		return newNum;
    	}
    	
    	public static int getDigit(int length){
    		int a =0;
    		a=(int)Math.ceil((double)length/4);
    		return a ;
    	}
    	
    	public static boolean notAllZero(String str){
    		boolean b = false;//默认全0
    		while(str.length()>0){
    			if(!(str.substring(str.length()-1, str.length()).equals("0"))){
    				b=true;
    				break;
    			}
    				str=str.substring(0,str.length()-1);
    		}
    		return b;
    	}
    }
    

      

    五子棋

    增加gameOver()方法,判断落子之后,棋局是否结束

    结束的标准:

    1.棋盘已满

    2.横,竖,左斜,右斜 5个子相连

    第一版本:

    对棋盘上的所有的位置进行校验,看看是否结束战斗:

    _(:з)∠)_ 好鸡儿烦躁啊,不能用一个循环和一个数组搞定。。。。

    package chapter4;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Gobang
    {
    	// 定义棋盘的大小
    	private static int BOARD_SIZE =7;
    	// 定义一个二维数组来充当棋盘
    	private static int EDGE=4;
    	private  String[][] board;
    	private int color=0;
    	public void initBoard(){
    		board=new String[BOARD_SIZE][BOARD_SIZE];
    		for(int i =0;i<BOARD_SIZE;i++){//列
    			//打印x个+
    			for(int j =0;j<BOARD_SIZE;j++){//行
    				board[i][j]="+ ";//数组的内容在赋值之前需要先初始化,不然会报nullPoint错误
    			}
    		}
    	}
    	public void showBoard(){
    		for(int i =0;i<BOARD_SIZE;i++){//列
    			//打印x个+
    			for(int j =0;j<BOARD_SIZE;j++){//行
    				System.out.print(board[i][j]);//j从0~14打印不换行
    			}
    			System.out.println();//i 从0~14打印换行
    		}
    		System.out.println("____________________________________");
    	}
    	
    	public Boolean paint(int i,int j ){
    		Boolean flag=false;
    		if(i>BOARD_SIZE||i<1||j>BOARD_SIZE||j<1){
    			return false;
    		}
    		//怎么判断是写○还是写*?
    		// color=0 下O,为用户方,=1 下第二个,为PC方;
    		if(board[i-1][j-1].equals("+ ")){
    			if(color==0){
    				board[i-1][j-1]="○ ";
    				color=1;
    			}else if(color==1){
    				board[i-1][j-1]="Q ";
    				color=0;
    			}
    			flag=true;
    		}
    		return flag;
    	}
    	public int random(){
    		return (int)Math.round(Math.random()*(BOARD_SIZE-1)+1);
    	}
    	//flag为true时,游戏结束
    	public Boolean gameOver(String i){
    		//1.棋盘占满 横向对比
    		Boolean flag=false;//游戏未结束
    		String [][]board_change=new String[BOARD_SIZE][BOARD_SIZE];
    		int [][]board_judge=new int [BOARD_SIZE][BOARD_SIZE];
    		int[][] board_judge2=new int [BOARD_SIZE][BOARD_SIZE];
    		for(int j=0;j<BOARD_SIZE;j++){
    			String str1="";
    			int count_x=0;
    			for(int k=0;k<BOARD_SIZE;k++){
    				board_change[k][j]=board[j][k];
    				str1=board[j][k]+str1;
    				if(board[j][k].equals(i)){
    					count_x=count_x+1;
    					if(count_x>=EDGE){
    						flag=true;
    						System.out.println(i+"胜利了,游戏结束。");//横向对比
    						return flag;
    					}
    					if(j==0){
    						board_judge[j][k]=1;
    						System.out.println("j:"+j+",k:"+k+",board_judge[j][k]:"+board_judge[j][k]);
    					}
    					//左斜判断
    					if((k>0)&&(board_judge[j-1][k-1]==j)){
    						board_judge[j][k]=j+1;
    					}
    					//右斜判断
    					if(k<BOARD_SIZE-1&&(board_judge2[j-1][k+1]==j)){
    						board_judge2[j][k]=j+1;
    					}
    					if(board_judge[j][k]==5||board_judge2[j][k]==5){
    						flag=true;
    						System.out.println(i+"胜利了,游戏结束。");//对角线对比
    					}
    				}else if(!board[j][k].equals(i)){
    					count_x=0;
    				}
    				if((!str1.contains("+ "))&&(j==BOARD_SIZE-1)&&(k==BOARD_SIZE-1)&&(!board[j][k].equals("+ "))){
    					System.out.println("棋盘已满,和");
    					flag=true;
    					return flag;
    				}
    			}
    		}
    		//竖着
    		for(int j=0;j<BOARD_SIZE;j++){
    			String str1="";
    			int count_x=0;
    			for(int k=0;k<BOARD_SIZE;k++){
    				str1=board_change[j][k]+str1;
    				if(board_change[j][k].equals(i)){
    					count_x=count_x+1;
    					if(count_x>=EDGE){
    						flag=true;
    						System.out.println(i+"胜利了,游戏结束。");//横向对比
    						return flag;
    					}
    				}else if(!board_change[j][k].equals(i)){
    					count_x=0;
    				}
    				if((!str1.contains("+ "))&&(j==BOARD_SIZE-1)&&(k==BOARD_SIZE-1)&&(!board_change[j][k].equals("+ "))){
    					System.out.println("棋盘已满,和");
    					flag=true;
    					return flag;
    				}
    			}
    		}
    		return flag;
    	}
    	
    	
    	public static void main(String []args) throws NumberFormatException, IOException{
    		Gobang gb=new Gobang();
    		System.out.println("—————————————————五子棋游戏—————————————————");
    		System.out.println("请输入1~"+BOARD_SIZE+"的数字");
    		gb.initBoard();
    		//get输入,用,分离
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String inputStr = null;
    		// br.readLine():每当在键盘上输入一行内容按回车,用户刚输入的内容将被br读取到。
    		while ((inputStr = br.readLine()) != null)
    		{
    			// 将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串
    			if(!inputStr.contains(",")){
    				System.out.println("需要输入英文逗号哦,请重新输入~");
    				continue;
    			}
    			String[] posStrArr = inputStr.split(",");
    			// 将2个字符串转换成用户下棋的座标
    			int xPos = Integer.parseInt(posStrArr[0]);
    			int yPos = Integer.parseInt(posStrArr[1]);
    			if(xPos<1||xPos>BOARD_SIZE||yPos<1||yPos>BOARD_SIZE){
    				System.out.println("请输入1~"+BOARD_SIZE+"的数字");
    				continue;
    			}
    			if(gb.paint(xPos,yPos)){
    				gb.showBoard();
    			}else{
    				System.out.println("当前位置已有棋子,请重新落子");
    				continue;
    			}
    //			System.out.println(gb.gameOver(0));
    			if(gb.gameOver("○ ")){
    				break;
    			}
    			
    			while(true){
    				if(gb.paint(gb.random(),gb.random())){
    					gb.showBoard();
    					break;
    				}else{
    					continue;
    				}
    			}
    			if(gb.gameOver("Q ")){
    				break;}
    		}
    }
    	}
    

      第二版本:

      参考了其他人用GUI写的用例,修改规则:

      1.只对落子的位置进行判断,不用对整个棋盘遍历

      _(:з)∠)_ 日哦,又要重写一发,我怎么这么笨。

      搞定了,只写了横向对比,其他方向的以此类推了,懒得动了。。。。

    package chapter4;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Gobang
    {
    	// 定义棋盘的大小
    	private static int BOARD_SIZE =7;
    	// 定义一个二维数组来充当棋盘
    	private static int EDGE=4;
    	private  String[][] board;
    	private int color=0;
    	public void initBoard(){
    		board=new String[BOARD_SIZE][BOARD_SIZE];
    		for(int i =0;i<BOARD_SIZE;i++){//列
    			//打印x个+
    			for(int j =0;j<BOARD_SIZE;j++){//行
    				board[i][j]="+ ";//数组的内容在赋值之前需要先初始化,不然会报nullPoint错误
    			}
    		}
    	}
    	public void showBoard(){
    		for(int i =0;i<BOARD_SIZE;i++){//列
    			//打印x个+
    			for(int j =0;j<BOARD_SIZE;j++){//行
    				System.out.print(board[i][j]);//j从0~14打印不换行
    			}
    			System.out.println();//i 从0~14打印换行
    		}
    		System.out.println("____________________________________");
    	}
    	
    	public Boolean paint(int i,int j ){
    		Boolean flag=false;
    		if(i>BOARD_SIZE||i<1||j>BOARD_SIZE||j<1){
    			return false;
    		}
    		//怎么判断是写○还是写*?
    		// color=0 下O,为用户方,=1 下第二个,为PC方;
    		if(board[i-1][j-1].equals("+ ")){
    			if(color==0){
    				board[i-1][j-1]="○ ";
    				color=1;
    			}else if(color==1){
    				board[i-1][j-1]="Q ";
    				color=0;
    			}
    			flag=true;
    		}
    		return flag;
    	}
    	public int random(){
    		return (int)Math.round(Math.random()*(BOARD_SIZE-1)+1);
    	}
    	//flag为true时,游戏结束
    	public Boolean gameOver(int xpos,int ypos){
    		Boolean flag=false;
    		xpos=xpos-1;
    		ypos=ypos-1;
    		//横向查看
    		int countx=0;
    		for(int i=ypos;i<BOARD_SIZE;i++){
    			
    			if(board[xpos][i].equals(board[xpos][ypos])){
    				countx=countx+1;
    			}else{
    				break;
    			}
    		}
    		for(int i=ypos ;i>0;i--){
    			if(board[xpos][i].equals(board[xpos][ypos])){
    				countx=countx+1;
    			}else{
    				break;
    			}
    		}
    		if(countx>=5){
    			flag=true;
    			System.out.println("胜负已分");
    			return flag;
    		}
    		/*//纵向查看
    		int county=0;
    		for(int i =xpos ;i<BOARD_SIZE;i++){
    			if(board[i][ypos].equals(board[xpos][ypos])){
    				county++;
    			}else {
    				break;
    			}
    			
    		}
    		for(int i=xpos;i>0;i--){
    			if(board[i][ypos].equals(board[xpos][ypos])){
    				county++;
    			}else{
    				break;
    			}
    		}
    		if(county>=5){
    			flag=true;
    			return flag;
    		}
    		//左斜查看
    		int counta=1;
    		for(int i =1;i<5;i++){
    			if(xpos+i<BOARD_SIZE&&ypos+i<BOARD_SIZE){
    				if(board[xpos+i][ypos+i].equals(board[xpos][ypos])){
    					counta++;
    				}else{
    					break;
    				}
    			}
    		}
    		for(int i=1;i<5;i++){
    			if(xpos-i>0&&ypos-i>0){
    				if(board[xpos-i][ypos-i].equals(board[xpos][ypos])){
    					counta++;
    				}else{
    					break;
    				}
    			}
    		}
    		if(counta>=5){
    			flag=true;
    			return flag;
    		}*/
    		//右斜查看
    		
    		//棋盘查看
    		return flag;
    	}
    	
    	
    	public static void main(String []args) throws NumberFormatException, IOException{
    		Gobang gb=new Gobang();
    		System.out.println("—————————————————五子棋游戏—————————————————");
    		System.out.println("请输入1~"+BOARD_SIZE+"的数字");
    		gb.initBoard();
    		//get输入,用,分离
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String inputStr = null;
    		// br.readLine():每当在键盘上输入一行内容按回车,用户刚输入的内容将被br读取到。
    		while ((inputStr = br.readLine()) != null)
    		{
    			// 将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串
    			if(!inputStr.contains(",")){
    				System.out.println("需要输入英文逗号哦,请重新输入~");
    				continue;
    			}
    			String[] posStrArr = inputStr.split(",");
    			// 将2个字符串转换成用户下棋的座标
    			int xPos = Integer.parseInt(posStrArr[0]);
    			int yPos = Integer.parseInt(posStrArr[1]);
    			if(xPos<1||xPos>BOARD_SIZE||yPos<1||yPos>BOARD_SIZE){
    				System.out.println("请输入1~"+BOARD_SIZE+"的数字");
    				continue;
    			}
    			if(gb.paint(xPos,yPos)){
    				gb.showBoard();
    				if(gb.gameOver(xPos,yPos)){
    					break;
    				}
    			}else{
    				System.out.println("当前位置已有棋子,请重新落子");
    				continue;
    			}
    			while(true){
    				int xpos;
    				int ypos;
    				if(gb.paint( xpos=gb.random(),ypos=gb.random())){
    					gb.showBoard();
    					gb.gameOver( xpos,ypos);
    					break;
    				}else{
    					continue;
    					}
    			}
    		}
    	}
    }
    

      

    梭哈游戏简易版

    这个好久之前就看过,然后没写过,因为不懂梭哈怎么玩。。。。

    还是没太懂,感觉是1张暗牌,然后依次发4张明牌,每发一轮来一轮跟/弃,发完后明牌分胜负。

    唔。。。。五子棋的今天看了下官方给的正确答案,感觉自己的类设计很辣鸡。。。。梭哈感觉又要扑街。

     第一步:流程图

    这个逻辑太机儿复杂了,简化了一下:

    这里实现大概有5个重点:

      1.牌面设计

      2.发牌随机

      3.人工输入 Y/N

      4.判定当前对局人数(有人弃牌,另一人就胜利了,这里没有考虑多人游戏)

      5.比牌逻辑(同花顺>四条>葫芦>同花>顺子>三条>二对>单对>散牌 、黑桃>红桃>草花>方块 、A>K>Q>J>10>9>8 >7>6>5>4>3>2)

    审题:

    定义一个类,该类用户封装一桌梭哈游戏,这个类应该包含桌上剩下的牌的信息,并包含5个玩家的状态信息:各自的位置,游戏状态(正在游戏/已放弃),手上已有的牌等信息。如果有可能,这个类还应该实现发牌方法,这个方法需要控制从谁开始发牌,不要发牌给放弃的人,并修改桌上剩下的牌。

    暂未实现比牌功能

    package chapter6;
    
    
    /**
     * @param WEEK 牌面数值
     * @param suit 花色
     * @param poker[] 扑克牌字符串数组
     */
    class Stud{
    	/**
         * 返回 {@code String}是初始化的牌面,
         * @return  由52张不同牌面组成的字符串
         */
    	public final static int CARD_NO=52;
    	public final static String WEEK="A23456789TJQK";
    	public final static String SUIT="♠♥♦♣";
    	public String pokercard;
    	public String restcard;
    	
    	public String getRestcard() {
    		return restcard;
    	}
    	public void setRestcard(String restcard) {
    		this.restcard = shuffleCard(pokercard);
    	}
    	public String getPokercard() {
    		return pokercard;
    	}
    	public void setPokercard() {
    		String  poker="";
    		for(int j=0;j<SUIT.length();j++){
    			for(int k=0;k<WEEK.length();k++){
    				poker=poker+SUIT.substring(j, j+1)+WEEK.substring(k, k+1);
    				}
    			}
    		this.pokercard= poker;
    	}
    	 /**
         * 返回 {@code String}是洗牌后的牌面结果,
         * 给一个[0,52)的随机数,然后从给定的牌里面,按照随机数取出来,付给新牌面
         * 并将旧牌面的该随机数的牌replace
         * @param   pokercard  a {@code String} value.
         * @return  将pokercard洗牌后的结果
         */
    	public static String  shuffleCard(String pokercard){
    		String sc = "";
    		String pc=pokercard;
    		if(pokercard.length()!=CARD_NO*2){
    			System.out.println("the pokercard is wrong,please check the num");
    			return "";
    		}
    		
    		while(pc.length()>0){
    			int randomNum=(int)Math.floor(Math.random()*(pc.length()/2));
    			String card=pc.substring(2*randomNum, 2*randomNum+2);
    			sc=sc+card;
    			pc=pc.replace(card, "");
    		}
    		return sc;
    	}
    	/**
         * 返回 发给玩家的手牌,并减少剩下的公牌,并更新玩家手牌
         * @param restcard 参数是用来发牌的公牌
         * 
         */
    	public String handCard(String restcard,Player player){
    		String dc="";
    		dc =restcard.substring(0,2); 
    		this.restcard=this.restcard.substring(2);
    		player.setCard(player.getCard()+dc);
    		return dc;
    	}
    
    	
    	/**
    	 * 比牌
    	 */
    //	public void 
    }
    /**
     * @author zhizhiyin
     * @param name 玩家名字;
     * @param position 玩家位置;
     * @param fold 是否弃牌,默认false不弃牌;
     * @param card 玩家手牌
     */
    class Player{
    	private String name ;
    	private int position;
    	private String card="";
    	private boolean fold=false;//弃牌
    	public String getCard() {
    		return card;
    	}
    	public void setCard(String card) {
    		if(card.length()==2){
    			//||card.matches("^[A|2|3|4|5|6|7|8|9|T|J|Q|K]{1}[♠|♥|♦|♣]{1}$")
    			this.card = card;
    			return ;
    		}
    		else{
    			System.out.println("传入的card 长度不为2");
    		}
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		if(name.length()>=1&&name.length()<=4){
    			this.name = name;
    			return;
    		}else{
    			System.out.println("name长度须在1~4之间");
    		}
    	}
    	public int getPosition() {
    		return position;
    	}
    	public void setPosition(int position) {
    		if(position>=0&&position<5){
    			this.position = position;
    			return ;
    		}else{
    			System.out.println("position长度须在0~4之间");
    		}
    	}
    	public boolean getFold() {
    		return fold;
    	}
    	public void setFold(boolean fold) {
    		this.fold = fold;
    	}
    	//创建玩家,如果只需要五个玩家呢?怎么给这些玩家初始化呢?
    	/**
    	 * @param name 玩家的名字
    	 * @param positioni 玩家的位置
    	 */
    	public Player(String name ,int position){
    		setName(name);
    		setPosition(position);
    	}
    	/**
    	 * @param player 需要切换成弃牌状态的玩家
    	 * @method turnFold(player) 如果用户未弃牌,置状态为弃牌,返回true,如果用户已经弃牌,置状态为false,表示转换失败,该用户已是弃牌状态
    	 */
    	public boolean turnFold(){
    		if(this.getFold()==false){
    			this.setFold(true);
    			return true;
    		}else{
    			return false;
    		}
    	}
    }
    
    public class TestStud {
    	public static void main(String[]args){
    		
    	}
    }
    

      

    加入测试代码,并修复了一些bug

    比牌逻辑并未完善,明牌暗牌什么的也没有加上。

    package chapter6;
    
    import java.util.Scanner;
    
    /**
     * @param WEEK 牌面数值
     * @param suit 花色
     * @param poker[] 扑克牌字符串数组
     */
    class Stud{
    	/**
         * 返回 {@code String}是初始化的牌面,
         * @return  由52张不同牌面组成的字符串
         */
    	public final static int CARD_NO=52;
    	public final static String WEEK="A23456789TJQK";
    	public final static String SUIT="♠♥♦♣";
    	public String getPokercard() {
    		String  poker="";
    		for(int j=0;j<SUIT.length();j++){
    			for(int k=0;k<WEEK.length();k++){
    				poker=poker+SUIT.substring(j, j+1)+WEEK.substring(k, k+1);
    				}
    			}
    		return poker;
    	}
    	 /**
         * 返回 {@code String}是洗牌后的牌面结果,
         * 给一个[0,52)的随机数,然后从给定的牌里面,按照随机数取出来,付给新牌面
         * 并将旧牌面的该随机数的牌replace
         * @param   pokercard  a {@code String} value.
         * @return  将pokercard洗牌后的结果
         */
    	public String  shuffleCard(String pokercard){
    		String sc = "";
    		String pc=pokercard;
    		if(pokercard.length()!=CARD_NO*2){
    			System.out.println("the pokercard is wrong,please check the num");
    			return "";
    		}
    		
    		while(pc.length()>0){
    			int randomNum=(int)Math.floor(Math.random()*(pc.length()/2));
    			String card=pc.substring(2*randomNum, 2*randomNum+2);
    			sc=sc+card;
    			pc=pc.replace(card, "");
    		}
    		return sc;
    	}
    	/**
         * 返回 发给玩家的手牌,并更新玩家手牌
         * @param restcard 参数是用来发牌的公牌
         * 
         */
    	public String handCard(String restcard,Player player){
    		String dc="";
    		dc =restcard.substring(0,2); 
    		System.out.println("handCard前,player的card是:"+player.getCard());
    		player.setCard(player.getCard()+dc);
    		return dc;
    	}
    	public String restCard(String restCard){
    		return restCard.substring(2);
    	}
    	
    	/**
    	 * 比牌
    	 */
    //	public void 
    }
    /**
     * @author zhizhiyin
     * @param name 玩家名字;
     * @param position 玩家位置;
     * @param fold 是否弃牌,默认false不弃牌;
     * @param card 玩家手牌
     */
    class Player{
    	private String name ;
    	private int position;
    	private String card="";
    	private boolean fold=false;//弃牌
    	public String getCard() {
    		return card;
    	}
    	public void setCard(String card) {
    			this.card = card;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		if(name.length()>=1&&name.length()<=4){
    			this.name = name;
    			return;
    		}else{
    			System.out.println("name长度须在1~4之间");
    		}
    	}
    	public int getPosition() {
    		return position;
    	}
    	public void setPosition(int position) {
    		if(position>=0&&position<5){
    			this.position = position;
    			return ;
    		}else{
    			System.out.println("position长度须在0~4之间");
    		}
    	}
    	public boolean getFold() {
    		return fold;
    	}
    	public void setFold(boolean fold) {
    		this.fold = fold;
    	}
    	//创建玩家,如果只需要五个玩家呢?怎么给这些玩家初始化呢?
    	/**
    	 * @param name 玩家的名字
    	 * @param positioni 玩家的位置
    	 */
    	public Player(String name ,int position){
    		setName(name);
    		setPosition(position);
    	}
    	/**
    	 * @param player 需要切换成弃牌状态的玩家
    	 * @method turnFold(player) 如果用户未弃牌,置状态为弃牌,返回true,如果用户已经弃牌,置状态为false,表示转换失败,该用户已是弃牌状态
    	 */
    	public boolean turnFold(){
    		if(this.getFold()==false){
    			this.setFold(true);
    			return true;
    		}else{
    			return false;
    		}
    	}
    }
    
    public class TestStud {
    	public static void main(String[]args){
    		//怎么在初始化的时候创建玩家呢?怎么同时给五个玩家发牌呢?
    		//用数组来解决
    		int playerNo=5;//人数
    		int flopNo=1;//轮次
    		
    		Player []player=new Player[playerNo];
    		for(int i =0;i<playerNo;i++){
    			String name="玩家"+i;
    			player[i]=new Player(name,i);
    		}
    		//洗牌
    		Stud s=new Stud();
    		String restCard =s.shuffleCard(s.getPokercard());
    		Boolean flag=false;
    		while (!flag){
    			for(int i =0;i<player.length;i++){
    				//判断是否弃牌
    				if(player[i].getFold()==false){
    					s.handCard(restCard, player[i]);
    					restCard=s.restCard(restCard);
    					System.out.println("当前余牌:"+restCard);
    					//跟弃
    					System.out.println(player[i].getName()+"的手牌:"+player[i].getCard());
    					System.out.println("当前玩家是否弃牌?Y/N");
    					Scanner input = new Scanner(System.in);
    					String str =input.next();
    					if (str.equals("Y")){
    						//弃牌
    						player[i].turnFold();
    						playerNo=playerNo-1;
    						System.out.println("playerNo:"+playerNo);
    					}
    					if(playerNo==1){
    						//结束
    						System.out.println("game over");
    						flag=true;
    						break;
    					}
    				}
    				}
    			flopNo=flopNo+1;
    			if(flopNo==5){
    				System.out.println("进入比牌");
    				flag=true;
    				break;
    			}
    		}
    	}
    }
    

      

     梭哈游戏 阉割版

    需要把毛坯版改成精装版。。。。

    老规矩,流程图:

     

    之前的版本,用数组和字符串写的。chapter7讲的是集合。

    总体优化方向应该是用集合来写。

    优化方向:

    1.手牌需要区分 明牌/暗牌。

    2.洗牌似乎可以用set来写?

    3.比牌逻辑不会哦。。。这个怎么比较呢?

    准备把集合看完了再来大改一下。

    package chapter6;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Scanner;
    
    /**
     * @param WEEK 牌面数值
     * @param suit 花色
     * @param poker[] 扑克牌字符串数组
     */
    class Stud{
    	public final static int CARD_NO=52;
    	public final static String WEEK="A23456789TJQK";
    	public final static String SUIT="♠♥♦♣";
    	/**
    	 * 返回 {@code ArrayList}是初始化的牌面,
    	 * @return ArrayList 为初始化赋值的牌面
    	 */
    	public ArrayList initPokerCard() {
    		ArrayList poker=new ArrayList();
    		for(int j=0;j<SUIT.length();j++){
    			for(int k=0;k<WEEK.length();k++){
    				poker.add(SUIT.substring(j, j+1)+WEEK.substring(k, k+1));
    				}
    			}
    		return poker;
    	}
    	 /**
         * 返回 {@code ArrayList}是洗牌后的牌面结果,
         * 给一个[0,52)的随机数,然后从给定的牌里面,按照随机数取出来,add给新牌面
         * 并将旧牌面的该随机数的牌remove
         * @param   pokercard  a {@code ArrayList} value.
         * @return  将poker洗牌后的结果
         */
    	public ArrayList shuffleCard(ArrayList poker){
    		ArrayList al=new ArrayList();
    		while(poker.size()>0){
    			int randomNum=(int)Math.floor(Math.random()*(poker.size()));
    			al.add(poker.get(randomNum));
    			poker.remove(randomNum);
    		}
    		return al;
    	}
    	/**
         * 返回 {@code String}发给玩家的手牌,并更新玩家手牌
         * @param poker 参数是用来发牌的公牌
         * 
         */
    	public String handCard(ArrayList poker,Player player){
    		String handCard="";
    		handCard=(String) poker.get(0); 
    		System.out.println("handCard前,player的card是:"+player.getCard());
    		player.setCard(player.getCard()+handCard);
    		return handCard;
    	}
    	/**
    	 * {@code ArrayList}将第一张牌移除,返回剩余的牌面
    	 * @param poker 当前剩余公牌
    	 * 模拟发牌
    	 */
    	public ArrayList restCard(ArrayList poker){
    		poker.remove(0);
    		return poker;
    	}
    	
    	/**
    	 * 比牌
    	 */
    	public Player judge(HashMap player){
    		Player winner =(Player)player.get(0);
    		//遍历,如果第一个大,就将第一个和第N个的位置调换
    		
    		
    		
    		return winner;
    	}
    }
    /**
     * @author zhizhiyin
     * @param name 玩家名字;
     * @param position 玩家位置;
     * @param fold 是否弃牌,默认false不弃牌;
     * @param card 玩家手牌
     */
    class Player{
    	private String name ;
    	private String card="";
    	private boolean fold=false;//弃牌
    	public String getCard() {
    		return card;
    	}
    	public void setCard(String card) {
    			this.card = card;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		if(name.length()>=1&&name.length()<=4){
    			this.name = name;
    			return;
    		}else{
    			System.out.println("name长度须在1~4之间");
    		}
    	}
    	public boolean getFold() {
    		return fold;
    	}
    	public void setFold(boolean fold) {
    		this.fold = fold;
    	}
    	//创建玩家,如果只需要五个玩家呢?怎么给这些玩家初始化呢?
    	/**
    	 * @param name 玩家的名字
    	 * @param positioni 玩家的位置
    	 */
    	public Player(String name){
    		setName(name);
    	}
    	/**
    	 * @param player 需要切换成弃牌状态的玩家
    	 * @method turnFold(player) 如果用户未弃牌,置状态为弃牌,返回true,如果用户已经弃牌,置状态为false,表示转换失败,该用户已是弃牌状态
    	 */
     	public boolean turnFold(){
    		if(this.getFold()==false){
    			this.setFold(true);
    			System.out.println("该玩家弃牌");
    			return true;
    		}else{
    			return false;
    		}
    	} 
    }
    
    public class TestStud {
    	public static void main(String[]args){
    		//给玩家赋值
    		int playerNo=5;
    		HashMap player=new HashMap();
    		for(int i =0;i<playerNo;i++){
    			String name ="玩家"+i;
    			player.put(i, new Player(name));
    		}
    		Stud s = new Stud();
    		ArrayList poker =s.initPokerCard();//初始化牌面
    		poker = s.shuffleCard(poker);//洗牌
    		int flopNo=1;//轮次
    		Boolean flag=false;
    		while (!flag){
    			for(int i =0;i<player.size();i++){
    					Player currentPlayer =(Player)player.get(i);
    					if(player.size()==1){
    						//结束
    						System.out.println("当前仅有一个玩家:"+currentPlayer.getName()+",game over");
    						flag=true;
    						break;
    					}
    					s.handCard(poker,currentPlayer);
    					poker=s.restCard(poker);
    					System.out.println("当前余牌:"+poker);
    					//跟弃
    					System.out.println(currentPlayer.getName()+"的手牌:"+currentPlayer.getCard());
    					System.out.println("当前玩家是否弃牌?Y/N");
    					Scanner input = new Scanner(System.in);
    					String str =input.next();
    					if (str.equals("Y")){
    						//弃牌
    						currentPlayer.turnFold();
    						player.remove(i);
    					}
    				}
    			flopNo=flopNo+1;
    			if(flopNo==5){
    				System.out.println("进入比牌");
    				s.judge(player);
    				flag=true;
    				break;
    			}
    		}
    	}
    }
    

      比牌逻辑未修改,感觉这个好难哦。

     有一点思路:

    1.如果是牌桌的话,可以用冒泡排序依次排列,然后算钱,这里会简化一下,只找出最大的牌面,并返回player,这里我的player用的hashMap。取值的话只能依靠index。

    取出最小值:

    int min =numList[0];
    		int exchange=0;
    		//筛选出最小的,并显示
    		for(int i=1;i<numList.length;i++){
    			if(numList[i]<min){
    				exchange=min;
    				min=numList[i];
    				numList[i]=exchange;
    			}
    		}

    冒泡排序

    int ex = 0;
    		for (int i = numList.length; i>1; i--) {
    			for (int j = 1; j < i; j++) {
    				if (numList[j] < numList[j - 1]) {
    					ex = numList[j - 1];
    					numList[j - 1] = numList[j];
    					numList[j] = ex;
    				}
    			}
    		}
    

      

    2.需要写详细的1v1的手牌比较。需要分别比较花色,牌面。。。我讨厌写这个

     判断牌型,同花顺,同花,顺子

    public int levelOfCard(String handCard) {
    		int level = 0;
    		String week = "";
    		if (handCard.length() > 10 || handCard.length() <= 0) {
    			System.out.println("字符串长度异常");
    			return -1;
    		}
    		int color = 1;
    		// 判断同花的
    		for (int i = 2; i < handCard.length(); i = i + 2) {
    			char x = handCard.charAt(i);
    			char last = handCard.charAt(i - 2);
    			if (SUIT.indexOf(x) == SUIT.indexOf(last)) {
    				color++;
    			} else if (x != last) {
    				break;
    			}
    		}
    		// 判断顺子的
    		for (int i = 1; i < handCard.length(); i = i + 2) {
    			week = week + handCard.substring(i, i + 1);
    		}
    		// 判断同花顺,同花,顺子
    		if (color == 5 && WEEK.contains(week)) {
    			return 1;
    		} else if (color == 5 && (!WEEK.contains(week))) {
    			return 4;
    		} else if (color != 5 && WEEK.contains(week)) {
    			return 5;
    		}
    		// 判断同week出现的次数
    		int maxTimes=1;
    		for (int i = 1; i < week.length(); i++) {
    			//how?????
    		}
    		return level;
    	}
    }
    

      判断其他牌型,金刚,葫芦,三条,两对,一对,单牌

    这里写了一个判断字符串中重复次数最多的字符和重复次数。。。。

    感觉代码质量特别差,这里用的是hashMap,准备看看别人怎么处理的。

        String str="a112222233344444556";
    		int count=1;
    		char maxStr='*';
    		HashMap hm = new HashMap();
    		for(int i =1;i<str.length();i++){
    			if(str.charAt(i)==str.charAt(i-1)){
    				count++;
    			}else if(i<str.length()-1){
    				hm.put(str.charAt(i-1), count);
    				count=1;
    			}else if(i==str.length()-1){
    				hm.put(str.charAt(i), count);
    				count=0;
    			}
    		}
    		for(Object key:hm.keySet()){
    			int value=(Integer) hm.get(key);
    			if(value>count){
    				count=value;
    				maxStr=(Character) key;
    			}
    		}
    		System.out.println("出现最多的字符是:"+maxStr+"count:"+count);        
    

      没有看别人的代码,修改了一下赋值逻辑

    		String str="a112222233344444556";
    		int countMax=1;
    		int count=1;
    		char maxchar=str.charAt(0);
    		for(int i =1;i<str.length();i++){
    			//计算count,将第一个count和char赋值给max
    			if(str.charAt(i)==str.charAt(i-1)){
    				count++;
    			}else if(count>countMax){
    				countMax=count;
    				maxchar=str.charAt(i-1);
    				count=1;
    			}else{
    				count=1;
    			}
    		}
    		System.out.println("出现最多的字符是:"+maxchar+",countMax:"+countMax);
    

      同level的比牌没有完成:

    package chapter6;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;
    
    import org.omg.Messaging.SyncScopeHelper;
    
    /**
     * @param WEEK
     *            牌面数值
     * @param suit
     *            花色
     * @param poker[]
     *            扑克牌字符串数组
     */
    class Stud {
    	public final static int CARD_NO = 52;
    	public final static String WEEK = "A23456789TJQK";
    	public final static String SUIT = "♠♥♦♣";
    
    	/**
    	 * 返回 {@code ArrayList}是初始化的牌面,
    	 * 
    	 * @return ArrayList 为初始化赋值的牌面
    	 */
    	public ArrayList initPokerCard() {
    		ArrayList poker = new ArrayList();
    		for (int j = 0; j < SUIT.length(); j++) {
    			for (int k = 0; k < WEEK.length(); k++) {
    				poker.add(SUIT.substring(j, j + 1) + WEEK.substring(k, k + 1));
    			}
    		}
    		return poker;
    	}
    
    	/**
    	 * 返回 {@code ArrayList}是洗牌后的牌面结果, 给一个[0,52)的随机数,然后从给定的牌里面,按照随机数取出来,add给新牌面
    	 * 并将旧牌面的该随机数的牌remove
    	 * 
    	 * @param pokercard
    	 *            a {@code ArrayList} value.
    	 * @return 将poker洗牌后的结果
    	 */
    	public ArrayList shuffleCard(ArrayList poker) {
    		ArrayList al = new ArrayList();
    		while (poker.size() > 0) {
    			int randomNum = (int) Math.floor(Math.random() * (poker.size()));
    			al.add(poker.get(randomNum));
    			poker.remove(randomNum);
    		}
    		return al;
    	}
    
    	/**
    	 * 返回 {@code String}发给玩家的手牌,并更新玩家手牌
    	 * 
    	 * @param poker
    	 *            参数是用来发牌的公牌
    	 * 
    	 */
    	public String handCard(ArrayList poker, Player player) {
    		String newCard = (String) poker.get(0);// 发过来的牌
    		String handCard = player.getCard();// 本来的牌
    		System.out.println("NEW:" + newCard + ",handCard:" + handCard);
    		int newIndex = WEEK.indexOf(newCard.charAt(1));
    		if (handCard.equals("")) {
    			handCard = newCard;
    			player.setCard(handCard);
    
    			System.out.println("handCard:" + handCard);
    			return handCard;
    		} else {
    			for (int i = 1; i < handCard.length(); i = i + 2) {
    				if (newIndex <= WEEK.indexOf(handCard.charAt(i))) {
    					handCard = handCard.substring(0, i - 1) + newCard + handCard.substring(i - 1, handCard.length());
    					player.setCard(handCard);
    					return handCard;
    				} else if (newIndex > WEEK.indexOf(handCard.charAt(i)) && i == handCard.length() - 1) {
    					handCard = handCard + newCard;
    					player.setCard(handCard);
    					return handCard;
    				}
    			}
    		}
    		return handCard;
    	}
    
    	/**
    	 * {@code ArrayList}将第一张牌移除,返回剩余的牌面
    	 * 
    	 * @param poker
    	 *            当前剩余公牌 模拟发牌
    	 */
    	public ArrayList restCard(ArrayList poker) {
    		poker.remove(0);
    		return poker;
    	}
    
    	/**
    	 * 比牌
    	 */
    	public Player judge(HashMap player) {
    		Player winner = (Player) player.get(0);
    		// 遍历,如果第一个大,就将第一个和第N个的位置调换
    		for (int i = 1; i < player.size(); i++) {
    			Player next = (Player) player.get(i);
    			// 比较两者,如果手牌next>winner ,返回true,反之,返回false
    			if (compare(next.getCard(), winner.getCard())) {
    				winner = next;
    			}
    		}
    		return winner;
    	}
    
    	/**
    	 * 默认值是false,如果a的牌更大,就将player置为b
    	 * 
    	 * @param 用来比较的牌
    	 * @param 当前的winner的牌
    	 * @return 前者比后者大,返回true,否则返回false
    	 */
    	public Boolean compare(String handCardA, String handCardB) {
    		Boolean flag = false;
    		// 先判断牌面level,再判断牌面大小
    		int levelA = levelOfCard(handCardA);
    		int levelB = levelOfCard(handCardB);
    		if (levelA > levelB) {
    			return true;
    		} else if (levelA < levelB) {
    			return false;
    		} else if(levelA==levelB) {
    			//同牌型比牌:
    			switch (levelA) {
    			// 同花顺
    			case 1:
    			// 金刚
    			case 2:
    			// 葫芦
    			case 3:
    			// 同花
    			case 4:
    			// 顺子
    			case 5:
    				//other
    			}
    		}
    		return flag;
    	}
    
    	public int levelOfCard(String handCard) {
    		int level = 0;
    		String week = "";
    		if (handCard.length() > 10 || handCard.length() <= 0) {
    			System.out.println("字符串长度异常");
    			return -1;
    		}
    		int color = 1;
    		// 判断同花的
    		for (int i = 2; i < handCard.length(); i = i + 2) {
    			char x = handCard.charAt(i);
    			char last = handCard.charAt(i - 2);
    			if (SUIT.indexOf(x) == SUIT.indexOf(last)) {
    				color++;
    			} else if (x != last) {
    				break;
    			}
    		}
    		// 判断顺子的
    		for (int i = 1; i < handCard.length(); i = i + 2) {
    			week = week + handCard.substring(i, i + 1);
    		}
    		// 判断同花顺,同花,顺子
    		if (color == 5 && WEEK.contains(week)) {
    			System.out.println("同花顺");
    			return 1;
    		} else if (color == 5 && (!WEEK.contains(week))) {
    			System.out.println("同花");
    			return 4;
    		} else if (color != 5 && WEEK.contains(week)) {
    			System.out.println("顺子");
    			return 5;
    		}
    		// 判断同week出现的次数
    		int countMax=1;
    		int count=1;
    		char maxchar=week.charAt(0);
    		for(int i =1;i<week.length();i++){
    			//计算count,将第一个count和char赋值给max
    			if(week.charAt(i)==week.charAt(i-1)){
    				count++;
    			}else{
    				count=1;
    			}
    			if(count>countMax){
    				countMax=count;
    				maxchar=week.charAt(i-1);
    			}
    		}
    			if(countMax ==4){
    				System.out.println("金刚");
    				return 2;
    			}else if(countMax ==3){
    				String str = maxchar+"";
    				String [] str2=week.split(str);
    				str="";
    				for(String s:str2){
    					str=str+s;
    				}
    				if(getMaxCount(str)==2){
    					System.out.println("葫芦");
    					return 3;
    				}else{
    					System.out.println("三条");
    					return 6;
    				}
    			}else if(countMax==2){
    				String str = maxchar+"";
    				String [] str2=week.split(str);
    				str="";
    				for(String s:str2){
    					str=str+s;
    				}
    				if(getMaxCount(str)==2){
    					System.out.println("两对");
    					System.out.println("str:"+str);
    					return 7;
    				}else {
    					System.out.println("一对");
    					System.out.println("str:"+str);
    					return 8;
    				}
    			}else if(countMax==1){
    				System.out.println("散牌");
    				return 9;
    			}
    		return level;
    	}
    
    	private int getMaxCount(String week) {
    		int countMax=1;
    		int count=1;
    //		char maxchar=handCard.charAt(0);
    		for(int i =1;i<week.length();i++){
    			//计算count,将第一个count和char赋值给max
    			if(week.charAt(i)==week.charAt(i-1)){
    				count++;
    			}else if(count>countMax){
    				countMax=count;
    //				maxchar=handCard.charAt(i-1);
    				count=1;
    			}else{
    				count=1;
    			}
    		}
    		return countMax;
    	}
    }
    
    /**
     * @author zhizhiyin
     * @param name
     *            玩家名字;
     * @param position
     *            玩家位置;
     * @param fold
     *            是否弃牌,默认false不弃牌;
     * @param card
     *            玩家手牌
     */
    class Player {
    	private String name;
    	private String card = "";
    	private boolean fold = false;// 弃牌
    
    	public String getCard() {
    		return card;
    	}
    
    	public void setCard(String card) {
    		this.card = card;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		if (name.length() >= 1 && name.length() <= 4) {
    			this.name = name;
    			return;
    		} else {
    			System.out.println("name长度须在1~4之间");
    		}
    	}
    
    	public boolean getFold() {
    		return fold;
    	}
    
    	public void setFold(boolean fold) {
    		this.fold = fold;
    	}
    
    	// 创建玩家,如果只需要五个玩家呢?怎么给这些玩家初始化呢?
    	/**
    	 * @param name
    	 *            玩家的名字
    	 * @param positioni
    	 *            玩家的位置
    	 */
    	public Player(String name) {
    		setName(name);
    	}
    
    	/**
    	 * @param player
    	 *            需要切换成弃牌状态的玩家
    	 * @method turnFold(player)
    	 *         如果用户未弃牌,置状态为弃牌,返回true,如果用户已经弃牌,置状态为false,表示转换失败,该用户已是弃牌状态
    	 */
    	public boolean turnFold() {
    		if (this.getFold() == false) {
    			this.setFold(true);
    			System.out.println("该玩家弃牌");
    			return true;
    		} else {
    			return false;
    		}
    	}
    }
    
    public class TestStud {
    	public static void main(String[] args) {
    		
    
    		int playerNo = 5;
    
    		Stud s = new Stud();
    		ArrayList poker = s.initPokerCard();
    		poker = s.shuffleCard(poker);
    
    		HashMap player = new HashMap();
    		for (int i = 0; i < playerNo; i++) {
    			String name = "玩家" + i;
    			player.put(i, new Player(name));
    		}
    
    		int flopNo = 1;// 轮次
    		Boolean flag = false;
    
    		while (!flag) {
    			for (int i = 0; i < player.size(); i++) {
    				Player currentPlayer = (Player) player.get(i);
    				if (player.size() == 1) {
    					System.out.println("当前仅有一个玩家:" + currentPlayer.getName() + ",game over");
    					flag = true;
    					break;
    				}
    				s.handCard(poker, currentPlayer);
    				poker = s.restCard(poker);
    				System.out.println("当前余牌:" + poker); // 跟弃
    				System.out.println(currentPlayer.getName() + "的手牌:" + currentPlayer.getCard());
    				System.out.println("当前玩家是否弃牌?Y/N");
    				Scanner input = new Scanner(System.in);
    				String str = input.next();
    				if (str.equals("Y")) { // 弃牌
    					currentPlayer.turnFold();
    					player.remove(i);
    				}
    			}
    			
    			if (flopNo == 5) {
    				System.out.println("进入比牌");
    				for(Object key :player.keySet()){
    					Player p =(Player)player.get(key);
    					System.out.println(p.getCard());
    					System.out.println(s.levelOfCard(p.getCard()));
    				}
    //				s.judge(player);
    				flag = true;
    				break;
    			}
    			flopNo = flopNo + 1;
    		}
    
    	}
    }
    

      

  • 相关阅读:
    猜数字游戏
    Visual Studio Code如何编写运行C、C++
    Git Submodule使用完整教程
    同一客户端多个git账号的配置
    让 Git Bisect 帮助你
    GitHub 风格的 Markdown 语法
    git 命令图解
    图解git中的最常用命令
    Understanding the Bias-Variance Tradeoff
    Seven Techniques for Data Dimensionality Reduction
  • 原文地址:https://www.cnblogs.com/zhizhiyin/p/7482004.html
Copyright © 2020-2023  润新知