您的位置:首页 > 其它

一个小练习: 简易的梭哈游戏! 真的是非常简易~

2011-07-24 12:45 357 查看
package  classx;
import java.util.*;

/**
* Description:
* <br/>Program Name:  ShowHand
* <br/>Date:  2011.7.24
* @author  Lee gwlee2010@163.com    本程序为无聊之余,消遣而写,仅供交流!
* @version  1.0
*/

/**
*	梭哈游戏,规则是每个玩家发两张牌,比点数大小
*/
public class ShowHand
{
//扑克的花色  \4表示方块   \5表示梅花  \6表示黑桃  \3表示红桃
private String[] pColors = {"\4","\5","\3","\6"};
//扑克的面值
private String[] pValues = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//玩家的数目
private final int PLAYER_NUM;
//桌面上剩余的牌
private List<String> cards = new LinkedList();
//玩家手里的牌
private Map<String,String>   pCards = new HashMap<String,String>();
//本轮游戏的玩家
private String[] player;

public ShowHand()
{
PLAYER_NUM = 3;
}

public ShowHand(int pNum)
{
if(pNum<2||pNum>5)
{
System.out.println("玩家数目应在两人到五人之间!设定为默认玩家数目:3人");
PLAYER_NUM = 3;
}else
{
PLAYER_NUM = pNum;
player = new String[pNum];
}
}

//初始化扑克,并将扑克保存到cards中
public void initCards()
{
for(int i=0;i<pColors.length;i++)
{
for(int j=0;j<pValues.length;j++)
{
String temp = pColors[i]+" "+pValues[j];
cards.add(temp);
}
}
//洗牌
Collections.shuffle(cards);
}

//展示桌面上剩余的牌
public void showCards()
{
Iterator it = cards.iterator();
int count = 0;
while(it.hasNext())
{
String temp = (String)it.next();
count++;
System.out.print(temp+"\t");
if(count%10==0)
{
System.out.println();
}
}
}

/**
*	展示所有玩家的手牌
*/
public void showPlayerCards()
{
if(pCards.size()==0)
{
System.out.println("玩家手中无牌!");
return;
}
for(int i=0;i<player.length;i++)
{
System.out.print("玩家"+player[i]+"手牌为:"+pCards.get(player[i]));
System.out.println();
}
}

/**
*	通过比较玩家手牌,点数最大的为赢家
*	@return 赢家名字
*/
public String getWinner()
{
String winner = "";
//用Map保存数据,里面只有一个赢家的数据,关系为玩家名-点数
Map<String,Integer> temp = new HashMap<String,Integer>();
//通过比较得到点数最大的玩家
for(int i=0;i<player.length;i++)
{
int value = getValue(player[i]);
if(i==0)
{
temp.put(player[i],value);
winner = player[i];
}
int max = temp.get(winner);
//如果得到一个点数更大的玩家,则将TA取代Map中原来的玩家
if(max<value)
{
temp.clear();
temp.put(player[i],value);
winner = player[i];
}
}
return "本轮赢家为:"+winner+"    点数是:"+temp.get(winner);
}

/**
*	通过玩家名得到玩家手牌点数
* @return 玩家手牌的点数
*/
public int getValue(String name)
{
//判断玩家name是否存在
boolean isExist = this.isPlayerExist(name);
if(!isExist)
{
return -1;
}
//求玩家手牌中的点数,规则:直接相加  A为1点  J为11点 Q为12点 K为13点
String[] temp = pCards.get(name).split(" ");
int result = parseValue(temp[1])+parseValue(temp[5]);
return result;
}

/**
*	将字符串解析成对应的点数
*	@param 待解析的字符串
* @return 字符串对应的点数
*/
private int parseValue(String t)
{
int result = 0;
if(t.equals("J"))
{
result = 11;
}else if(t.equals("Q"))
{
result = 12;
}else if(t.equals("K"))
{
result = 13;
}else if(t.equals("A"))
{
result = 1;
}else
{
result = Integer.parseInt(t);
}
return result;
}

//初始化玩家
public boolean initPlayer(String[] names)
{
if(names==null)
{
System.out.println("没有玩家无法进行游戏!");
return false;
}
//判断实际玩家数目是否与原来指定的玩家数目相等
if(names.length!=PLAYER_NUM)
{
System.out.println("您设定本轮游戏玩家为"+PLAYER_NUM+"人,但实际玩家却为"+names.length+"人");
return false;
}
//初始化玩家姓名
for(int i=0;i<names.length;i++)
{
player[i] = names[i];
}
return true;
}

//洗牌
public void shuffle()
{
initCards();
}

/**
*	判断给定的玩家名是否存在
*	@param frist 待判定的玩家名
*     @return 存在返回true,否则返回false
*/
private boolean isPlayerExist(String frist)
{
//如果first不存在
if(frist==null)
{
System.out.println("玩家不存在!");
return false;
}
boolean isExist = false;
for(int i=0;i<player.length;i++)
{
if(frist.equals(player[i]))
{
isExist = true;
break;
}
}
if(!isExist)
{
System.out.println("玩家不存在!");
return false;
}
return true;
}

/**
*	派牌的工具方法,从frist开始,每人每次两张
*	@param frist 第一个派牌的玩家
*	@return 派牌成功返回true
*/
private void deliver(String frist)
{
//找frist在player中的位置
int loca = -1;
for(int i=0;i<player.length;i++)
{
if(frist.equals(player[i]))
{
loca = i;
break;
}
}
//开始发牌
//发frist位置及其后的玩家
for(int i=loca;i<player.length;i++)
{
System.out.println("正在派发"+player[i]);
String temp = "";
for(int j=0;j<2;j++)
{
if(cards.size()==0)
{
this.shuffle();
System.out.println("洗牌了!");
}
temp+=cards.get(0)+"   ";
cards.remove(0);
}
pCards.put(player[i],temp);
}
//发frist位置之前的玩家
for(int i=0;i<loca;i++)
{
System.out.println("正在派发"+player[i]);
String temp = "";
for(int j=0;j<2;j++)
{
if(cards.size()==0)
{
this.shuffle();
System.out.println("洗牌了!");

}
temp+=cards.get(0)+"   ";
cards.remove(0);
}
pCards.put(player[i],temp);
}
}

/**
*	派牌,从first玩家开始,每次每人发两张
*	@param first 最先派牌的玩家
*	@return 派牌成功返回true,否则返回false
*/
public boolean deliverCards(String frist)
{
//判断frist是否存在
boolean isExist = this.isPlayerExist(frist);
if(!isExist)
{
return isExist;
}
//发牌
this.deliver(frist);
return true;
}

public static void main(String[] args)
{
ShowHand sh = new ShowHand(5);
String[] names = {"A","B","C","D","E"};
sh.initCards();
sh.initPlayer(names);
sh.deliverCards("C");
sh.showPlayerCards();
System.out.println(sh.getWinner());
sh.showCards();
}
}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: