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

时间:2023-03-09 10:00:59
java练习:质数,匿名内部类创建接口,抽象类派生子类,画圆,字节截取字符串,数字变钱币,五子棋,梭哈

java学习-质数的孤独

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

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

代码比较烂。待完善吧。

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

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

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

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

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

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

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

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);
}  

原理:

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

输入数字代码

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张明牌,每发一轮来一轮跟/弃,发完后明牌分胜负。

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

第一步:流程图

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

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

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

这里实现大概有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;
}
}
}
}

  

梭哈游戏 阉割版

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

老规矩,流程图:

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

之前的版本,用数组和字符串写的。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;
} }
}