继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java入门第三季 扑克牌游戏 自写代码

不想划水的鱼
关注TA
已关注
手记 2
粉丝 1
获赞 6

扑克牌游戏的核心在于:如何比较两个扑克牌的大小。利用查表法,将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()+"获胜!------");
      }

}

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP