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

Java入门第三季7-1简易扑克牌游戏 ---By AllenRp

标签:
Java

在原来题目要求的基础上,增加了人数、游戏局数的输入。写得不好,请多提意见,谢谢。

  1. Player类:
  2. Poker类
  3. Game类(main方法开始进行游戏)

运行效果:

图片描述
图片描述
图片描述

提示错误并重新输入:

图片描述
图片描述

1.Player类

  1. 定义实例变量:玩家id、玩家姓名、玩家列表、玩家手牌
  2. 定义了两个构造方法(带参和不带参)用于初始化对象;主要方法有:设置和获取玩家Id与姓名、创建玩家、获取玩家手牌、重写的equals(供contains方法调用)、重写toString方法输出打印id和姓名。
package com.imooc.game;
import java.util.*;
public class Player{
    private int playerId;//玩家id
    private String playerName;//玩家姓名
    private List<Player> playerList;//玩家列表
    private Set<Poker> playerCard;//玩家手牌
    public Player(int playerId, String playerName){//构造方法初始化变量
        playerList=new ArrayList<Player>();
        this.playerCard=new HashSet<Poker>();
    }
    public Player(){//构造方法初始化变量
        playerList=new ArrayList<Player>();
        this.playerCard=new HashSet<Poker>();
    }
    //设置玩家的ID
    public void setPlayerId(int playerId){this.playerId=playerId;}
    //设置玩家的姓名
    public void setPlayerName(String playerName){this.playerName=playerName;}
    //获取玩家姓名的方法
    public String getPlayerName(){
        return playerName;
    }
    public int getPlayerId(){//获取玩家ID的方法
        return playerId;
    }
    public List<Player> getPlayerList() {//获取玩家列表的方法
        return playerList;
    }
    //创建玩家的方法(传入玩家数量)
    public void creatNewPlayer(int NumberOfPlayer) throws Exception {
        Scanner console = new Scanner(System.in);
        Player []player=new Player[NumberOfPlayer];
        //定义一个Player数组存放对象的引用
        int id;//定义一个成员变量id
        String name;//定义一个成员变量name
        for (int i = 1; i <= NumberOfPlayer; i++) {
            boolean judge = true;
            while (judge) {
                try {
                    player[i-1] = new Player();
                    System.out.println("请输入第" + i + "个玩家的ID");
                    id = console.nextInt();
                    player[i-1].setPlayerId(id);
                    if (id > 0) {
                        if(!playerList.contains(player[i-1])){
                        boolean judge2 = true;
                        while (judge2) {
                        System.out.println("请输入第" + i + "个玩家的姓名");
                        name = console.next();
                            player[i - 1].setPlayerName(name);
                            if (!playerList.contains(player[i - 1])) {
                                playerList.add(player[i - 1]);
                                judge = false;
                                judge2 = false;
                            } else {
                                System.out.println("此姓名已存在!!");
                                continue;
                            }}}else{System.out.println("此ID已存在!!");}
                    }else{
                        System.out.println("请输入大于0的整数作为ID");
                        continue;
                    }} catch (Exception m) {
                    //m.printStackTrace();
                    System.out.println("请输入正确的ID(数字)");
                    console.nextLine();
                    continue;
                }}}
        for(Player pr:player) {
            System.out.println("欢迎玩家:" + pr);
        }
        //System.out.println(playerList);//用于显示玩家列表
    }
    public Set<Poker> getPlayerCard() {//获取玩家手牌
        return playerCard;
    }
    @Override
    public boolean equals(Object obj) {//根据需要重写equals
        if (this == obj)
            return true;
        if (this == null)
            return false;
        if (!(obj instanceof Player))
            return false;
        Player player = (Player) obj;
        if(this.getPlayerId()==player.getPlayerId())
            return true;
        if(player.getPlayerName()!=null){
            if (this.getPlayerName()!=null){
        if(this.getPlayerName().equals(player.getPlayerName()))
            return true;}}
        else
            return false;
        return false;
    }
    @Override
    public String toString() {//重写输出方法
        return "ID: "+playerId+"  姓名:"+playerName;
    }}

2. Poker类

  1. 定义实例变量:扑克牌花色、扑克牌点数、扑克牌点数数组、扑克牌花色数组、一副扑克牌List(除大小王)
  2. 定义了两个构造方法(带参和不带参)用于初始化对象;主要方法有:获取当前扑克牌列表、获取当前点数、获取当前花色、创建一副扑克牌、打印当前扑克牌列表、重写compare()方法和toString()方法。
package com.imooc.game;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Poker implements Comparator<Poker> {
    private String cardKind;//扑克牌的花色
    private String cardNumber;//扑克牌的点数
    private String baseKind="♦ ♣ ♥ ♠";//扑克牌的花色字符串
    private String baseNumber="2 3 4 5 6 7 8 9 10 J Q K A";//扑克牌点数字符串
    private  String []cardKindList=baseKind.split(" ");//扑克牌花色数组
    private  String []cardNumberList=baseNumber.split(" ");//扑克牌的点数数组
    private List<Poker> cardList;//一整个扑克牌的List(除了大小王)
    public Poker(String cardKind,String cardNumber){//有参的构造方法
        this.cardList=new ArrayList<Poker>();
        this.cardNumber=cardNumber;
        this.cardKind=cardKind;
    }
    public Poker(){//无参的构造方法
        this.cardList=new ArrayList<Poker>();
    }
    public List<Poker> getCardlist() {//获取当前扑克牌列表
        return cardList;
    }
    public String getCardNumber() {//获取当前扑克牌点数
        return cardNumber;
    }
    public String getCardKind() {//获取当前扑克牌花色
        return cardKind;
    }
    public void creatCardlist() {//创建一副扑克牌
        System.out.println("----------创建扑克牌----------");
       /*for(int i=0;cardKindList.length>i;i++){//for循环添加所有扑克牌
            for(int j=0;cardNumberList.length>j;j++){
                cardList.add(new Poker(cardKindList[i],cardNumberList[j]));
            }}*/
       for(String kind:cardKindList){//使用for each遍历花色和点数创建扑克牌
           for(String num:cardNumberList){
               this.cardList.add(new Poker(kind,num));
           }}
        System.out.println("----------创建扑克牌成功----------");
    }
    public void showCardList(){//打印当前扑克牌列表
        int i=0;
        for(Poker p:cardList) {
            i++;
            if(cardList.size()==i) {
                System.out.println(p);
            }else{
                System.out.print(p + ",");
            }
            if(i%10==0){//每10张牌换行一次
                System.out.println();
            } } }
    @Override
    public int compare(Poker o2,Poker o1) {//按照点数和花色要求重写compare方法
        String i=o1.getCardNumber();String j=o2.getCardNumber();
        String k=o1.getCardKind();String p=o2.getCardKind();
        if(baseNumber.indexOf(i)!=baseNumber.indexOf(j)){
        return baseNumber.indexOf(i)-baseNumber.indexOf(j);
        }else {
            return baseKind.indexOf(k) - baseKind.indexOf(p);
        }}
    @Override
   public String toString() {//重写,打印输出花色和点数
        return cardKind+cardNumber;
    }
    public void shuffleCards(){//定义洗牌方法
        System.out.println("-----------开始洗牌-----------");
        Collections.shuffle(cardList);
        System.out.println("-----------完成洗牌-----------");
    }}

3. Game类(main方法开始进行游戏)

package com.imooc.game;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Game {
    private static boolean jud;//定义类变量jud
    public static void main(String[]args) throws Exception {
    //通过throws方法抛出异常
        Player player=new Player();//创建Player对象
        Poker poker=new Poker();//创建Poker对象
        List<Poker>maxCard=new ArrayList<Poker>();//创建最大点数得扑克牌集合
        String winner=null;//用于存储胜者
        poker.creatCardlist();//通过poker对象调用其创建扑克牌方法
        poker.showCardList();//打印扑克牌列表
        System.out.println("-------开始游戏-------");
        Scanner input=new Scanner(System.in);
        int numberOfPlayer=0;//存储玩家人数
        jud=true;
        while (jud) {
            System.out.println("请输入进行扑克游戏的人数(最多5人参加):");
            try {numberOfPlayer= input.nextInt();
                if(numberOfPlayer>5){//限制玩家人数在5人内
                    System.out.println("请输入5以内的玩家人数!!");
                    continue;
                }else if(numberOfPlayer>1) {//限制玩家人数必须大于1
                    player.creatNewPlayer(numberOfPlayer);
                    jud = false;
                }else
                    System.out.println("请输入大于1的整数!!");
                continue;
            } catch (Exception e) {//在try语句块中捕捉类型错误异常
                System.out.println("请输入整数!!");
                input.nextLine();//用于清除上次输入剩下的输入
            }}
        poker.shuffleCards();//调用Poker类的洗牌方法
        int count=0;//储存游戏局数
        jud=true;
        while(jud){
            try{
                System.out.println("请输入即将进行几轮游戏(最多可进行5轮):");
                count=input.nextInt();
                if(count<=0){
                    System.out.println("请输入大于0的整数!!");
                    continue;
                }else if(count>5){
                    System.out.println("请输入5以内的整数!!");
                    continue;}
                    jud=false;
            }catch(Exception e){//获取异常
                System.out.println("请输入正确的游戏次数(整数)!!");
                input.nextLine();
            }}
        System.out.println("---------开始发牌---------");
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        for(int z=1;count>0; count--,z++) {
            if(z>1){
            System.out.println("请按下回车键开始下一轮游戏");
            br.readLine();}
            System.out.println("----------第"+z+"轮-----------");
            for (int i = 1; i <= 2; i++) {//每个用户抽两张扑克牌
 for (int j = 1; j <= numberOfPlayer; j++) {
 //每个玩家按顺序逐个抽取一张扑克牌
if(player.getPlayerList().get(j - 1).getPlayerCard().size()>=2)
player.getPlayerList().get(j - 1).getPlayerCard().clear();
player.getPlayerList().get(j- 1).getPlayerCard().add(poker.getCardlist().get(0));
    poker.getCardlist().remove(poker.getCardlist().get(0));
}
    if ( i== 2 ) {//当i=2时,即每个玩家都抽取了两张扑克牌
    for (Player pr : player.getPlayerList()) {
    //for each遍历并排序玩家的牌
    List <Poker>pokerList=new ArrayList<Poker>(pr.getPlayerCard());
    Collections.sort(pokerList, new Poker());//为每个玩家的手牌排序
    System.out.println(pr.getPlayerName() + "的手牌为:" + 
    pr.getPlayerCard()+",其中最大的是"+pokerList.get(0));
    maxCard.add(pokerList.get(0));//把每个玩家最大的牌添加到maxCard集合中
    Collections.sort(maxCard,new Poker());//每个玩家最大手牌的集合maxCard排序
    if(pr.getPlayerCard().contains(maxCard.get(0)))
    //遍历玩家看看最大的手牌是哪位玩家的
       winner =pr.getPlayerName();
                    }
    System.out.println("----------完成发牌----------");
    System.out.println("-----------开始游戏----------");
    System.out.println("请按回车键开始进行大小对比");
    br.readLine();
    System.out.println("最大的牌是:"+maxCard.get(0)+"获胜者为:"+winner);
    maxCard.clear();
    System.out.println("-----------本轮结束----------");
 } else {
                    continue;
                }}}
        input.close();//关闭输入
        System.out.println("-----------游戏结束----------");
    }}
点击查看更多内容
27人点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消