/**
* 创建扑克牌类
* @author
*
*/
public class Card implements Comparable<Card> {
String num;
String type;
int rank; //rank代表等级,值越大,等级越高
public Card(String type,String num,int rank) {
this.num=num;
this.type=type;
this.rank=rank;
}
public Card() {
}
@Override
public int compareTo(Card o) {
return this.rank-o.rank; //比较rank值的大小
}
}
/**
* 创建玩家类
* @author
*
*/
public class Player {
String id;
String name;
List<Card>pCards; //用于存放玩家手中的牌
public Player(String id,String name) {
this.id=id;
this.name=name;
pCards=new ArrayList<Card>();
}
}
/**
*
* @author
*
*/
public class CardDemo {
List<Card>cards;
List<Player>players;
Player p1; //玩家
Player p2;
Card p1max; //玩家1最大的牌
Card p2max; //玩家2最大的牌
Card p1min; //玩家1最小的牌
Card p2min; //玩家2最小的牌
//创建扑克牌资源数组
String[] CardType=new String[] {"方块","梅花","红桃","黑桃"}; //顺序不可调换,否则会影响大小比较的rank值
String[] CardNum=new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
public CardDemo() {
this.cards=new ArrayList<Card>();
this.players=new ArrayList<Player>();
}
//创建扑克牌
public void CreatCard() {
System.out.println("---------创建扑克牌-----------");
for(int i=0;i<13;i++) {
for(int j=0;j<4;j++) {
cards.add(new Card(CardType[j],CardNum[i],i*13+j));
}
}
//遍历打印扑克牌资源
System.out.println("--------扑克牌创建成功!----------");
System.out.print("扑克牌为");
for(Card c:cards) {
System.out.print(c.type+c.num+",");
}
System.out.println("总共52张");
}
//进行洗牌
public void washCard() {
System.out.println("----------开始洗牌--------------");
Collections.shuffle(cards); //进行洗牌
System.out.println("----------洗牌结束-------------");
}
//创建两名玩家
public void creatPlayer() {
//键盘上输入两名玩家信息
Scanner console=new Scanner(System.in);
System.out.println("请输入第一位玩家的ID和姓名:");
System.out.println("请输入ID");
String id1=console.next();
System.out.println("请输入姓名:");
String name1=console.next();
p1=new Player(id1, name1);
players.add(p1);
System.out.println("请输入第二位玩家的ID和姓名:");
System.out.println("请输入ID");
String id2=console.next();
System.out.println("请输入姓名:");
String name2=console.next();
p2=new Player(id2, name2);
players.add(p2);
System.out.println("欢迎玩家:"+p1.name);
System.out.println("欢迎玩家:"+p2.name);
}
//进行发牌
public void distrubiteCard() {
System.out.println("---------开始发牌------------");
p1.pCards.add(cards.get(0));
System.out.println("----玩家:"+p1.name+"-拿牌------");
p2.pCards.add(cards.get(1));
System.out.println("----玩家:"+p2.name+"-拿牌------");
p1.pCards.add(cards.get(2));
System.out.println("----玩家:"+p1.name+"-拿牌------");
p2.pCards.add(cards.get(3));
System.out.println("----玩家:"+p2.name+"-拿牌------");
System.out.println("---------发牌结束------------");
}
//开始游戏
public void playGame() {
System.out.println("--------开始游戏-----------");
Collections.sort(p1.pCards); //对集合pCards进行排序
Collections.sort(p2.pCards);
p1max=p1.pCards.get(1);
p2max=p2.pCards.get(1);
System.out.println(p1.name+"最大的手牌:"+p1max.type+p1max.num); //输出玩家1的最大手牌
System.out.println(p2.name+"最大的手牌:"+p2max.type+p2max.num); //输出玩家2的最大手牌
if(p1max.rank>p2max.rank)
{ System.out.println("-----玩家"+p1.name+"获胜!-------"); }
else
{ System.out.println("-----玩家"+p2.name+"获胜!--------"); }
//输出玩家各自的手牌
System.out.println("-------玩家各自的手牌为:----------");
p1min=p1.pCards.get(0);
p2min=p2.pCards.get(0);
//打印两名玩家各自手上的两张牌
System.out.println(p1.name+":"+p1max.type+p1max.num+","+p1min.type+p1min.num);
System.out.println(p2.name+":"+p2max.type+p2max.num+","+p2min.type+p2min.num);
System.out.println("--------游戏结束-----------");
}
//主函数
public static void main(String[] args) {
CardDemo cd=new CardDemo();
cd.CreatCard(); //创建扑克牌
cd.washCard(); //洗牌
cd.creatPlayer(); //创建玩家
cd.distrubiteCard(); //进行发牌
cd.playGame(); //开始游戏
}
}
异常处理语句块并没有看到呢?
受到你的启发,写了出来。我觉得我的更好一点,而且跟视频的一样。
package pick;
public class Card implements Comparable<Card> {
String num;
String type;
int rank; //rank代表等级,值越大,等级越高
public Card(String type,String num,int rank) {
this.num=num;
this.type=type;
this.rank=rank;
}
public Card() {
}
@Override
public int compareTo(Card o) {
return this.rank-o.rank; //比较rank值的大小
}
}
package pick;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Dala {
public List<Card>pukepais;
/**
* 在构造器中初始化pukepais属性
*/
public Dala(){
this.pukepais=new ArrayList<Card>();
}
/**
* 创建扑克牌
*/
public void fapai(){
System.out.println("-----------创建扑克牌---------------");
String[] hu= {"方片","梅花","红桃","黑桃"};
String[] ku = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int o=1;
for(int i=0;i<13;i++){
for(int t = 0;t<4;t++){
Card yu=new Card(hu[t],ku[i],o);
o++;
pukepais.add(yu);
}}
}
/**
* 遍历
*/
public void bianli(){
System.out.println("-----------扑克牌创建成功---------------");
for(int p=0;p<52;p++)
System.out.print(pukepais.get(p).type+pukepais.get(p).num+","+pukepais.get(p).rank);
}
/**
* 洗牌
*/
public void xipai(){
System.out.println("-----------开始洗牌---------------");
for(int i=0;i<52;i++){
Random ra = new Random();
int t = ra.nextInt(51);
Card y = pukepais.get(i);
pukepais.remove(i);
pukepais.add(i,pukepais.get(t));
pukepais.remove(t);
pukepais.add(t,y);
}
System.out.println("-----------洗牌结束---------------");
for(int p=0;p<52;p++)
System.out.print(pukepais.get(p).type+pukepais.get(p).num+",");
}
/**
* 创建玩家
*/
public void Wanjia(){
System.out.println("-----------创建玩家---------------");
Scanner c = new Scanner(System.in);
//输入整数id
boolean is = true;
while (is) {
System.out.println("请输入第一位玩家的id:");
try {
int id = c.nextInt();
is = false;
} catch (InputMismatchException e) {
// TODO: handle exception
System.out.println("请输入整数类型的ID!");
//清空数据,使下一次可以输入
c.next();
is = true;
continue;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
break;
}
}
System.out.println("请输入第一位玩家的姓名:");
String name = c.next();
is = true;
while (is) {
System.out.println("请输入第二位玩家的id:");
try {
int id2 = c.nextInt();
is = false;
} catch (InputMismatchException e) {
// TODO: handle exception
System.out.println("请输入整数类型的ID!");
//清空数据,使下一次可以输入
c.next();
is = true;
continue;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
break;
}
}
System.out.println("请输入第二位玩家的姓名:");
String name2 = c.next();
System.out.println("欢迎玩家:"+name);
System.out.println("欢迎玩家:"+name2);
//发牌
System.out.println("-----------开始发牌--------------");
Card[] hu1 = new Card[2];
Card[] hu2 = new Card[2];
Random ra = new Random();
int x = 0;
for(int i=51;i>47;i=i-2){
int t = ra.nextInt(i);
hu1[x] = pukepais.get(t);
pukepais.remove(t);
System.out.println("---玩家:"+name+"-拿牌");
int y = ra.nextInt(i-1);
hu2[x] = pukepais.get(y);
pukepais.remove(y);
System.out.println("---玩家:"+name2+"-拿牌");
x++;
}
System.out.println("-----------发牌结束--------------");
//开始游戏
System.out.println("-----------开始游戏--------------");
Card[] ui = new Card[2];
if(hu1[0].rank>hu1[1].rank){
ui[0] = hu1[0];
System.out.println("玩家:"+name+"最大的手牌为:"+hu1[0].type+hu1[0].num);
}else{ui[0] = hu1[1];System.out.println("玩家:"+name+"最大的手牌为:"+hu1[1].type+hu1[1].num);}
if(hu2[0].rank>hu2[1].rank){
ui[1] = hu2[0];
System.out.println("玩家:"+name+"最大的手牌为:"+hu2[0].type+hu2[0].num);
}else{ui[1] = hu2[1];System.out.println("玩家:"+name2+"最大的手牌为:"+hu2[1].type+hu2[1].num);}
//获胜
if(ui[0].rank>ui[1].rank){
System.out.println("-----------玩家:"+name+"获胜!--------------");
}else{System.out.println("-----------玩家:"+name2+"获胜!--------------");}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dala mo = new Dala();
mo.fapai();
mo.bianli();
mo.xipai();
mo.Wanjia();
}
}
受到你的启发,写了出来。我觉得我的更好一点,而且跟视频的一样。
package pick;
public class Card implements Comparable<Card> {
String num;
String type;
int rank; //rank代表等级,值越大,等级越高
public Card(String type,String num,int rank) {
this.num=num;
this.type=type;
this.rank=rank;
}
public Card() {
}
@Override
public int compareTo(Card o) {
return this.rank-o.rank; //比较rank值的大小
}
}
package pick;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Dala {
/**
* 用来承装学生类型的对象
*/
public List<Card>pukepais;
/**
* 在构造器中初始化pukepais属性
*/
public Dala(){
this.pukepais=new ArrayList<Card>();
}
/**
* 创建扑克牌
*/
public void fapai(){
System.out.println("-----------创建扑克牌---------------");
String[] hu= {"方片","梅花","红桃","黑桃"};
String[] ku = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int o=1;
for(int i=0;i<13;i++){
for(int t = 0;t<4;t++){
Card yu=new Card(hu[t],ku[i],o);
o++;
pukepais.add(yu);
}}
}
/**
* 遍历
*/
public void bianli(){
System.out.println("-----------扑克牌创建成功---------------");
for(int p=0;p<52;p++)
System.out.print(pukepais.get(p).type+pukepais.get(p).num+","+pukepais.get(p).rank);
}
/**
* 洗牌
*/
public void xipai(){
System.out.println("-----------开始洗牌---------------");
for(int i=0;i<52;i++){
Random ra = new Random();
int t = ra.nextInt(51);
Card y = pukepais.get(i);
pukepais.remove(i);
pukepais.add(i,pukepais.get(t));
pukepais.remove(t);
pukepais.add(t,y);
}
System.out.println("-----------洗牌结束---------------");
for(int p=0;p<52;p++)
System.out.print(pukepais.get(p).type+pukepais.get(p).num+",");
}
/**
* 创建玩家
*/
public void Wanjia(){
System.out.println("-----------创建玩家---------------");
Scanner c = new Scanner(System.in);
//输入整数id
boolean is = true;
while (is) {
System.out.println("请输入第一位玩家的id:");
try {
int id = c.nextInt();
is = false;
} catch (InputMismatchException e) {
// TODO: handle exception
System.out.println("请输入整数类型的ID!");
//清空数据,使下一次可以输入
c.next();
is = true;
continue;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
break;
}
}
System.out.println("请输入第一位玩家的姓名:");
String name = c.next();
is = true;
while (is) {
System.out.println("请输入第二位玩家的id:");
try {
int id2 = c.nextInt();
is = false;
} catch (InputMismatchException e) {
// TODO: handle exception
System.out.println("请输入整数类型的ID!");
//清空数据,使下一次可以输入
c.next();
is = true;
continue;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
break;
}
}
System.out.println("请输入第二位玩家的姓名:");
String name2 = c.next();
System.out.println("欢迎玩家:"+name);
System.out.println("欢迎玩家:"+name2);
//发牌
System.out.println("-----------开始发牌--------------");
Card[] hu1 = new Card[2];
Card[] hu2 = new Card[2];
Random ra = new Random();
int x = 0;
for(int i=51;i>47;i=i-2){
int t = ra.nextInt(i);
hu1[x] = pukepais.get(t);
pukepais.remove(t);
System.out.println("---玩家:"+name+"-拿牌");
int y = ra.nextInt(i-1);
hu2[x] = pukepais.get(y);
pukepais.remove(y);
System.out.println("---玩家:"+name2+"-拿牌");
x++;
}
System.out.println("-----------发牌结束--------------");
//开始游戏
System.out.println("-----------开始游戏--------------");
Card[] ui = new Card[2];
if(hu1[0].rank>hu1[1].rank){
ui[0] = hu1[0];
System.out.println("玩家:"+name+"最大的手牌为:"+hu1[0].type+hu1[0].num);
}else{ui[0] = hu1[1];System.out.println("玩家:"+name+"最大的手牌为:"+hu1[1].type+hu1[1].num);}
if(hu2[0].rank>hu2[1].rank){
ui[1] = hu2[0];
System.out.println("玩家:"+name+"最大的手牌为:"+hu2[0].type+hu2[0].num);
}else{ui[1] = hu2[1];System.out.println("玩家:"+name2+"最大的手牌为:"+hu2[1].type+hu2[1].num);}
//获胜
if(ui[0].rank>ui[1].rank){
System.out.println("-----------玩家:"+name+"获胜!--------------");
}else{System.out.println("-----------玩家:"+name2+"获胜!--------------");}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Dala mo = new Dala();
mo.fapai();
mo.bianli();
mo.xipai();
mo.Wanjia();
}
}
作业的原意应该是先比较点数大小,如果点数相同,再比较花色,例如方片7是要大于黑桃2的
但如果只是给Card类加一个rank属性的话,这种通过先后比较两个属性的方法,体现不出来,所以你的compareTo方法的重写还可以改一下,用个两层的if循环把num和type先后比较一下;或者也可以继续用rank,但创建扑克牌的时候顺序换一下
rank的想法很好
我Collection.sort方法报错用不了,说不适合List这种类型
我的发牌代码和你一样,但是不知道为什么会报空指针异常
Player player1=new Player(id1,name1);和
player1=new Player(id1,name1);
有什么区别吗?
我用第二个就可以运行,第一个就报错
我想问一下,在对两人手牌自己内部排序时使用了Collection.sort方法。传入的是集合Pcards,这个集合中的单个元素包含Card的三个属性,这里为什么默认的对rank属性进行的排序?求解
rank计算为何是 i*13+j 啊?
扑克牌中的rank设置的不错,我一直不知道如何比较,对我很有帮助
66666666666666666,膜拜大佬