我自己转了下可以用,但是很奇怪Poker.java文件的ArrayList我存的时候是Poker,但是取出来却是Object需要转换。
Poker.java
package kasei;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
public class Poker implements Comparable<Poker> {
public int suit;
public int number;
public static Map<Integer, String> suits = new HashMap<Integer, String>() {
{
put(1, "方片");
put(2, "梅花");
put(3, "紅心");
put(4, "黑桃");
}
};
public static Map<Integer, String> numbers = new HashMap<Integer, String>() {
{
put(2, "2");
put(3, "3");
put(4, "4");
put(5, "5");
put(6, "6");
put(7, "7");
put(8, "8");
put(9, "9");
put(10, "10");
put(11, "J");
put(12, "Q");
put(13, "K");
put(14, "A");
}
};
public Poker() {
}
public Poker(int suit, int number) {
this.suit = suit;
this.number = number;
}
public static String getPokersList(List pokers){
String print = "[";
for (Object obj : pokers) {
Poker poker = (Poker) obj;
print += poker.getName() + ", ";
}
// 删除最后一项逗号和空格,替换为]
print = print.replaceAll(", $", "]");
return print;
}
public String getName() {
return suits.get(suit) + numbers.get(number);
}
public int getSize() {
return this.number * 10 + this.suit;
}
/**
* 降序需要-1 t>o
*/
public int compareTo(Poker o) {
if (this.getSize() > o.getSize()) {
return -1;
} else {
return 1;
}
}
}Initail.java
package kasei;
/**
* 扑克牌游戏
* 1. 创建扑克牌
* 1.1 四个花色黑桃、红桃、梅花、方片
* 1.2 十三种点数2-10, J, Q, K, A
* 2. 两名玩家
* 2.1 要有ID、姓名、手牌(扑克牌集合)
* 2.2 手牌2张
* 3. 洗牌
* 3.1 打乱之前扑克牌顺序
* 4. 发牌
* 4.1 从第一张开始,一人一张发给每个玩家
* 4.2 每人发两张
* 5. 比大小
* 5.1 取玩家手牌中最大一张进行比较
* 5.2 先比点数,点数相同则比花色
*/
/**
* UML
* 1. Game
* pokers
* players
* playerNum
* suits
* initPokers()
* randomPokers()
* putPoker()
* startGame()
* 2. Poker
* suit
* number
* compareTo()
* 3. Player
* id
* name
* hand
*/
public class Initail {
public static void main(String[] args) {
Game g = new Game();
g.startGame();
}
}Game.java
package kasei;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.InputMismatchException;
public class Game {
public Scanner console = new Scanner(System.in);
public List<Poker> pokers;
public List<Player> players;
public int playerNum = 2;
public int playerHandNum = 3;
public Game() {
this.pokers = new ArrayList<Poker>();
this.players = new ArrayList<Player>();
}
/**
* 初始化扑克牌
*/
public void initPokers() {
for (Integer suit : Poker.suits.keySet()) {
for (Integer number : Poker.numbers.keySet()) {
Poker poker = new Poker(suit, number);
pokers.add(poker);
}
}
}
public static String getType(Object o) { //获取变量类型方法
return o.getClass().toString(); //使用int类型的getClass()方法
}
/**
* 打乱扑克牌
*/
public void randomPokers() {
Collections.shuffle(this.pokers);
}
/**
* 将牌库第一张牌 派发给指定玩家
*/
public void putPoker(int index) {
Poker poker = pokers.get(0);
pokers.remove(0);
players.get(index).hand.add(poker);
}
/**
* 开始游戏
*/
public void startGame() {
System.out.println("——创建扑克牌——");
this.initPokers();
System.out.println("——创建扑克牌成功!——");
System.out.println("为:" + Poker.getPokersList(this.pokers));
System.out.println("——开始洗牌——");
this.randomPokers();
System.out.println("——洗牌结束!——");
System.out.println("——创建玩家...——");
for (int i = 0; i < playerNum; i++) {
System.out.println("——请输入第" + (i + 1) + "位玩家的ID和姓名——");
int id = -1;
String name = "";
boolean flag = false;
// 创建id
do {
try {
System.out.println("输入ID:");
id = console.nextInt();
flag = true;
} catch (InputMismatchException e) {
System.out.println("请输入整数类型的ID!");
} catch (Exception e) {
System.out.println("未知异常");
e.printStackTrace();
}
console.nextLine(); // 跳过异常流的输入
} while (flag == false);
// 创建name
flag = false;
do {
try {
System.out.println("输入姓名:");
name = console.nextLine();
if (!"".equals(name)) {
flag = true;
} else {
throw new InputMismatchException();
}
} catch (InputMismatchException e) {
System.out.println("请输入不为空的字符串!");
} catch (Exception e) {
System.out.println("未知异常");
e.printStackTrace();
}
} while (flag == false);
Player p = new Player(id, name);
players.add(p);
}
for (Player player : players) {
System.out.println("——欢迎玩家" + player.name);
}
System.out.println("——开始发牌——");
for (int i = 0; i < playerNum * playerHandNum; i++) {
int index = i % playerNum;
putPoker(index);
System.out.println("——玩家:" + players.get(index).name + "-拿牌");
}
System.out.println("——发牌结束!——");
System.out.println("——开始游戏...——");
for (Player player : players) {
Poker poker = player.getItibannPoker();
System.out.println("玩家:" + player.name + "最大的手牌为:" + poker.getName());
}
List<Player> pMirror = new ArrayList<Player>(this.players);
Collections.sort(pMirror, new PlayerComparator());
System.out.println("——玩家:" + pMirror.get(0).name + "获胜!——");
System.out.println("——玩家各自的手牌为:——");
for (Player player : players) {
System.out.println(player.name + ":" + Poker.getPokersList(player.hand));
}
}
}Player.java
package kasei;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class Player {
public int id;
public String name;
public List<Poker> hand;
public Player(int id, String name) {
this.id = id;
this.name = name;
this.hand = new ArrayList<Poker>();
}
public Poker getItibannPoker() {
List<Poker> pokers = new ArrayList<Poker>(this.hand);
Collections.sort(pokers);
if (pokers.size() > 0) {
return pokers.get(0);
}
return new Poker();
}
}PlayerComparator.java
package kasei;
import java.util.Comparator;
public class PlayerComparator implements Comparator<Player> {
public int compare(Player p1, Player p2) {
if (p1.getItibannPoker().getSize() > p2.getItibannPoker().getSize()) {
return -1;
} else {
return 1;
}
}
}如果把对象放入集合中,会忽略他的类型,把他当作Object来处理,因此在取集合中元素的同时,需要强制类型转换。