感觉我写的和大部分别人手记写的区别就是 可以更改 玩家数 总发牌数
还能运行
正常运行
类型异常和重复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();
}
}
就是这样了 不知道还有什么问题,大家帮忙看看!
热门评论
创建玩家 kry{}catch(){} 如果用户输入的不是Integer类型,是字母,你这程序就炸了