手记

Java第三季 简易扑克游戏 新手来报道

感觉我写的和大部分别人手记写的区别就是 可以更改 玩家数 总发牌数
还能运行

正常运行

类型异常和重复ID

更改玩家数和发牌数

下面是代码


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

/**
 * 玩家类
 * 
 * @author WuHongFei
 *
 */
public class WanJia {
    private Integer id;// 玩家ID
    private String name;// 玩家姓名
    // 玩家手牌
    public List<Integer> shouPai = new ArrayList<Integer>();

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

public class YouXi {
    /**
     * 玩家数 和 发牌数 可以更改 游戏一样可以进行
     */
    // 常量玩家数
    private final int WANJIASHU = 3;
    // 常量 总计发牌数
    private final int FAPAISHU = 12;

    private String[] dianShu = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
    private String[] huaSe = { "方片", "梅花", "红桃", "黑桃" };
    // 存储一个新的扑克集合
    private Map<Integer, String> newPuKe = new HashMap<Integer, String>();
    // 存储新扑克每张的序号
    List<Integer> xuHao = new ArrayList<Integer>();
    // 存储洗牌后的每张牌的序号
    List<Integer> newXuHao = new ArrayList<Integer>();
    // 玩家ID和 玩家对象 集合
    private Map<Integer, WanJia> mapWanJia = new HashMap<Integer, WanJia>();
    // 将完加对象单独保存在List 集合中 方便发牌是使用
    private List<WanJia> wanJiaDuiXiang = new ArrayList<WanJia>();

    /**
     * 生成新的扑克
     * 
     * @param args
     */
    public void chuangJianPuKe() {
        System.out.println("----------创建扑克----------");

        int i = 0; // 从0开始给扑克编号
        // for each 遍历花色数组
        for (String dianshu : dianShu) {
            // for each 遍历点数数组
            for (String huase : huaSe) {
                // 将点数字符串连接到花色字符串末尾 形成扑克牌字符
                String puKePai = huase.concat(dianshu);
                // 以扑克编号为键,以扑克牌字符串为 值 添加到 新扑克 集合中
                newPuKe.put(i, puKePai);
                // 将扑克编号添加到 序号集合
                xuHao.add(i);
                // 编号+1
                i++;
            }
        }
        System.out.println("---------创建扑克成功----------");
        // 将新扑克集合的 值(扑克字符) 保存为一个新的集合
        Collection<String> puke = newPuKe.values();
        // 打印 新扑克集合的值(扑克字符)
        System.out.println("为:" + puke);
    }

    /**
     * 洗牌
     * 
     * @param args
     */
    public void xiPai() {
        System.out.println("----------开始洗牌----------");
        Random random = new Random();
        // 循环结束条件 序号集合元素为null是 返回true 假如非运算符 为false 结束循环
        while (!(xuHao.isEmpty())) {
            // 生成0到序号集合长度-1的随机整形数
            int i = random.nextInt(xuHao.size());
            // 取出序号集合中 i 位置的元素 添加到新序号集合中
            newXuHao.add(xuHao.get(i));
            // 删除 i 位置上元素 序号集合的长度 也减一
            xuHao.remove(i);
        }
        System.out.println("----------洗牌结束----------");
    }

    /**
     * 创建玩家
     * 
     * @param args
     */
    public void chuangJianWanJia() {
        System.out.println("----------创建玩家----------");
        for (int i = 0; i < WANJIASHU; i++) {
            System.out.println("请输入第" + (i + 1) + "为玩家的ID和姓名");

            while (true) {
                try {
                    Scanner input = new Scanner(System.in);
                    System.out.println("------请输入ID:");
                    int id = input.nextInt();

                    // 查看玩家ID是否已经存在,存在通过判断提示已存在,不存在返回null
                    WanJia key = mapWanJia.get(id);
                    if (key == null) {
                        System.out.println("------请输入姓名:");
                        String name = input.next();
                        // 创建玩家对象,
                        WanJia wj = new WanJia();
                        wj.setId(id);
                        wj.setName(name);
                        // 将完加对象单独保存在List 集合中 方便发牌是使用
                        wanJiaDuiXiang.add(wj);
                        // 添加玩家ID和 玩家对象的键值对
                        mapWanJia.put(id, wj);
                        break;
                    } else {
                        System.out.println("****该玩家ID已经被占用!****");
                        continue;
                    }
                } catch (InputMismatchException e) {
                    System.out.println("****请输入整数型的ID!****");
                }
            }
        }

        // 遍历 玩家对象集合 打印玩家 名称
        for (WanJia wanJia : wanJiaDuiXiang) {
            System.out.println("------欢迎玩家:" + wanJia.getName());
        }
    }

    /**
     * 开始发牌
     * 
     * @param args
     */
    public void faPai() {
        System.out.println("----------开始发牌----------");
        int n = 0;// 临时变量 循环遍历玩家对象时 使用
        for (int i = 0; i < FAPAISHU; i++) {
            // 将洗牌后的序号 传递到 第n+1个 玩家对象 的 手牌集合中
            wanJiaDuiXiang.get(n).shouPai.add(newXuHao.get(i));
            // 打印 谁拿了牌
            System.out.println("------玩家:" + wanJiaDuiXiang.get(n).getName() + "-拿牌");
            // 发一张牌 n 加1
            n++;
            // 当n增加到 与玩家数相等时 初始化为 0
            if (n == WANJIASHU) {
                n = 0;
            }
        }
        System.out.println("----------发牌结束----------");
    }

    /**
     * 开始游戏
     * 
     * @param args
     */
    public void kaiShuiYouXi() {
        System.out.println("----------开始游戏----------");

        for (WanJia wj : wanJiaDuiXiang) {
            // 给玩家的手牌排序
            Collections.sort(wj.shouPai);
            // 打印玩家的最大手牌
            System.out.println("玩家:" + wj.getName() + "最大手牌为:" + newPuKe.get(wj.shouPai.get(wj.shouPai.size() - 1)));
        }
        // 临时变量 第一位玩家ID
        int wanJiaID = 0;
        // 假设第一位玩家的手牌的最大牌 是所有玩家中排数最大的
        Integer zuiDaWanJia = wanJiaDuiXiang.get(wanJiaID).shouPai.get(wanJiaDuiXiang.get(wanJiaID).shouPai.size() - 1);

        // 循环遍历 所有玩家
        for (int i = 0; i < WANJIASHU; i++) {

            // 所有玩家的最大手牌和 第一位玩家的手牌去比较 如果比第一位大 替换第一位玩家 这位玩家在和剩下的玩家比较
            if (zuiDaWanJia < wanJiaDuiXiang.get(i).shouPai.get(wanJiaDuiXiang.get(i).shouPai.size() - 1)) {
                zuiDaWanJia = wanJiaDuiXiang.get(i).shouPai.get(wanJiaDuiXiang.get(i).shouPai.size() - 1);
                // 初始假设最大玩家ID
                wanJiaID = i;
            }
        }

        // 打印哪位玩家获胜
        System.out.println("----------玩家:" + wanJiaDuiXiang.get(wanJiaID).getName() + "获胜!----------");
    }

    /**
     * 展示玩家手牌
     * 
     * @param args
     */
    public void zhanShiShouPai() {
        System.out.println("------玩家的各自手牌为:");

        for (WanJia wj : wanJiaDuiXiang) {

            System.out.print(wj.getName() + ":");

            for (Integer sp : wj.shouPai) {

                System.out.print(newPuKe.get(sp) + "  ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        YouXi yx = new YouXi();

        yx.chuangJianPuKe();
        yx.xiPai();
        yx.chuangJianWanJia();
        yx.faPai();
        yx.kaiShuiYouXi();
        yx.zhanShiShouPai();
    }

}

就是这样了 不知道还有什么问题,大家帮忙看看!

8人推荐
随时随地看视频
慕课网APP

热门评论

创建玩家 kry{}catch(){} 如果用户输入的不是Integer类型,是字母,你这程序就炸了

查看全部评论