一个小练习: 简易的梭哈游戏! 真的是非常简易~
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]
相关文章推荐
- 推荐一个非常好玩的falsh游戏
- 一个非常有趣的游戏
- 如何使用Python基于Pygame写一个简易的微信打飞机游戏。
- java例程练习(关于内部类的一个非常重要的作用)
- Java: 一个非常简易的万年历
- java例程练习(关于内部类的一个非常重要的作用)
- 【Java练习】利用xml做一个简易的通讯录
- 一个非常简单的抽奖游戏
- Spring.NET学习笔记3——实现一个简易的IoC框架(练习篇)(转)
- 开源html5_kiwiJs_基础练习_创建一个kiwijs游戏
- python自定义一个非常简易的模块
- Linux脚本设计练习2——一个游戏菜单的简单实现
- Flex练习:写一个五子连珠游戏 Five And More
- 一个简易的游戏程序
- 笨方法学Python练习43:你来制作一个游戏
- canvas实现的一个简易字母游戏
- 推荐一个非常好玩的falsh游戏
- 一天练习一个小C/C++程序(一) 控制台版“金山打字”游戏
- 一个用wiEngine写的非常简单的游戏
- 推荐一个非常好玩的falsh游戏