首页 > IT职业 > IT职场 > 扑克牌小程序,自己瞎写的。新手一枚,请多多指点!!
/*
玩家类:因为类中定义的属性都为private,所有都定义相应的获取方法
*/
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class Player {
private int id; //玩家ID
private String name; //玩家姓名
private List pokers; //存放玩家手中的牌的容器
//调用构造方法,初始化
public Player(int id, String name) {
this.id = id;
this.name = name;
this.pokers = new ArrayList();
}
//获取玩家ID的方法
public int getId() {
return id;
}
//获取玩家姓名的方法
public String getName() {
return name;
}
//获取存放玩家手里的牌的容器的方法
public List getPokers() {
return pokers;
}
//重写hashCode()方法,自己随便写的,能用
@Override
public int hashCode() {
return id * name.hashCode();
}
//重写equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Player))
return false;
Player other = (Player) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//获取玩家手中最大的牌的方法
public Poker getMaxPokers() {
Collections.sort(pokers); //先排序,由于重写了Poker类中compareTo()方法,下标为0的为最大值
return pokers.get(0); //返回最大值
}
}
/*
扑克牌类,
因为扑克牌是从2到A,有数字和字母,没想到能直接排序的方法
所以就定义了两个int类型的属性:pointsID和colourID;
pointsID 表示的数字为 0-12,对应扑克牌的,2-A
colourID 根据不同的花色赋不同的数字,如:方片:1, 梅花:2, 红桃:3, 黑桃:4
通过比较pointsID和colourID的大小来实现扑克牌的大小
*/
//该实现了Comparable接口
public class Poker implements Comparable {
private int pointsID; //与牌的点数对应的数字
private int colourID; //与牌的花色对应的数字
private String points; //牌的点数
private String colour; //牌的花色
//构造方法
public Poker(int pointsID, int colourID, String points, String colour) {
this.pointsID = pointsID;
this.colourID = colourID;
this.points = points;
this.colour = colour;
}
//获取与点数对应的数字
public int getpointsID() {
return pointsID;
}
//获取与花色对应的数字
public int getcolourID() {
return colourID;
}
//重写toString()方法,输出 花色+点数
public String toString() {
return colour + points;
}
//重写Comparable类中compareTo()方法
@Override
public int compareTo(Poker p) {
if (this.pointsID == p.pointsID) //如果点数一样,则比较花色
return p.colourID - this.colourID; //这样定是降序排序,反着写就是升序排序,如:this.colourID - p.colourID;
else
return p.pointsID - this.pointsID; //比较花色,降序排序,也就是说容器中最大的下标为0
}
//下面的方法都没有用上
/* public String getPoints() {
return points;
}
public String getColour() {
return colour;
}
@Override
public int hashCode() {
return pointsID + colourID + new String(points + colour).hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null)
return false;
if (!(o instanceof Poker))
return false;
Poker p = (Poker) o;
if (this.points == null) {
if (p.points != null)
return false;
} else {
if (!(this.points.equals(p.points)))
return false;
}
if (this.colour == null) {
if (p.colour != null)
return false;
} else {
if (!(this.colour.equals(p.colour)))
return false;
}
return true;
} */
}
/*
启动类
*/
import java.util.Map;
import java.util.HashMap;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Set;
class PlayerPoker {
private List sumLsit; //用来存放所有发出去的牌,主要是为了统计发出去最大的牌是哪张
private Map players; //用来存放玩家
private List pokerList; //用来存放创建的牌
private Scanner input;
// 利用构造方法初始化属性
public PlayerPoker() {
this.players = new HashMap();
this.pokerList = new ArrayList();
this.input = new Scanner(System.in);
this.sumLsit = new ArrayList();
}
//启动方法,个人习惯问题,main()方法中不喜欢写太多东西,所以都写这里了
public void launch() {
createPoker(); //创建扑克牌
randomPoker(); //洗牌
creatPlayer(); //创建玩家
dealPoker(); // 发牌
comparePoker(); //统计
}
//创建扑克牌
public void createPoker() {
System.out.println("-------------创建扑克牌...--------------");
String[] s = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; //定义一个字符串数组
int i = 0; //这里采用的是while循环
int j = 0;
while (i keySet = players.keySet(); //调用HashMap中的keySet()方法,获取HashMap容器中所有的键的集合
for (Integer id : keySet) {
System.out.println("----欢迎玩家:" + players.get(id).getName());
}
}
// 发牌
public void dealPoker() {
System.out.println("-------------开始发牌...--------------");
Set keySet = players.keySet(); ////调用HashMap中的keySet()方法,获取HashMap容器中所有的键的集合
int i = 0; //i作为从pokerList容器中发牌的下标 从0开始
int j = 0; //j表示要发多少轮,可以随便修改,但不要超过pokerList中的容量,即:玩家数量*发牌轮数 不能大于51(0-51),否则报下标越界异常
while (j keySet = players.keySet();//调用HashMap中的keySet()方法,获取HashMap容器中所有的键的集合
for (Integer id : keySet) { //调用玩家类Player中的getMaxPokers()方法获取该玩家手中最大的牌
System.out.println("玩家:" + players.get(id).getName() + "最大的手牌为:"
+ players.get(id).getMaxPokers());
//sumLsit.get(0)为所有玩家最大的牌,通过它与每一位玩家手中最大的牌进行比较,如果是同一张,则返回该玩家的名字
if (sumLsit.get(0).equals(players.get(id).getMaxPokers())) {
winPlayer = players.get(id).getName(); //将该玩家的名字赋给前面定义好的变量
}
}
System.out.println("-------------玩家:" + winPlayer + "获胜!--------------");
System.out.println("玩家各自的手牌为:");
for (Integer id : keySet) { //循环输出每个玩家手中所有的牌
System.out.print(players.get(id).getName() + ":"); //输出玩家姓名
System.out.println(players.get(id).getPokers()); //输出玩家手牌
}
}
// 对从键盘输入的信息进行处理
public int input() {
while (true) {
System.out.println("输入ID:");
int k;
try {
k = input.nextInt();
return k; //如果输入为int类型,则返回输入的值
} catch (Exception e) {
System.out.println("请输入整数类型的ID!"); //如果输入不是int类型,重新输入
input = new Scanner(System.in);
}
}
}
}
// 启动类
public class TestPoker {
public static void main(String[] args) {
new PlayerPoker().launch(); //调用启动方法
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2557/viewspace-2807763/ ,如需转载,请注明出处,否则将追究法律责任。