学习完JAVA入门三季,按课程要求完成扑克牌代码的编写。其中的游戏玩家的人数和可得到的手牌张数,均从键盘输入来确定。因为是初学JAVA,希望多指点。谢谢。
1、首先建一人物类。属性有姓名和 ID。用于游戏人物继承。
package cn.davisli.carddemo;
/**
* 用于继承的人物类。
* @author Administrator
*
*/
public class Person {
private String id;
private String name;
public Person() {
}
public Person(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、创建扑克牌类。属性有花色和数字字符。用于生成一副扑克牌。
package cn.davisli.carddemo;
/**
* 扑克牌类。
*
* @author Administrator
*
*/
public class Card {
// 花色属性。
private String suit;
// 牌面点数属性。
private String numberOfChar;
public String getSuit() {
return suit;
}
public String getNumberOfChar() {
return numberOfChar;
}
// 构造方法。
public Card(String suit, String numberOfChar) {
this.suit = suit;
this.numberOfChar = numberOfChar;
}
}
3、创建游戏玩家类。继承自person类。其中增加手牌集合HashSet属性Hands,用于存放所得到的牌,游戏人物创建后加入HashMap集合中保存。
类中有创建玩家的方法,发牌的方法和打印玩家信息的方法。
package cn.davisli.carddemo;
/**
* 游戏玩家类。
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
//继承Person类.
public class PlayerGenerator extends Person {
// 手牌属性。因为手牌不止一张,且不能重复,所以用HashSet集合来存放玩家的牌。
private HashSet<Card> hands;
// 玩家用HashMap集合存放,
private static Map<String, PlayerGenerator> gamePlayer;
public PlayerGenerator() {
gamePlayer = new HashMap<String, PlayerGenerator>();
}
public PlayerGenerator(String id, String name) {
super(id, name);
this.hands = new HashSet<Card>();
}
public HashSet<Card> getHands() {
return hands;
}
public static Map<String, PlayerGenerator> getGamePlayer() {
return gamePlayer;
}
public void playCard() {
// 取牌。
ArrayList<Card> card = CardGenerator.getCard();
// 键盘输入,确定玩家的手牌数量。
Scanner input = new Scanner(System.in);
System.out.println();
System.out.print("请输入每个玩家可取得的手牌张数:");
int count = input.nextInt();
// 定位发牌指针。
int cardNumber = 0;
// 开始循环发牌。
for (int i = 0; i < count; i++) {
// 从HashMap中获得玩家信息。
Collection<PlayerGenerator> person = gamePlayer.values();
// 迭代玩家信息。
Iterator<PlayerGenerator> it = person.iterator();
while (it.hasNext()) {
PlayerGenerator p = (PlayerGenerator) it.next();
// 取出一张牌。
Card c = card.get(cardNumber);
// 玩家获得牌。
p.hands.add(c);
System.out.println("玩家:" + p.getName() + " 拿牌 ");
// 发牌指针指向下一张。
cardNumber++;
}
}
}
public void addPlayer() {
System.out.println();
// 自定义键盘输入玩家人数。
Scanner input = new Scanner(System.in);
System.out.print("请输入游戏人数:");
int crew = input.nextInt();
int i = 1;
// 根据人数创建玩家对象属性。
while (i <= crew) {
System.out.print("请输入第" + i + "个人物的ID:");
String userID = input.next();
Person ID = gamePlayer.get(userID);
// 判断输入的ID是否为空值。
if (ID == null) {
System.out.print("请输入游戏者姓名:");
String userName = input.next();
// 创建玩家对象。
PlayerGenerator newPlayer = new PlayerGenerator(userID,
userName);
// 将玩家对象加入HashMap集合。
gamePlayer.put(userID, newPlayer);
i++;
// ID不为空,说明已有对象值,需要重新输入。
} else {
System.out.println("警告:该ID已经存在,请重新输入!");
continue;
}
}
}
// 打印输出创建的游戏玩家信息。
public static void printUser(Map<String, PlayerGenerator> gamePlayer) {
System.out.println();
// 从Map中取出玩家信息。
Collection<PlayerGenerator> ps = gamePlayer.values();
System.out.println("创建游戏人物如下:");
// 循环输出信息。
for (Person person : ps) {
System.out.println("游戏者ID号:" + person.getId() + " 姓名:"
+ person.getName());
}
}
// 获取创建的游戏玩家Map集合方法。
public static Map<String, PlayerGenerator> getPlayer() {
return gamePlayer;
}
}
4、创建生成一副扑克牌的类。扑克牌生成后,存放于Arraylist数组中。
类中有扑克牌的创建方法和洗牌方法。
package cn.davisli.carddemo;
/**
* 扑克牌生成类。
*/
import java.util.ArrayList;
import java.util.Collections;
public class CardGenerator {
// 此属性是为了扑克牌生成后,放入有序的ArrayList集合中。
private static ArrayList<Card> setCard;
// 初始化ArrayList.
public CardGenerator() {
setCard = new ArrayList<Card>();
}
// 生成扑克牌的方法。
public void cardList() {
String[] suit = { "黑桃", "红心", "梅花", "方块" };
String[] numberOfChar = { "2", "3", "4", "5", "6", "7", "8", "9", "10",
"J", "Q", "K", "A" };
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 13; j++) {
// 产生一张牌。
Card c = new Card(suit[i], numberOfChar[j]);
// 放入setCard集合中保存。
setCard.add(c);
}
}
}
// 获取一副牌方法。
public static ArrayList<Card> getCard() {
return setCard;
}
// 打印一副牌中的所有张数。(共52张).
public static void printCard(ArrayList<Card> setCard) {
System.out.println();
for (int i = 0; i < setCard.size(); i++) {
System.out.print(setCard.get(i).getSuit() + " "
+ setCard.get(i).getNumberOfChar() + " ");
// 此处判断。每行输出13张牌后换行打印。
if ((i + 1) % 13 == 0) {
System.out.println();
}
}
}
// 洗牌方法。
public static ArrayList<Card> shuffle(ArrayList<Card> setCard) {
Collections.shuffle(setCard);
return setCard;
}
}
5、创建一个手牌比较排序类,并输出。实现Comparator接口。
package cn.davisli.carddemo;
/**
* 排序类。
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ComparatorCard implements Comparator<Card> {
public static void compare() {
System.out.println();
// 获取玩家。
Map<String, PlayerGenerator> person = new HashMap<String, PlayerGenerator>();
person = PlayerGenerator.getPlayer();
Collection<PlayerGenerator> p = person.values();
List<Card> listcard = new ArrayList<Card>();
for (PlayerGenerator playerGenerator : p) {
Set<Card> c = playerGenerator.getHands();
for (Card card : c) {
listcard.add(card);
System.out.println(playerGenerator.getName() + " "
+ card.getSuit() + card.getNumberOfChar());
}
}
// 各玩家手牌排序后输出。
System.out.println();
Collections.sort(listcard, new ComparatorCard());
for (int i = 0; i < listcard.size(); i++) {
System.out.println(listcard.get(i).getSuit() + " "
+ listcard.get(i).getNumberOfChar());
}
}
// 定义的排序规则。
@Override
public int compare(Card o1, Card o2) {
String suit = "黑桃 红心 梅花 方块";
String numberOfChar = "2 3 4 5 6 7 8 9 10 J Q K A";
int resultNum = numberOfChar.indexOf(o1.getNumberOfChar())
- numberOfChar.indexOf(o2.getNumberOfChar());
if (resultNum > 0) {
return -1;
} else if (resultNum < 0) {
return 1;
} else {
int resultSuit = suit.indexOf(o1.getSuit())
- suit.indexOf(o2.getSuit());
if (resultSuit > 0) {
return 1;
} else if (resultSuit < 0) {
return -1;
} else {
return 0;
}
}
}
}
6、执行程序,Main方法。
package cn.davisli.carddemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class GameTest {
public static void main(String[] args) {
//创建一副牌。
CardGenerator creatCard = new CardGenerator();
creatCard.cardList();
//获取创建的牌并打印输出。
ArrayList<Card> pairCard = new ArrayList<Card>();
pairCard = CardGenerator.getCard();
CardGenerator.printCard(pairCard);
//洗牌。
CardGenerator.shuffle(pairCard);
//创建游戏玩家.
PlayerGenerator creatPlayer=new PlayerGenerator();
creatPlayer.addPlayer();
//获取并打印输出创建的游戏玩家。
Map<String,PlayerGenerator> playerInfo=new HashMap<String,PlayerGenerator>();
playerInfo=PlayerGenerator.getPlayer();
PlayerGenerator.printUser(playerInfo);
//开始发牌。
creatPlayer.playCard();
//排序输出玩家手牌.
ComparatorCard.compare();
}
}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦