扑克牌游戏的核心在于:如何比较两个扑克牌的大小。利用查表法,将String[]数组的大数值下标分配给点数大的及花色大的,利用数组下标的大小来判断扑克牌的大小。下面是我重写的compare()方法。
package com.game;
import java.util.Comparator;
public class ComparatorPuke implements Comparator<Puke>
{
/**
-
重写compare()方法,实现对扑克牌大小的比较
*/
@Override
public int compare(Puke o1, Puke o2) {int x,y; x = getNum(o1); y = getNum(o2); if(x>y) //对点数进行比较 return 1; else if(x<y) return -1; else //点数相同的情况下比较花色大小 { x = getColorNum(o1); y = getColorNum(o2); if(x>y) return 1; else if(x<y) return -1; else return 0; }
}
public int getNum(Puke puke)
{
/**- 利用查表法,比较点数大小
*/
String[] c = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
int j = 0;
for(int i=0;i<c.length;i++)
{
if(puke.getID().equals(c[i]))
j = i;
}
return j;
}
public int getColorNum(Puke puke)
{
/**- 利用查表法,比较花色大小
*/
String[] c = {"方块","梅花","红桃","黑桃"};
int j = 0;
for(int i=0;i<c.length;i++)
{
if(puke.getColor().equals(c[i]))
j = i;
}
return j;
}
}
- 利用查表法,比较点数大小
耗时一天,总算是将程序完整的编写了出来,说实话,很满足。下面是主要代码,就不把几个对象类和子异常类贴出来了:
package com.game;
import java.util.*;
/**
- 功能描述:
- 1、创建一副扑克牌
- 包括四种花色:黑桃,红桃,梅花,方片
- 十三种点数:2-10,J、Q、K、A,不考虑大小王
- 2、创建两名玩家
- 玩家至少要有ID、姓名、手牌等属性,手牌为扑克牌的集合
- 3、将之前创建的“一副扑克牌”打乱顺序
- 4、发牌
- 将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张
- 5、游戏
- 比较两名玩家手中的扑克牌,规则为:取两名各自手中点数最大的牌进行比较,点数大的赢;
- 若两人各自的点数最大的牌相等,则再按花色比较
- @author fish
-
*/
public class Game
{
private List<Puke> pukes; //用于存放创建好的一副扑克牌
private Random rd = new Random();
private Scanner input = new Scanner(System.in);
private Map<Integer,Player> players;public static void main(String[] args)
{
Game game = new Game();
game.pukesCreate(); //创建一副扑克牌
game.changePuke(); //洗牌
game.playerCreate(); //创建两个玩家
game.givePuke(); //发牌
game.compareResult(); //比较大小
game.printPukes(); //打印各玩家所持有的扑克
}public Game()
{
/**- 无参构造方法,实例化List和Map,防止运行时报错(指针溢出)
*/
this.pukes = new ArrayList<Puke>();
players = new HashMap<Integer,Player>();
}
public void pukesCreate()
{
/**- 利用查表法生成扑克牌
*/
String[] c = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
Puke pk = new Puke();
for(int i=0;i<52;i++)
{
if(i<13)
pk = new Puke("方块",c[i]);
if(i>=13&&i<26)
pk = new Puke("梅花",c[i-13]);
if(i>=26&&i<39)
pk = new Puke("红桃",c[i-26]);
if(i>=39)
pk = new Puke("黑桃",c[i-39]);
pukes.add(i,pk); //将生成的扑克牌对象添加到pukes中,作为一副扑克牌
}
System.out.println("------成功创建扑克牌!------");
print();
}
public void changePuke()
{
/**- 利用List的contains()方法,随机生成各不相同的0-52间的数,
- 打乱原有pukes序列中的元素顺序
*/
List<Integer> cp = new ArrayList<Integer>(); //存放已生成的随机数
Puke pk = new Puke();
for(int i=0;i<52;i++)
{
do{
int num = rd.nextInt(52); //随机生成0-52间的数
cp.add(i,num);
pk = pukes.get(num); //得到num位上的元素
pukes.remove(num); //删除num位上的元素,防止对象元素
pukes.add(i,pk); //在i位上插入原num位上的元素
}while(cp.contains(rd)); //判断随机生成数是否已存在,防止一个位上的元素被多次调用
}
System.out.println("------洗牌完成!------");
print();
}
public void print()
{
/**- 将pukes中的内容利用foreach方法遍历输出
*/
Puke pk = new Puke();
for (Object object : pukes) {
pk = (Puke) object; //List中的元素默认为Object类型,取出时需要进行强转
System.out.print(pk.getColor()+pk.getID()+" ");
}
System.out.println();
}
public void playerCreate()
{
/**- 由用户自己输入玩家ID和玩家名,在输入时捕捉异常,如果输入ID非法,提示重新输入
- 同时检测ID是否已存在,防止玩家ID重复
*/
for(int i=0;i<2;)
{
int ID = 0;
System.out.println("请输入第"+(i+1)+"位玩家的ID和姓名:"+"\n"+"输入ID:");
try
{
ID = getId(); //获取手动输入值,可能存在异常,利用try catch语句处理
if(players.containsKey(ID)) //判断输入值是否已存在
{
System.out.println("输入的ID已存在,请重新输入!");
continue;
}
}
catch(InputException ie)
{
System.out.println("输入的ID有误,请重新输入!");
continue;
}
System.out.println("输入姓名:");
String name = input.next();
Player p = new Player(ID,name);
players.put(ID, p); //将输入的玩家存入玩家集合
i++; //完成玩家创建后,i++以创建下一个玩家
}
Set<Integer> keySet = players.keySet(); //利用keySet()方法遍历显示出Map中的元素
for (Integer integer : keySet)
{
Player player = players.get(integer);
System.out.println("------欢迎玩家:"+player.getName());
}
}
public Integer getId() throws InputException
{
/**- 输入玩家ID,同时捕捉异常后抛出异常
*/
try
{
int i = input.nextInt();
if(i>0) //ID需小于等于1,否则抛出异常
return i;
else
throw new InputException();
}
catch(InputMismatchException ie) //ID需为整型,否则抛出异常
{
throw new InputException();
}
}
public void givePuke()
{
/**- 发牌,给两位玩家分别发两张牌,存入Player对象的Pukes中
*/
Player p1 = new Player();
Player p2 = new Player();
p1 = players.get(1);
p2 = players.get(2);
System.out.println("------开始游戏!------");
for(int i=0;i<4;i++)
{
Puke p = new Puke();
switch(i) //利用switch完成扑克牌的发放
{
case 0:
p = pukes.get(i); //获得扑克牌中的第一张扑克牌
p1.getPukes().add(p); //将第一张扑克牌添加到玩家1的Pukes中
System.out.println("------玩家"+p1.getName()+"-拿牌!");
break;
case 1:
p = pukes.get(i);
p2.getPukes().add(p);
System.out.println("------玩家"+p2.getName()+"-拿牌!");
break;
case 2:
p = pukes.get(i);
p1.getPukes().add(p);
System.out.println("------玩家"+p1.getName()+"-拿牌!");
break;
case 3:
p = pukes.get(i);
p2.getPukes().add(p);
System.out.println("------玩家"+p2.getName()+"-拿牌!");
break;
}
}
System.out.println("------发牌结束!------");
}
public void printPukes()
{
/**- 利用foreach将玩家持有扑克牌的遍历输出
*/
System.out.println("玩家各自的手牌是:");
Player p1 = new Player();
p1 = players.get(1);
System.out.println(p1.getName()+":");
for (Puke puke : p1.getPukes()) {
System.out.print(puke.getColor()+puke.getID()+" ");
}
System.out.println();
p1 = players.get(2);
System.out.println(p1.getName()+":");
for (Puke puke : p1.getPukes()) {
System.out.print(puke.getColor()+puke.getID()+" ");
}
}
public void compareResult()
{
/**- 利用Collections.sort(),先比较自己所持有的牌的大小,获得自己的最大手牌,
-
再将两张最大手牌进行比较,得出优胜者
*/
System.out.println("------开始游戏!------");
List<Puke> p1 = new ArrayList<Puke>(); //存放玩家1的手牌
List<Puke> p2 = new ArrayList<Puke>(); //存放玩家2的手牌
List<Puke> p3 = new ArrayList<Puke>(); //存放玩家1的最大手牌及玩家2最大的手牌p1.addAll(players.get(1).getPukes()); //将Set型的Pukes转化为List型,方便比较
Collections.sort(p1,new ComparatorPuke());
Puke pk1 = p1.get(1); //得到玩家1最大的手牌
System.out.println("玩家"+players.get(1).getName()+"最大的手牌是:"+pk1.getColor()+pk1.getID());p2.addAll(players.get(2).getPukes());
Collections.sort(p2,new ComparatorPuke());
Puke pk2 = p2.get(1);
System.out.println("玩家"+players.get(2).getName()+"最大的手牌是:"+pk2.getColor()+pk2.getID());p3.add(pk1);
p3.add(pk2);
Collections.sort(p3,new ComparatorPuke());
Puke pk3 = p3.get(1); //得到最大手牌
if(p1.contains(pk3)) //判断最大手牌是哪个玩家的,输出玩家胜利提示
System.out.println("------玩家"+players.get(1).getName()+"获胜!------");
if(p2.contains(pk3))
System.out.println("------玩家"+players.get(2).getName()+"获胜!------");
}
- 无参构造方法,实例化List和Map,防止运行时报错(指针溢出)
}