ITPub博客

首页 > IT职业 > IT图书 > Java入门第三季 7-1简易扑克牌练习

Java入门第三季 7-1简易扑克牌练习

IT图书 作者:fengwei 时间:2021-09-09 09:12:28 0 删除 编辑

这是我的Java入门第三季 7-1简易扑克牌练习。
首先创建的类比较多,但是会更容易理解。除了Card及Player类以外,还创建了Host类及GetPlayers类分别代表主人及录入数据的人员,类中分别有对应的方法。在判断输入的玩家id是否与原有玩家id重复的时候尝试使用了异常的方法(虽然还不太懂)。
具体的实现难点上面:
比较牌的大小:首先给Card类一个id属性,在牌组创建的时候从小到大给每张牌一个独一无二的id(如:方块2的id为0,梅花2的id为1,,,黑桃A的id为51),只需比较id即可,这个比起人为的判断方式,先比较数字或字母再比较花色要容易很多。
洗牌操作:首先把按顺序生成的牌组拿在手上,把第一张牌放在桌子上构成初始牌堆,拿第二张牌去插入初始牌堆,有两种方式(第一张牌的上方或第一张牌的下方),只需取[0,2)中的随机整数即可,再把这两张牌作为二代牌堆,拿第三张牌去插入二代牌堆,有三种方式(上方,中间,下方),依此类推,插完所有牌之后洗牌操作就完成了。此种洗牌方法的优势:1.不需要检查随机数是否重复;2.List中的add方法其实就是插入的操作,以上操作很容易实现。

Card类(代表卡牌)

package com.imooc;
/**
 * Card类
 * 有color,value,id 三个属性及一个静态的num
 * 重写compareTo()方法
 *
 */
public class Card implements Comparable{
    //花色
    String color;
    //字符2~10,JQKA
    String value;
    //id,用于比较牌的大小,每张牌对应唯一一个id
    int id;
    //静态属性,用于自动生成id
    static int num=0;

    public Card(String color,String value) {
        this.color = color;
        this.value = value;
        //每创建一张牌num加一,相应id也加一
        this.id = num;
        num++;
    }
    //重写compareTo()方法,只需比较id即可
    @Override
    public int compareTo(Card o) {
        // TODO Auto-generated method stub
        //id需要转换为包装类才能调用compareTo()方法
        return Integer.valueOf(this.id).compareTo(Integer.valueOf(o.id));
    }   
}

Player类(代表玩家)

package com.imooc;

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

/**
 * Player玩家类
 * 有id,name,maxCard,cardsInHand属性
 * 有 getCard()拿牌,maxCard()整理得到最大牌,showCards()展示手牌方法
 * 重写了compareTo()方法
 */
public class Player implements Comparable {
    //设置一个id,避免混淆同名字的玩家
    int id;
    //姓名
    String name;
    //手牌List
    List cardsInHand = new ArrayList();
    //最大手牌
    Card maxCard;
    //构造函数
    public Player(int id,String name) {
        this.name = name;
        this.id = id;   
    }

    //重写compareTo方法,比较玩家手上最大的牌
    @Override
    public int compareTo(Player o) {

        return this.maxCard.compareTo(o.maxCard);
    }
    //拿牌的方法
    public void getCard(Card card) {
        cardsInHand.add(card);
    }
    //获取最大手牌的方法,先整理手牌,这样最大的那张牌则在手牌最末尾
    public void maxCard() {
        Collections.sort(cardsInHand);
        maxCard = cardsInHand.get(cardsInHand.size()-1);
        System.out.println("玩家"+name+"已选出最大的牌:"+maxCard.color+maxCard.value);
    }
    //展示手牌
    public void showCards() {
        System.out.println(name+"的手牌为:");
        for(Card card :cardsInHand) {
            System.out.print("["+card.color+card.value+"]  ");
        }
        System.out.println("");
    }

}

Host类(代表主人:负责拿牌,洗牌,发牌等操作)

package com.imooc;

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

/**
 * 创建一个主人类,表示主人
 * 属性:一个List包含所有的卡牌
 * 方法:获取所有牌的方法,洗牌的方法,按照一定规则发牌的方法,判断大小的方法
 */
public class Host {
    //创建一个牌组的List
    List cards = new ArrayList();

    //不用关心主人的其他属性,只要有牌,会干活就行
    public Host() {

    }
    /*
     * 功能:模拟主人拿出所有牌并展示
     * 实现方式:按顺序创建所有牌加入cards中并展示
     */
    public void getAllCards(){

        String[] values = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        String[] colors = {"方块","红心","梅花","黑桃"};
        //依次取出value和color生成卡牌card加入list中,注意卡牌生成顺序为先小后大,相应的id也是从小到大,例如:方块2的id是0
        for(String value:values) {
            for(String color:colors) {
                cards.add(new Card(color,value));
            }
        }
        //展示每张牌证明牌没有问题
        System.out.println("-----------主人拿出扑克牌并展示------------");
        for(Card card:cards) {
            System.out.print(card.color+card.value);
            //最后一张牌后面为".",其他牌后面为","
            if(card.id == 51) {
                System.out.print(".");
                continue;
            }
            //每8张牌换一行
            System.out.print(",");
            if(card.id % 8 == 7)
                System.out.println();

        }
        System.out.println("");
        System.out.println("-----------牌没有问题------------");
    }
    /**
     * 功能:模拟主人洗牌
     * 实现方式:将第一张牌拿出来,第二张牌插入第一张牌构成的牌堆,有两个位置可以选择,即第一张牌的上方或者下方,随机生成{0,1}中的随机数
     * 第三张牌插入前两张牌构成的牌堆中,有三个位置可以选择,以此类推,不用担心随机数重复的情况
     */
    public void randomCards(){
        System.out.println("-----------开始洗牌------------");
        //新建一个List用来装洗牌后的牌组
        List newCards = new ArrayList();
        //将第一张牌放在新的List中
        newCards.add(cards.get(0));
        //创建一个随机数生成器
        Random random = new Random();
        //随机生成插入码,将原牌组中编号为i的牌插入新的牌组
        for(int i=1;i players) {
        System.out.println("-----------开始发牌-----------");
        //牌组中牌顶的指针
        int indexCard = 0;
        //每人发两张牌
        for(int i=0;i players) {
        System.out.println("-----------主人判定大小-----------");
        Collections.sort(players);
        System.out.println("-----------判定完毕-----------");
        Player winner = players.get(players.size()-1);

        System.out.println("获胜者是:"+winner.name);
    }
}

GetPlayers类(代表录入信息的前台)

package com.imooc;

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

/**
 * 创建一个前台类,负责搜集玩家的资料并录入
 * 属性:玩家数n,玩家集合plays.
 * 方法:ScanName()获取名字和id的方法,判断id 是否有效的valid()方法
 */

public class GetPlayers {
    public List players = new ArrayList();
    int n;
    public GetPlayers(int n) {
        this.n = n;
    }

    //检验输入的id是否有效,当list中存在此id时抛出异常
    public void valid(int id)throws ExistIdException {

        for(Player pl:players) {
            if(id == pl.id) {
                System.out.println("-----------该id已被占用-----------");
                throw new ExistIdException();
            }       
        }
    }
    //录入玩家的姓名与id
    public void ScanName(){
        //n名玩家
        for(int i=0;i

ExistIdException类(自定义异常,目前还是空的,把GetPlayers类里面的所有ExistIdException换成Exception一样可以正常运行,功能待开发)

package com.imooc;

/**
 * 创建的自定义异常类,
 * 目前还不知道有啥用
 *
 */
public class ExistIdException extends Exception{

}

GameStart类(包含main函数)

package com.imooc;

public class GameStart {

    public static void main(String[] args) {
        //两名玩家
        int n = 2;
        //前台lily开始录入玩家信息
        GetPlayers lily = new GetPlayers(n);
        lily.ScanName();
        //主人tom开始拿牌,洗牌,发牌
        Host tom = new Host();
        tom.getAllCards();
        tom.randomCards();
        tom.distributeCards(lily.players);
        //玩家依次整理手牌,取出最大牌
        for(Player pl:lily.players){
            pl.maxCard();   
        }
        //主人tom判定结果
        tom.judge(lily.players);
        //玩家依次展示手牌
        for(Player pl:lily.players) {
            pl.showCards();
        }   
    }
}

输入正常时的界面
图片描述
输入异常时的界面
图片描述
图片描述

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2799/viewspace-2800557/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: js操作cookie
请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    90
  • 访问量
    675