Card单张扑克
package com.PlayCards;
import java.util.HashMap;
/**
* @author SteelIU
* @param colors:花色集合
* @param points:点数集合
* @param color :花色
* @param point :点数
* @param mapColor:存放<花色,大小>键值对
* @param mapPoint:存放<点数,大小>键值对
*/
public class Card implements Comparable<Card>{
static String []colors;
static String []points;
private String color;
private String point;
static HashMap<String,Integer> mapColor;
static HashMap<String,Integer> mapPoint;
/**
* 静态代码块(初始化colors,points,mapColor,mapPoint)
*/
static{
colors=new String[]{"方块","梅花","红桃","黑桃"};
points=new String[]{"2","3","4","5","6","7","8","9",
"10","J","Q","K","A"};
mapColor=new HashMap<String,Integer>();
mapPoint=new HashMap<String,Integer>();
for(int i=0;i<colors.length;i++){
Integer integer=i;
mapColor.put(colors[i],integer );
}
for(int i=0;i<points.length;i++){
Integer integer=i;
mapPoint.put(points[i],integer );
}
}
/**
* @param i:colors的下标
* @param j:points的下标
*/
Card(int i,int j){
color=colors[i];
point=points[j];
}
public String toString(){
return "["+this.color+""+this.point+"]";
}
@Override
public int compareTo(Card o) {
//thisPoint当前Card点数的大小,oPoint是比较对象的点数的大小
int thisPoint=(Integer) mapPoint.get(this.point);
int oPoint=(Integer) mapPoint.get(o.point);
if(thisPoint!=oPoint){
return thisPoint-oPoint;
}else{
//执行到该步即点数相同,开始比较花色
//thisColor当前Card花色大小,oColor比较对象的花色大小
int thisColor=(Integer) mapColor.get(this.color);
int oColor=(Integer) mapColor.get(o.color);
return thisColor-oColor;
}
}
}
Cards一副扑克牌
package com.PlayCards;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
/**
* @author SteelIU
* @param listCard:52张扑克牌集合
*/
public class Cards {
List<Card>listCard;
Card card;
/**/
Cards(){
listCard=new ArrayList<Card>();
for(int i=0;i<Card.colors.length;i++){
for(int j=0;j<Card.points.length;j++){
card=new Card(i,j);
listCard.add(card);
}}
}
/**
* XXX洗牌算法,只要將牌添加到set集合即可?XXX这是错误的
* 因为HashSet是根据hash算法排序的,一次洗牌看似是无序的,
* 但是多次洗牌就发现牌的hash排序规律。影响了该游戏的公平性
* HashSet的无序只是没有有序的下标访问,但是hash值是固定的。
* 所以不能直接hashset.addAll(List)洗牌算法
*/
void shuffle(){
//此处利用了HashSet不重复性
HashSet<Integer>hashSet=new HashSet<Integer>();
ArrayList<Card>alist=new ArrayList<Card>();
Random random=new Random();
do{
Integer i=random.nextInt(listCard.size());//随机生成0-size-1
if(!hashSet.contains(i)){//不重复下标
hashSet.add(i);
alist.add(listCard.get(i));
}
}while(alist.size()<listCard.size());
listCard=alist;
}
}
Gamer单个玩家
package com.PlayCards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Gamer {
Integer ID;
String name;
List<Card>handsCards=new ArrayList<Card>();
Card maxCard;
Gamer(int id,String name){
this.ID=id;
this.name=name;
}
/**玩家拿牌*/
public void setHandsCards(Card card) {
System.out.println("玩家:"+name+"--拿牌");
handsCards.add(card);
}
/**控制台输出玩家最大手牌*/
public void setMaxCard(){
Collections.sort(handsCards);
maxCard=handsCards.get(handsCards.size()-1);
System.out.println("玩家:"+name+"最大手牌为:"+maxCard);
}
public String toString(){
String str=name+":"+handsCards.toString();
return str;
}
}
Gamers 玩家集合
package com.PlayCards;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
/**
* @author SteelIU
* @param gamerList:玩家集合
* @param list:玩家集合中的ID集合
*/
public class Gamers {
List<Gamer>gamerList=new ArrayList<Gamer>();
List<Integer>list=new ArrayList<Integer>();
Gamers(int num){
gamerList=createGamers(num);
}
/**控制台输出玩家所有手牌*/
public String toString(){
String str="";
for (Gamer gamer : gamerList) {
str+=gamer.toString()+"\n";
}
return str;
}
/**
* @param num:传入玩家的个数
* @return gamerList:返回玩家集合
*/
public List<Gamer> createGamers(int num){
for(int i=1;i<=num;i++){
boolean flag;
do{
flag=true;
System.out.println("请输入第"+i+"位玩家的ID和姓名:");
System.out.println("输入ID:");
try {
Scanner scan=new Scanner(System.in);//将这一句放在do{}while外面,将会造成没法输入的死循环
Integer id=scan.nextInt();
if(id<=0){
System.out.println("输入的ID不能是负数,请重新输入");
continue;
}
if(list.contains(id)){
System.out.println("输入的ID已存在,请重新输入");
}else{
flag=false;
list.add(id); //将合法的ID存入ID序列中
System.out.println("输入姓名:");
String name=scan.next();
gamerList.add(new Gamer(id,name));
}
}catch (InputMismatchException e){
System.out.println("输入的ID是非法字符");
}
}while(flag);
}
for (Gamer gamer: gamerList) {
System.out.println("----欢迎玩家:"+gamer.name);
}
return gamerList;
}
}
Factory 工厂类,封装了Cards和Gamers的关联的行为
package com.PlayCards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* <p>Description: 整合了发牌游戏,关联玩家和扑克牌的行为,瘦身入口程序TestGame</p>
* @author SteelIU
*/
public class Factory {
Cards cards;
Gamers gamers;
Factory(Cards cards,Gamers gamers){
this.cards=cards;
this.gamers=gamers;
}
/**开始发牌,循环发给每个玩家,循环time次,每个玩家手牌有time个*/
public void deal(int time){
Iterator<Card>iter=cards.listCard.iterator();
for(int i=1;i<=time;i++){
for (Gamer gamer: gamers.gamerList) {
gamer.setHandsCards(iter.next());
}
}
System.out.println("-----------发牌结束-----------");
}
/**控制台显示每个玩家的最大手牌*/
public void showMaxCards(){
for (Gamer gamer : gamers.gamerList) {
gamer.setMaxCard();
}
}
/**所有玩家的手牌进行比较,输出赢家*/
public void compareCard(){
Map<Card,Gamer>map=new HashMap<Card,Gamer>();//<最大手牌-玩家>键值对
List<Card>maxCards=new ArrayList<Card>();//玩家最大手牌序列
for (Gamer gamer : gamers.gamerList) {
maxCards.add(gamer.maxCard);
map.put(gamer.maxCard, gamer);
}
Collections.sort(maxCards);
Card key=maxCards.get(maxCards.size()-1);
Gamer winner=map.get(key);
System.out.println("----------玩家:"+winner.name+"获胜----------");
}
}
程序的入口
package com.PlayCards;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TestGame {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*1.创建一副有序的扑克牌*/
System.out.println("-----------创建扑克牌------------");
Cards cards=new Cards();
System.out.println("-----------扑克牌创建成功------------");
System.out.println(cards.listCard);
System.out.println("-----------开始洗牌------------");
cards.shuffle();
System.out.println("-----------洗牌结束!------------");
System.out.println("-----------创建玩家……------------");
Gamers gamers=new Gamers(2);
Factory factory=new Factory(cards,gamers);
System.out.println("-----------开始发牌------------");
factory.deal(2);
factory.showMaxCards();
factory.compareCard();
System.out.println(gamers.toString());
}
}
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦