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

Java入门第三季7.1简易扑克牌编码

say意
关注TA
已关注
手记 6
粉丝 41
获赞 366

所有的代码放在一个文件里就可以运行,文件名是:入口类名.java
卡牌的比较是通过将点数和花色放在不同的数组里,然后利用数组下标来比较大小
洗牌是通过不断将第一个位置的卡牌插入随机位置来实现的
用户的ID设定必须是数字且不能相同
下边是代码,注释还是很完备的,有问题留言,我们一起交流一下
PS:我再也不发原创了,太麻烦了T_T
入口类

import java.util.*;
public class PalyCard 
{
    public static void main(String[] args) 
    {
        Game gm=new Game();
        gm.setCards();//获取卡牌
        gm.shuffle();//洗牌
        gm.setPlayers();//获取用户
        gm.dealCards();//发牌
        gm.playCards();//开始游戏
        gm.showCards();//展示卡牌
    }
}

游戏主体

class Game
{
    private List<Card> cards;
    private List<Player> players;
    Game(){
        cards=new ArrayList<Card>();
        players=new ArrayList<Player>();
    }
    //初始化卡牌
    void setCards(){
        System.out.println("-----------创建扑克牌--------------");
        String[] suits={"黑桃","红桃","梅花","方片"};//花色
        String[] numbers={"2","3","4","5","6","7","8","9","10",
            "J","Q","K","A"};//点数
        for(int i=0;i<suits.length;i++){
            for(int j=0;j<numbers.length;j++){
                cards.add(new Card(suits[i],numbers[j]));
            }
        }
        System.out.println("-----------扑克牌创建成功!--------------");
        System.out.println(cards);
    }
    //洗牌,第一个对象插入随机位置
    void shuffle(){
        System.out.println("-----------开始洗牌!--------------");
        Random random=new Random();
        for(int i=0;i<cards.size();i++){//洗牌次数我随便设的,没有科学依据
            Card c=cards.get(0);//获取第一个元素
            cards.add(random.nextInt(cards.size()),c);//将第一个元素再次添加在任意位置
            cards.remove(0);//移除第一个元素
        }
        System.out.println("-----------洗牌结束!--------------");
        //System.out.println(cards);
    }
    //初始化玩家2人
    void setPlayers(){
        Scanner in=new Scanner(System.in);
        int i=1;
        do{
            System.out.println("请输入第"+i+"位玩家的ID和姓名:");
            while(true){
                try{
                    System.out.println("请输入ID:");
                    int id=in.nextInt();
                    if(players.contains(new Player(id+"",null)))
                        throw new Exception();//ID已存在,抛出异常
                    System.out.println("请输入玩家姓名:");
                    String name=in.next();
                    players.add(new Player(id+"",name));
                    break;//新建信息成功,跳出循环
                }catch(InputMismatchException e){
                    in=new Scanner(System.in);//这个必须有,不然就是死循环了
                    System.out.println("请输入整数类型的ID!");
                }catch(Exception e){
                    System.out.println("该ID已存在,请重新输入!");
                }
            }
            i++;
        }while(i<3);

        for(int j=0;j<players.size();j++){
            System.out.println("---欢迎玩家:"+players.get(j).name);
        }
    }
    //发牌
    void dealCards(){
        System.out.println("-----------开始发牌!--------------");
        for(int i=0;i<2;i++){//每人发牌数i
            for(int j=0;j<players.size();j++){//玩家数j
                System.out.println("---玩家"+players.get(j).name+"-拿牌");
                players.get(j).setCards(cards.get(0));
                cards.remove(0);
            }
        }
        System.out.println("-----------发牌结束!--------------");
    }
    //比较卡牌大小
    void playCards(){
        System.out.println("-----------游戏开始!--------------");
        for(int i=0;i<players.size();i++){
            Collections.sort(players.get(i).cards);
            System.out.println("玩家:"+players.get(i).name+"最大的手牌为"+players.get(i).cards.get(1));
        }
        int judge=players.get(0).cards.get(1).compareTo(players.get(1).cards.get(1));
        String name=judge>0 ? players.get(0).name:players.get(1).name;//条件语句,相当于if...else
        System.out.println("-----------玩家:"+name+"获胜!--------------");
    }
    //展示手牌
    void showCards(){
        System.out.println("-----------玩家手牌展示--------------");
        System.out.println(players.get(0)+""+players.get(0).cards);
        System.out.println(players.get(1)+""+players.get(1).cards);
    }
}

用户类

//用户类,为了防止ID重复,重写了equals,这样可以调用contains判断
class Player
{
    public String id;
    public String name;
    public List<Card> cards;
    Player(String id, String name){
        this.id=id;
        this.name=name;
        cards=new ArrayList<Card>();
    }
    void setCards(Card c){
        cards.add(c);
    }
    //重写toString只是为了写程序的时候测试用着方便
    public String toString(){
        return "Name:"+name;
    }
    public boolean equals(Object o){
        if(this==o)return true;
        if(o==null)return false;
        if(!(o instanceof Player))return false;
        Player p=(Player)o;
        return Objects.equals(id,p.id);
    }
}

卡牌类

//要比较卡牌的大小,所以要添加比较方法
class Card implements Comparable<Card>
{
    public String suit;//花色
    public String number;//点数
    Card(String suit, String number){
        this.suit=suit;
        this.number=number;
    }
    //展示卡牌信息用
    public String toString(){
        return suit+number;
    }
    //实现比较方法
    public int compareTo(Card c){
        if(this.getNumberNum()==c.getNumberNum())
            return this.getSuitNum()-c.getSuitNum();
        else return this.getNumberNum()-c.getNumberNum();
    }
    //获取点数排序
    int getNumberNum(){
        String[] numbers={"2","3","4","5","6","7","8","9","10",
            "J","Q","K","A"};
        for(int i=0;i<numbers.length;i++){
            if(numbers[i].equals(number))return i;
        }
        return -1;
    }
    //获取花色排序
    int getSuitNum(){
        String[] suits={"黑桃","红桃","梅花","方片"};
        for(int i=0;i<suits.length;i++){
            if(suits[i].equals(suit))return i;
        }
        return -1;
    }
}
打开App,阅读手记
31人推荐
发表评论
随时随地看视频慕课网APP

热门评论

非常感谢,很有启发!

非常感谢,很有启发!

代码中创建两个玩家那里,有两个catch块,为什么第一个catch块中需要重新new一个Scanner对象,而第二个中不需要?

查看全部评论