Java简易扑克牌游戏(慕课网作业)

===============共四个类=======================

package cardGame;
/**
 * --------------------游戏需求说明----------------------
 * 1.创建一副扑克牌,包括四种花色: 黑桃,红桃,梅花,方片, 十三种点数:2-10,J,Q,K,A,不考虑大小王.
 * 2.创建玩家,玩家至少有ID,姓名,手牌等属性,手牌为扑克牌的集合.
 * 3.洗牌,将之前创建的"一副扑克牌"打乱顺序.
 * 4.发牌, 将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张.
 * 5.比较玩家手里的卡牌
 *      规则为:取两人各自手中点数最大的牌进行比较,点数大的赢.
 *      若两人各自的点数最大的牌相等,则再按花色比较.  (黑桃>红桃>梅花>方块)   
 * */
public class Start {

    public static void main(String[] args) {
        ShuffleAllCards Shuffle = new ShuffleAllCards();
        Shuffle.CardsCreate();
        Shuffle.ShuffleCards();
        LetUsPlay began = new LetUsPlay();
        began.CreatePlayers();
        began.GiveCards();
        began.CompareCards();
    }

}
package cardGame;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ShuffleAllCards {
    //cards应该是不变的, 所以要static,要不然调用的时候创建的是新的.size为0的.
    public static List<String> cards;
    public static List<String> oldCards;
    public String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 
    public String[] color = {"方块","梅花","红桃","黑桃"};
    public ShuffleAllCards(){
        ShuffleAllCards.cards = new ArrayList<String>();
        ShuffleAllCards.oldCards = new ArrayList<String>();
    }
    /**
     * 生成所有52张牌
     * */
    public void CardsCreate(){
        System.out.println("-----------游戏开始!-----------");
        //通过遍历得到所有52张牌.
        //按照特定的顺序排序,方块A, 梅花A, 红桃A, 黑桃A, 方块2, 梅花2, 红桃2, 黑桃2, .....
        //保证0-51的牌是从小到大排序的.
        for(int i=0;i<number.length;i++){
            for (int j = 0; j < color.length; j++) {
                //第一个是方块A, 然后 梅花A, 
                String OneCard = color[j]+number[i];
                //每一次都加到List里,list是有序的.
                cards.add(OneCard);
                oldCards.add(OneCard);
            }
        }
        if(cards.size() == 52){
            System.out.println(cards);      
            System.out.println("-----------生成扑克牌成功-------");
        }
    }
    /**
     * 打乱所有52张牌的顺序
     * */
    public void ShuffleCards(){
        System.out.println("-----------开始洗牌-----------");
        Collections.shuffle(cards);
        System.out.println();
        System.out.println("-----------洗牌结束-----------");
    }
}
package cardGame;

import java.util.ArrayList;
import java.util.List;
/**
 * 玩家类,有ID/name/手牌
 * 其中手牌来着ShuffleAllCards类.
 * */
public class Players {
    public int ID;
    public String name;
    public List<String> HandCards;  

    public Players() {

    }
    //实例化属性
    public Players(int ID,String name) {
        this.ID = ID;
        this.name = name;
        //不能直接实例化List,因为set是一个接口.
        this.HandCards = new ArrayList<String>();
    }
    public Players(int ID,String name,List<String> HandCard){
        this.ID = ID;
        this.name = name;
        //不能直接实例化List,因为set是一个接口.
        this.HandCards = new ArrayList<String>();
    }   
}
package cardGame;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class LetUsPlay {
    Scanner console = new Scanner(System.in);
    //定义一个玩家List
    public List<Players> players;
    public LetUsPlay() {
        //初始化玩家List
        players = new ArrayList<Players>();             
    }

    /**
     * 创建玩家方法
     * */
    public void CreatePlayers(){
        System.out.println("-----------登记玩家信息-----------");
        System.out.println("一共有几位玩家呢?");
        int playerCounter = console.nextInt();
        for(int i=0;i<playerCounter;i++){
            try{
            //确定一共有几个玩家
                System.out.println("请输入第"+(i+1)+"位玩家ID: ");         
                int playerId = console.nextInt();
                System.out.println("请输入第"+(i+1)+"位玩家姓名: ");
                String playerName = console.next(); 
                Players player = new Players(playerId,playerName);
                players.add(player);
            }catch(InputMismatchException ex){
                System.out.println("---请输入整数类型的ID!---");
                console.next();
                i--;
                continue;
            }
        }               
    }

    /**
     * 为玩家发牌,之前扑克牌已经打乱顺序了
     * */
    public void GiveCards(){
        //共有多少个玩家,就循环多少次.比方5个玩家
        for(int i=0;i<players.size();i++){
            //先给每个玩家发第一张牌, 发的是1-5张牌
            players.get(i).HandCards.add(ShuffleAllCards.cards.get(i));
            //再发第二张牌,发的是6-10张牌,第6张牌给第1个玩家.
            players.get(i).HandCards.add(ShuffleAllCards.cards.get(i+players.size()));
        }
    }   
    /**
     * 比较玩家手里的卡牌
     * 规则为:取两人各自手中点数最大的牌进行比较,点数大的赢.
     * 若两人各自的点数最大的牌相等,则再按花色比较.
     * (黑桃>红桃>梅花>方块)   方块A, 黑桃Q, 黑桃6, 梅花3,
     * */
    public void CompareCards(){
        //先创建一个Map用来存放每个玩家手牌里较大的那一张在oldCards中的下标和对应的玩家信息.
        Map<Integer,Players> theBiggerOne = new HashMap<Integer, Players>();
        //把玩家自己手中的两张牌中大的那张放到theBiggerOne集合中
        for(int i=0;i<players.size();i++){
            //每个玩家的手里的第一张和第二张牌
            String firstCard = players.get(i).HandCards.get(0);
            String secondCard = players.get(i).HandCards.get(1);
            //集合oldCards是按大小排序的,cards是打乱顺序的,
            //玩家分配到了打乱顺序后的牌(firstCard,secondCard),如方块5,接着找到方块5在oldCards中的位置,
            int first = ShuffleAllCards.oldCards.indexOf(firstCard);
            int second = ShuffleAllCards.oldCards.indexOf(secondCard);
            //位置即代表大小, 比较位置下标即可.
            //先比较每个玩家自己手里的两张牌,把大的那张放到theBiggerOne集合中.
            if(first < second){
                theBiggerOne.put(second, players.get(i));
            }else if(first > second){
                theBiggerOne.put(first,players.get(i));
            }else if(first == second){
                System.out.println("不可能, 玩家 "+players.get(i).ID +" 的两张手牌的下标一样");
            }
        }
        //通过KeySet方法,返回Map中的所有"键"的Set集合.即所有较大卡牌的下标集合.
        Set<Integer> set = theBiggerOne.keySet(); 
        //为了比较出最大的那个下标(key值),先变成Array,
        Object[] obj = set.toArray();
        //再排序, 从大到小
        Arrays.sort(obj);
        //所有手牌中最大的那一张在oldCards中的下标
        Integer biggestCardNumber = (Integer) obj[obj.length - 1];
        //取得了某个键所对应的value值,即取得拥有最大手牌的对应的玩家对象.
        Players winner = theBiggerOne.get(biggestCardNumber);
        //根据oldCards下标取得最大的卡牌名称,如"红桃5"
        String biggestCardName = ShuffleAllCards.oldCards.get(biggestCardNumber);
        //输出游戏结果
        System.out.println("-----------结果公布!-----------");
        System.out.println(winner.ID+"号玩家 "+winner.name+" 赢得游戏,最大手牌为 "+biggestCardName);
        System.out.println("是否查看所有玩家的所有卡牌? (Y/N)");
        String YorN = console.next();
        System.out.println(YorN);
        //equals是值,==是地址.
        if(YorN.equals("Y") ){
            //遍历出所有玩家,及其所拥有的所有两张手牌
            //有多少玩家,循环多少次.
            System.out.println("所有玩家手牌如下: ");
            //getKey(theBiggerOne,players.get(i))是调用getkey方法,返回的较大手牌的下标.
            //ShuffleAllCards.oldCards.get(getKey(theBiggerOne,players.get(i))),取得下标对应的名称.
            for(int i=0;i<players.size();i++){
                System.out.println(players.get(i).ID +"号玩家 "+ players.get(i).name+"的手牌为: "+
                                    players.get(i).HandCards.get(0)+" 和 "+players.get(i).HandCards.get(1)+
                                    " 其中较大的手牌为:"+ 
                                    ShuffleAllCards.oldCards.get(getKey(theBiggerOne,players.get(i))));                 
            }               
        }else if(YorN.equals("N") ){
            System.out.println("-----------游戏结束~~-----------");
        }else{
            System.out.println("请输入Y或N");
        }
    }

    /**
     * 根据map的value获取map的key,
     * 传入整个map集合(theBiggerOne)和value值(players对象), 返回value对应的key值(较大手牌的下标)
     * (下面的方法只返回一个,返回多个的见博客:map集合根据value找key(一个key或多个key))
     * ===================================================
     * hashmap中key值是唯一的,但value是不唯一的
     * 所以是没有办法通过像get(key)取value值一样直接取key的
     * 一定要这么做的话也可以,但是要注意同一个value可能返回多个key.(这里肯定是一个)
     * */
     public static Integer getKey(Map<Integer,Players> map,Players players2){
         Integer key = 0;
         //Map,HashMap并没有实现Iteratable接口.不能用于增强for循环.
         for(Integer getKey: map.keySet()){
             if(map.get(getKey).equals(players2)){
                 key = getKey;
             }
         }
         return key;
     }
}

=================以下是错误的思路===============================

package cardGame;
/**
 * 脑洞的错误思路
 * */
public class Temp {
//  //先创建一个list用来存放每个玩家手牌里较大的那一张.
//  List<String> theBigOne = new ArrayList<String>();
//  //先比较每个玩家自己手中的两张卡牌,找出一张较大的.
//  for(int i=0;i<players.size();i++){
//      //每个玩家的手里的第一张和第二张牌
//      String firstCard = players.get(i).HandCards.get(0);
//      String SecondCard = players.get(i).HandCards.get(1);
//      //取得每个玩家两张手牌的点数
//      String FirstCardPoint = firstCard.substring(2, firstCard.length());
//      String SecondCardPoint = SecondCard.substring(2, SecondCard.length());
//      //取得每个玩家两张手牌的花色
//      String FirstCardColor = firstCard.substring(0,2);
//      String SecondCardColor = SecondCard.substring(0,2);
//      //equals比较的是值,==比较的是地址,switch方法在jdk1.6中不能传入String类型
//      //start 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
//      int FirstCardPoint1 = 0,SecondCardPoint1 = 0;
//      if(FirstCardPoint=="A" || SecondCardPoint=="A"){
//          FirstCardPoint1= 1;  SecondCardPoint1 = 1;          
//      }
//      if(FirstCardPoint=="J" || SecondCardPoint=="J"){
//          FirstCardPoint1= 11; SecondCardPoint1 = 11;         
//      }
//      if(FirstCardPoint=="Q" || SecondCardPoint=="Q"){
//          FirstCardPoint1= 12; SecondCardPoint1 = 12;             
//      }
//      if(FirstCardPoint=="K" || SecondCardPoint=="K"){
//          FirstCardPoint1= 13; SecondCardPoint1 = 13;             
//      }
//      //end 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
//      //start 把花色中的黑桃>红桃>梅花>方块 转成14,15,16,17,然后才能比较大小.
//      int FirstCardColor1 =0 ,SecondCardColor1 = 0;
//      if(FirstCardColor=="黑桃" || SecondCardColor=="黑桃"){
//          FirstCardColor1= 17;     SecondCardColor1 = 17;         
//      }
//      if(FirstCardColor=="红桃" || SecondCardColor=="红桃"){
//          FirstCardColor1= 16; SecondCardColor1 = 16;         
//      }
//      if(FirstCardColor=="梅花" || SecondCardColor=="梅花"){
//          FirstCardColor1= 15; SecondCardColor1 = 15;             
//      }
//      if(FirstCardColor=="方块" || SecondCardColor=="方块"){
//          FirstCardColor1= 14; SecondCardColor1 = 14;             
//      }
//      //end 把花色中的黑桃>红桃>梅花>方块转成14,15,16,17,然后才能比较大小.
//      //start 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.
//      if(FirstCardPoint1 > SecondCardPoint1 || Integer.parseInt(FirstCardPoint) > Integer.parseInt(SecondCardPoint)){
//          theBigOne.add(firstCard);
//      }
//      else if(FirstCardPoint1 < SecondCardPoint1 || Integer.parseInt(FirstCardPoint) < Integer.parseInt(SecondCardPoint)){
//          theBigOne.add(SecondCard);
//      }
//      else if(FirstCardPoint1 == SecondCardPoint1 || Integer.parseInt(FirstCardPoint) == Integer.parseInt(SecondCardPoint)){
//          //点数相同,比较花色
//          if(FirstCardColor1 > SecondCardColor1){
//              theBigOne.add(firstCard);
//          }
//          else if(FirstCardColor1 < SecondCardColor1){
//              theBigOne.add(SecondCard);
//          }
//          else if(FirstCardColor1 == SecondCardColor1){
//              System.out.println("不可能!两个人抽到相同的牌了");
//          }
//      }
//      //end 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.
//      
//  }
//  for (String string : theBigOne) {
//      System.out.println(string);
//  }
}
* Game 类 * 功能:整个游戏:开始游戏 -> 初始牌 -> 洗牌 -> 发牌 -> 排序 -> 比较大小 -> 游戏结果 * 游戏说明: * 1.创建一副扑克牌,不考虑大小王 * 2.创建两名玩家,玩家至少要有ID、姓名、手牌等属性,手牌为扑克牌的集合 * 3.洗牌,将之前创建的扑克牌顺序打乱 * 4.发牌,将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张 * 5.开始游戏,比大小,大小相同比花色 * * PockerCard 类 * 功能:扑克牌的核心类 包括创建角色、创建牌、显示牌、洗牌、比较牌、排序牌等 * 属性:List cards 整幅扑克牌的集合 、 People[] peoples 角色 * 方法: public PockerCard() //无参构造函数: 创建牌的集合、创建两个角色对象 * public void initializeCard() //创建整幅扑克牌 * public void showCard() //显示单支牌的花色和点数 * public void refreshCard() //洗牌 从第一支牌开始从所有牌中随机取一只与之交换 * public void addPeopleInfo() //添加玩家的基本信息 * public void dealCard() //发牌 从开始分别给A B发牌 每人两支 * public void showPeopleCard() //显示两个角色自己获得的牌 * public void sortCard() //将每个角色自己的牌按从小到大排序 * public void comparePeopleCard() //比较角色的牌 * * SingleCard类 实现Comparable接口 * 功能:产生单支牌 * 属性:ID、color、keyID数组、keyColor数组 * 方法:public SingleCard(){} //无参构造函数 * public SingleCard(String ID,String color) //有参构造函数 * @Override public int compareTo(SingleCard o) //比较当前牌与SingleCard o的牌的大小 * * People类 * 功能:产生一个角色 * 属性:ID、Name、和、存储牌的List集合。 * 方法: public People() //初始化存储牌的List集合; *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值