21点游戏
一、Card类
package com.csu.marden;
import java.util.ArrayList;
public class Card {
// public static enum Suit{
// CLUBS, HEARTS, DIAMONDS, SPADES
// }
// public static enum Value{
// ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING
// }
public static String [] suit={"CLUBS","HEARTS","DIAMONDS","SPADES"};
public static String [] value={"ACE","TWO","THREE","FOUR","FIVE","SIX",
"SEVEN","EIGHT","NINE","TEN","JACK","QUEEN","KING"};
//成员变量
private String _suit;
private String _value;
//构造函数
public Card(String suit,String value){
this._suit=suit;
this._value=value;
}
//Getters and Setters
public String get_suit() {
return _suit;
}
public void set_suit(String _suit) {
this._suit = _suit;
}
public String get_value() {
return _value;
}
public void set_value(String _value) {
this._value = _value;
}
@Override
public String toString() {
return "Card [_suit=" + _suit + ", _value=" + _value + "]";
}
//获取卡牌数值(返回ArrayList)
public ArrayList<Integer> getNumericalValue(){
ArrayList<Integer> temp=new ArrayList<>();
if(this._value=="ACE"){
temp.add(1);
temp.add(11);
}else if(this._value=="TWO"){
temp.add(2);
}
else if(this._value=="THREE"){
temp.add(3);
}
else if(this._value=="FOUR"){
temp.add(4);
}
else if(this._value=="FIVE"){
temp.add(5);
}
else if(this._value=="SIX"){
temp.add(6);
}
else if(this._value=="SEVEN"){
temp.add(7);
}
else if(this._value=="EIGHT"){
temp.add(8);
}
else if(this._value=="NINE"){
temp.add(9);
}
else if(this._value=="TEN" || this._value=="JACK" || this._value=="QUEEN" || this._value=="KING"){
temp.add(10);
}
return temp;
}
}
二、Player类
package com.csu.marden;
import java.util.ArrayList;
public class Player {
//玩家姓名
private String name;
//玩家手牌
private ArrayList<Card> cards;
//构造函数
public Player(){
cards=new ArrayList<Card>();
}
public Player(String name){
this.name=name;
cards=new ArrayList<Card>();
}
//获取玩家姓名
public String getName(){
return name;
}
//给玩家手牌中增加一张牌(发牌)
public void dealToPlayer(Card card){
cards.add(card);
}
//从玩家手牌中去掉一张牌(打牌)
public void removeCard(Card card){
cards.remove(card);
}
//获取玩家手牌可能构成的所有值
public ArrayList<Integer> getNumericalHandValue(){
//累计玩家手牌中ACE牌的数量
int count=0;
//累计玩家手牌的总值
int sum=0;
for(int i=0;i<cards.size();i++){
if(cards.get(i).get_value()!="ACE"){
sum+=cards.get(i).getNumericalValue().get(0);
}else{
count++;
}
}
ArrayList<Integer> temp=new ArrayList<Integer>();
if(count==0){
temp.add(sum);
}else if(count==1){
temp.add(sum+1);
temp.add(sum+11);
}else if(count==2){
temp.add(sum+2);
temp.add(sum+12);
temp.add(sum+22);
}else if(count==3){
temp.add(sum+3);
temp.add(sum+13);
temp.add(sum+23);
temp.add(sum+33);
}else{
temp.add(sum+4);
temp.add(sum+14);
temp.add(sum+24);
temp.add(sum+34);
temp.add(sum+44);
}
return temp;
}
//寻找局部最大值(找出不超过21,且最接近21的值)
public int getbestNumericalHandValue(){
// ArrayList<Integer> temp=this.getNumericalHandValue();
// return temp.get(temp.size()-1);
ArrayList<Integer> temp=this.getNumericalHandValue();
if(temp.get(0)>21){ //整个序列都比21大,选最大值
return temp.get(temp.size()-1);
}else if(temp.get(temp.size()-1)<21){ //整个序列都比21小,选最大值
return temp.get(temp.size()-1);
}else{ //整个序列在21之间,选比21小,且最接近21的数
//返回值应该是:比21小,且与21的差值最小的那个数
int diff=Integer.MAX_VALUE; //差值
int index=-1; //下标
for(int i=0;i<temp.size();i++){
if(temp.get(i)<=21 && diff>21-temp.get(i)){
diff=21-temp.get(i);
index=i;
}
}
return temp.get(index);
}
}
//获取玩家的所有手牌
public ArrayList<Card> getCards(){
return cards;
}
//获取玩家的手牌数量
public int getHandSize(){
return cards.size();
}
}
三、Deck类
package com.csu.marden;
import java.util.ArrayList;
import java.util.Random;
public class Deck {
public static String [] suit={"CLUBS","HEARTS","DIAMONDS","SPADES"};
public static String [] value={"ACE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","JACK","QUEEN","KING"};
public static final int NUMS=52;
private ArrayList<Card> deckCards;
//构造函数
public Deck(){
deckCards=new ArrayList<Card>();
for(int i=0;i<suit.length;i++){
for(int j=0;j<value.length;j++){
deckCards.add(new Card(suit[i], value[j]));
}
}
}
//重置(清空卡牌集合,并重置)
public void reset(){
deckCards.clear();
for(int i=0;i<suit.length;i++){
for(int j=0;j<value.length;j++){
deckCards.add(new Card(suit[i], value[j]));
}
}
}
//洗牌
public void shuffle(){
Random random = new Random();
for(int i=0;i<deckCards.size();i++){
int p=random.nextInt(deckCards.size());//0-52之间的随机值(包含0,不包含52)
Card temp=deckCards.get(i);
deckCards.set(i, deckCards.get(p));
deckCards.set(p, temp);
}
}
//返回指定索引处的卡牌
public Card getCard(int i){
return deckCards.get(i);
}
//发牌,从剩余卡牌中随机选择一张并返回
public Card dealRandomCard(){
Random random=new Random();
int p=random.nextInt(deckCards.size());
Card temp=deckCards.get(p);
deckCards.remove(p);
return temp;
}
//返回当前一副扑克牌中的剩余卡牌数量
public int size(){
return deckCards.size();
}
}
四、CardGame类
package com.csu.marden;
import java.util.ArrayList;
public abstract class Abr_CardGame {
private Deck deck;
private int nums_player;
private ArrayList<Player> playerList;
public Abr_CardGame(int nplayer) {
deck=new Deck();
this.nums_player=nplayer;
Deck deck=new Deck(); //创建一副牌
deck.shuffle();//洗牌
playerList=new ArrayList<>(); //创建玩家
for(int i=0;i<nplayer;i++){
playerList.add(new Player());
}
}
//给游戏中的每个玩家发一定数量的初始牌
public abstract void dealInitialCards();
//比较两个玩家的手牌大小
//若hand1的手牌比hand2的手牌大,则返回-1
//若hand2的手牌比hand1的手牌大,则返回+1
//若hand1和hand2的手牌一样大,则返回0
public abstract int compareHands(Player hand1,Player hand2);
//返回手牌
public Deck getDeck(){
return deck;
}
//返回指定序号的玩家(手牌)
public Player getPlayer(int i){
return playerList.get(i);
}
//返回游戏中的玩家数量
public int getNumPlayers(){
return this.nums_player;
}
}
五、Pontoon类
package com.csu.marden;
public class Ext_Pontoon extends Abr_CardGame {
private int initialNum=2; //玩家初始牌的数量
public Ext_Pontoon(int nplayer) {
super(nplayer);
// TODO Auto-generated constructor stub
}
//给游戏中的每个玩家发一定数量的初始牌
@Override
public void dealInitialCards() {
for(int i=0;i<getNumPlayers();i++){
Player temp=getPlayer(i);
for(int j=0;j<initialNum;j++){ //给指定的玩家发两张初始牌
temp.dealToPlayer(getDeck().dealRandomCard());
}
}
}
//比较两个玩家的手牌大小
//若hand1的手牌比hand2的手牌大,则返回-1
//若hand2的手牌比hand1的手牌大,则返回+1
//若hand1和hand2的手牌一样大,则返回0
@Override
public int compareHands(Player hand1, Player hand2) {
int temp1=hand1.getbestNumericalHandValue();
int temp2=hand2.getbestNumericalHandValue();
if(temp1>21 && temp2>21){
return 0;
}else if(temp1>21 && temp2<=21){
return 1;
}else if(temp1<=21 && temp2>21){
return -1;
}else{
if(temp1>temp2){
return -1;
}else if(temp1<temp2){
return 1;
}else{
return 0;
}
}
}
}