Poker类用于存放扑克牌,重写了equals方法。
//Poker类用于存放扑克牌,重写了equals方法。
public class Poker {
String huaSe;
String dianShu;
public Poker(String huaSe,String dianShu){
this.huaSe=huaSe;
this.dianShu=dianShu;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dianShu == null) ? 0 : dianShu.hashCode());
result = prime * result + ((huaSe == null) ? 0 : huaSe.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Poker))
return false;
Poker other = (Poker) obj;
if (dianShu == null) {
if (other.dianShu != null)
return false;
} else if (!dianShu.equals(other.dianShu))
return false;
if (huaSe == null) {
if (other.huaSe != null)
return false;
} else if (!huaSe.equals(other.huaSe))
return false;
return true;
}
}
Player1类,用于存放玩家1的信息,重写了equals方法,有一个Poker泛型的集合。
//Player1类,用于存放玩家1的信息,重写了equals方法,有一个Poker泛型的集合。
public class Player1 {
Integer id;
String name;
List<Poker> player1List;
public Player1(Integer id,String name){
this.id = id;
this.name = name;
player1List = new ArrayList<Poker>();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Player1))
return false;
Player1 other = (Player1) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Player2类,用于存放玩家2的信息,有一个Poker泛型的集合存放手牌。
//Player2类,用于存放玩家2的信息,有一个Poker泛型的集合存放手牌。
public class Player2 {
Integer id;
String name;
List<Poker> player2List;
public Player2(Integer id,String name){
this.id = id;
this.name = name;
player2List = new ArrayList<Poker>();
}
}
下面的是main方法所在的Gmae类。所有方法以及主程序都在这里,有一点要说的是,“public class Game{” 后面应该还有个 “}” 我没有放出来,表示我这个类并没有写完,里面还有很多东西以及方法块。最后这个大括号应该放在主函数后面。
//初始化一个集合,储存扑克牌。
public class Game {
//定义一个扑克牌的集合
List<Poker>pokerList;
//定义Player1和Player2类型的变量,(PS:这种用法在课程6-8中有提及)
Player1 player1;
Player2 player2;
public Game(){
pokerList = new ArrayList<Poker>();
}
下面是创建扑克牌并洗牌的方法。
//创建扑克牌并初始化。
public void initialPork(){
String[] hs ={"黑桃","红心","梅花","方片"};
String[] ds ={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//让每种花色和每个点数分别配对组成52副不同的扑克牌。
for(int i = 0;i<hs.length;i++){//外层循环遍历花色。
for(int j = 0;j<ds.length;j++){//内层循环遍历点数
Poker pk =new Poker(hs[i],ds[j]);
pokerList.add(pk);//将每一张扑克牌加入扑克牌集合。
}
}
System.out.println("-----------扑克牌创建成功----------");
System.out.println("除了大小王一共有"+pokerList.size()+"张扑克牌分别是:");
for(Poker pk:pokerList){//这里用foreach遍历输出所有扑克牌。
System.out.print(pk.huaSe+pk.dianShu+" ");
}
//用shuffle方法洗牌。
Collections.shuffle(pokerList);
System.out.println("***********洗牌完毕***********");
}
创建玩家1的方法块
//创建玩家1的方法块
public void initialPlayer1() {
System.out.println("请输入第一位玩家的id:");
try {//try—catch块用来捕获用户输入ID不是Integer类型的异常
Scanner input = new Scanner(System.in);
Integer id = input.nextInt();
System.out.println("请输入第一位玩家的姓名:");
String name = input.next();
player1 = new Player1(id,name);
} catch (Exception e) {//在catch中处理异常
// TODO: handle exception
System.out.println("输入有误!");
initialPlayer1();
}
}
创建玩家二的方法块
//创建玩家二的方法块
public void initialPlayer2() {
try {//用Try—catch捕获用户输入的异常,同玩家1
Scanner input;
Integer id;
do {//这个do—while循环是为了避免玩家2的id与玩家1相同
System.out.println("请输入第二位玩家的id:");
input = new Scanner(System.in);
id = input.nextInt();
} while (player1.id.equals(id));
String name;
do {//同理为了避免玩家2的name与玩家1的相同
System.out.println("请输入第二位玩家的姓名:");
name = input.next();
} while (player1.name.equals(name));
player2 = new Player2(id,name);
} catch (Exception e) {
// TODO: handle exception
System.out.println("输入有误!");
initialPlayer1();
}
}
下面是比较大小的方法块。
public Poker compare(Poker o1,Poker o2){
//定义一个比较规则,用indexOf方法实现比较大小。
String s1 = "23456789'10'JQKA";
String s2 = "'方片''梅花''红心''黑桃'";
//第一个元素与第二个元素的点数比较。返回大的那个
if(s1.indexOf(o1.dianShu)!=s1.indexOf(o2.dianShu)){
if(s1.indexOf(o1.dianShu)>s1.indexOf(o2.dianShu)){
return o1;
}else{return o2;}
//第一个元素与第二个元素花色的比较。 返回大的那个元素
}else if(s2.indexOf(o1.huaSe)!=s2.indexOf(o2.huaSe)){
if(s2.indexOf(o1.huaSe)>s2.indexOf(o2.huaSe)){
return o1;
}else{return o2;}
//花色和点数都相等那么两张牌大小就相等。
}else{return o1;}
}
游戏的主体逻辑在这个方法里。
public void startGame(){
System.out.println("----------------开始发牌--------------");
System.out.println("-----玩家"+player1.name+"拿牌");
player1.player1List.add(pokerList.get(0));
System.out.println("-----玩家"+player2.name+"拿牌");
player2.player2List.add(pokerList.get(1));
System.out.println("-----玩家"+player1.name+"拿牌");
player1.player1List.add(pokerList.get(2));
System.out.println("-----玩家"+player2.name+"拿牌");
player2.player2List.add(pokerList.get(3));
System.out.println("----------------发牌结束--------------");
System.out.println("----------------StartGame-----------");
//定义Poker类型的变量来接受玩家1和玩家2中最大的扑克。
Poker max1 = null;
Poker max2 = null;
//Max中存放总的最大的扑克
Poker Max = null;
//调用compare方法比较出玩家1中最大的手牌。
max1 = compare(player1.player1List.get(0),player1.player1List.get(1)) ;
System.out.println("-----玩家:"+player1.name+"最大的手牌为:"+max1.huaSe+max1.dianShu);
max2 = compare(player2.player2List.get(0),player2.player2List.get(1));
System.out.println("-----玩家:"+player2.name+"最大的手牌为:"+max2.huaSe+max2.dianShu);
//比较出玩家1与玩家二总的最大的牌放入Max中。
Max = compare(max1,max2);
//判断输赢并输出。
if(!(max1.equals(max2))){
if(Max.equals(max1)){
System.out.println("--------------玩家:"+player1.name+"获胜!!-----------------");
}else{
System.out.println("--------------玩家:"+player2.name+"获胜!!-----------------");
}
}else {System.out.println("--------------玩家:"+player1.name+"和玩家:"+player2.name+"平局!------------------");}
System.out.println(player1.name+":"+player1.player1List.get(0).huaSe+player1.player1List.get(0).dianShu+","+player1.player1List.get(1).huaSe+player1.player1List.get(1).dianShu);
System.out.println(player2.name+":"+player2.player2List.get(0).huaSe+player2.player2List.get(0).dianShu+","+player2.player2List.get(1).huaSe+player2.player2List.get(1).dianShu);
}
main方法直接调用方法块就行了。
public static void main(String[] args) {
// TODO Auto-generated method stub
Game game = new Game();
game.initialPork();
game.initialPlayer1();
game.initialPlayer2();
game.sys();
game.startGame();
System.out.println("***************GameOver!******************");
}
最后这个sys方法块,在主函数里我也调用了,其实这个方法并没有太大的作用, 我只是为了追求输出格式跟老师一模一样 -。-
public void sys(){
System.out.println("------欢迎玩家"+player1.name);
System.out.println("------欢迎玩家"+player2.name);
}
下面是运行结果: