为了账号安全,请及时绑定邮箱和手机立即绑定

Java入门第三季,简易扑克牌游戏

标签:
Java

Card单张扑克

package com.PlayCards;

import java.util.HashMap;
/**
 * @author SteelIU
 * @param colors:花色集合
 * @param points:点数集合
 * @param color :花色
 * @param point :点数
 * @param mapColor:存放<花色,大小>键值对
 * @param mapPoint:存放<点数,大小>键值对
 */
public class Card implements Comparable<Card>{
    static String []colors;
    static String []points;
    private String color;   
    private String point;   
    static HashMap<String,Integer> mapColor;    
    static HashMap<String,Integer> mapPoint;
    /**
     * 静态代码块(初始化colors,points,mapColor,mapPoint)
     */
    static{
        colors=new String[]{"方块","梅花","红桃","黑桃"};
        points=new String[]{"2","3","4","5","6","7","8","9",
                "10","J","Q","K","A"};
        mapColor=new HashMap<String,Integer>();
        mapPoint=new HashMap<String,Integer>();
        for(int i=0;i<colors.length;i++){
            Integer integer=i;
            mapColor.put(colors[i],integer );
        }
        for(int i=0;i<points.length;i++){
            Integer integer=i;
            mapPoint.put(points[i],integer );
        }
    }
    /**
     * @param i:colors的下标
     * @param j:points的下标
     */
    Card(int i,int j){
        color=colors[i];
        point=points[j];
    }

    public String toString(){
        return "["+this.color+""+this.point+"]";
    }
    @Override
    public int compareTo(Card o) {
        //thisPoint当前Card点数的大小,oPoint是比较对象的点数的大小
        int thisPoint=(Integer) mapPoint.get(this.point);
        int oPoint=(Integer) mapPoint.get(o.point);
        if(thisPoint!=oPoint){
            return thisPoint-oPoint;
        }else{
            //执行到该步即点数相同,开始比较花色
            //thisColor当前Card花色大小,oColor比较对象的花色大小
            int thisColor=(Integer) mapColor.get(this.color);
            int oColor=(Integer) mapColor.get(o.color);
            return thisColor-oColor;
        }
    }
}

Cards一副扑克牌

package com.PlayCards;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
/**
 * @author SteelIU
 * @param listCard:52张扑克牌集合
 */
public class Cards {
    List<Card>listCard;
    Card card;
    /**/
    Cards(){
        listCard=new ArrayList<Card>();
        for(int i=0;i<Card.colors.length;i++){
            for(int j=0;j<Card.points.length;j++){
                card=new Card(i,j);
                listCard.add(card);
        }}
    }
    /**
     * XXX洗牌算法,只要將牌添加到set集合即可?XXX这是错误的
     * 因为HashSet是根据hash算法排序的,一次洗牌看似是无序的,
     * 但是多次洗牌就发现牌的hash排序规律。影响了该游戏的公平性
     * HashSet的无序只是没有有序的下标访问,但是hash值是固定的。
     * 所以不能直接hashset.addAll(List)洗牌算法
     */
    void shuffle(){
        //此处利用了HashSet不重复性
        HashSet<Integer>hashSet=new HashSet<Integer>();
        ArrayList<Card>alist=new ArrayList<Card>();
        Random random=new Random();
        do{
            Integer i=random.nextInt(listCard.size());//随机生成0-size-1
            if(!hashSet.contains(i)){//不重复下标
                hashSet.add(i);
                alist.add(listCard.get(i));
            }
        }while(alist.size()<listCard.size());
        listCard=alist;
    }
}

Gamer单个玩家

package com.PlayCards;

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

public class Gamer {
    Integer ID;
    String name;
    List<Card>handsCards=new ArrayList<Card>();
    Card maxCard;
    Gamer(int id,String name){
        this.ID=id;
        this.name=name;
    }
    /**玩家拿牌*/
    public void setHandsCards(Card card) {
        System.out.println("玩家:"+name+"--拿牌");
        handsCards.add(card);
    }
    /**控制台输出玩家最大手牌*/
    public void setMaxCard(){
        Collections.sort(handsCards);
        maxCard=handsCards.get(handsCards.size()-1);
        System.out.println("玩家:"+name+"最大手牌为:"+maxCard);
    }

    public String toString(){
        String str=name+":"+handsCards.toString();
        return str; 
    }
}

Gamers 玩家集合

package com.PlayCards;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
/**
 * @author SteelIU
 * @param gamerList:玩家集合
 * @param list:玩家集合中的ID集合
 */
public class Gamers {
    List<Gamer>gamerList=new ArrayList<Gamer>();
    List<Integer>list=new ArrayList<Integer>();
    Gamers(int num){
        gamerList=createGamers(num);
    }
    /**控制台输出玩家所有手牌*/
    public String toString(){
        String str="";
        for (Gamer gamer : gamerList) {
            str+=gamer.toString()+"\n";
        }
        return str;
    }
    /**
     * @param num:传入玩家的个数
     * @return gamerList:返回玩家集合
     */
    public  List<Gamer> createGamers(int num){
        for(int i=1;i<=num;i++){
            boolean flag;
            do{ 
                flag=true;
                System.out.println("请输入第"+i+"位玩家的ID和姓名:");
                System.out.println("输入ID:");
                try {
                    Scanner scan=new Scanner(System.in);//将这一句放在do{}while外面,将会造成没法输入的死循环
                    Integer id=scan.nextInt();
                    if(id<=0){
                        System.out.println("输入的ID不能是负数,请重新输入");
                        continue;
                    }
                    if(list.contains(id)){
                        System.out.println("输入的ID已存在,请重新输入");
                    }else{
                        flag=false;
                        list.add(id);  //将合法的ID存入ID序列中
                        System.out.println("输入姓名:");
                        String name=scan.next();
                        gamerList.add(new Gamer(id,name));
                    }       
                }catch (InputMismatchException e){
                    System.out.println("输入的ID是非法字符");
                }
            }while(flag);       
        }
        for (Gamer gamer: gamerList) {
            System.out.println("----欢迎玩家:"+gamer.name);
        }
        return gamerList;
    }   
}

Factory 工厂类,封装了Cards和Gamers的关联的行为

package com.PlayCards;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * <p>Description: 整合了发牌游戏,关联玩家和扑克牌的行为,瘦身入口程序TestGame</p>
 * @author SteelIU
 */
public class Factory {
    Cards cards;
    Gamers gamers;
    Factory(Cards cards,Gamers gamers){
        this.cards=cards;
        this.gamers=gamers;
    }
    /**开始发牌,循环发给每个玩家,循环time次,每个玩家手牌有time个*/
    public void deal(int time){
        Iterator<Card>iter=cards.listCard.iterator();
        for(int i=1;i<=time;i++){
            for (Gamer gamer: gamers.gamerList) {
                gamer.setHandsCards(iter.next());
            }
        }
        System.out.println("-----------发牌结束-----------");
    }
    /**控制台显示每个玩家的最大手牌*/
    public void showMaxCards(){
        for (Gamer gamer : gamers.gamerList) {
            gamer.setMaxCard();
        }
    }
    /**所有玩家的手牌进行比较,输出赢家*/
    public void compareCard(){
        Map<Card,Gamer>map=new HashMap<Card,Gamer>();//<最大手牌-玩家>键值对
        List<Card>maxCards=new ArrayList<Card>();//玩家最大手牌序列
        for (Gamer gamer : gamers.gamerList) {
            maxCards.add(gamer.maxCard);
            map.put(gamer.maxCard, gamer);
        }
        Collections.sort(maxCards);
        Card key=maxCards.get(maxCards.size()-1);
        Gamer winner=map.get(key);
        System.out.println("----------玩家:"+winner.name+"获胜----------");
    }
}

程序的入口

package com.PlayCards;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestGame {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*1.创建一副有序的扑克牌*/
        System.out.println("-----------创建扑克牌------------");
        Cards cards=new Cards();
        System.out.println("-----------扑克牌创建成功------------");
        System.out.println(cards.listCard);
        System.out.println("-----------开始洗牌------------");
        cards.shuffle();
        System.out.println("-----------洗牌结束!------------");
        System.out.println("-----------创建玩家……------------");
        Gamers gamers=new Gamers(2);
        Factory factory=new Factory(cards,gamers);
        System.out.println("-----------开始发牌------------");
        factory.deal(2);
        factory.showMaxCards();
        factory.compareCard();
        System.out.println(gamers.toString());
    }
}
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消