1. 程式人生 > >瘋狂Java講義第六章下“梭哈遊戲練習”

瘋狂Java講義第六章下“梭哈遊戲練習”

定義一個類,該類用於封裝一桌梭哈遊戲,這個類應該包含桌上剩下的牌的資訊,幷包含5個玩家的狀態資訊:他們各自的位置,遊戲狀態(正在遊戲或已放棄)、手上已有的牌等資訊。如果有可能,這個類還應該實現發牌方法,這個方法需要控制從誰開始發牌,不要發牌給放棄的人,並修改桌上剩下的牌。
一些思路:
1.發牌前先洗牌,可以呼叫Collections.shuffle(List)。預設撲克的一種有序的排列,然後進行編號,將這52個編號打亂,在找到對應的撲克。
2.發牌按照座位號的順序,玩家隨意入座。考慮到放棄遊戲的玩家將不會發到牌,庫頂的牌需要做“歸位”處理。
3.五張牌的組合判斷:同花和順子的判斷較為簡單,對於兩對,三對這類的組合只需要統計重複撲克的次數即可,方法同“判斷陣列中各元素出現的次數”,可參考

https://blog.csdn.net/haiyoung/article/details/49006361

程式碼如下:

import java.util.*;

public class Stud {
	private static final int ROYAL_FLUSH = 10;
	private static final int SRTAIGHT_FLUSH = 9;
	private static final int FOUR = 8;
	private static final int FULLHOUSE = 7;
	private static final int
FLUSH = 6; private static final int STRAIGHT = 5; private static final int THREE = 4; private static final int TWO_PAIRS = 3; private static final int ONE_PAIRS = 2; private static final int ZILCH = 1; private static final int GIVE_UP = 0; private static final int PLAYER_ALL = 5; //0:♠ 1:♣ 2:♥ 3:♦
public static String[] sPoker = new String[52]; //after shuffle private static int topcard = 0; private static int top = 0; private static int dealTimes = 0; private static int seatStart = 0; // 0~4 private static int rounds = 1; private static int space = 0; private static int[] winner = new int[5]; private class Player { String pName; boolean state = true; String[] handPoker = new String[5]; int[] handPokerNum = new int[5]; char[] handPokerColor = new char[5]; } static Player seat[] = new Player[PLAYER_ALL]; //Initialization public void studInit() { String[][] Poker = new String[4][13]; String[] color = {"♠", "♣", "♥", "♦"}; String[] num = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; String[] name = {"player1", "player2", "player3", "player4", "player5"}; for(int i =0 ; i < PLAYER_ALL; i++) { seat[i] = new Player(); } for (int i = 0; i <4; i++) { for (int j = 0; j <13; j++) { Poker[i][j] = color[i]+num[j]; } } //Shuffle List<Integer> cardList = new ArrayList<Integer>(); for (int i = 0; i < 52; i++) { cardList.add(i+1); } Collections.shuffle(cardList); //exchange list to poker for (int n = 0; n < 52; n++) { sPoker[n] = Poker[(cardList.get(n)-1)/13][(cardList.get(n)-1)%13]; System.out.print(sPoker[n]+" "); } System.out.print("\n"); //take a seat List<Integer> pList = new ArrayList<Integer>(); for (int i = 0; i < PLAYER_ALL; i++) { pList.add(i); } Collections.shuffle(pList); for (int n = 0; n < PLAYER_ALL; n++) { seat[n].pName = name[pList.get(n)]; } } public void match(Player p, int k) { switch(p.handPoker[k].charAt(1)) { case 'A' : p.handPokerNum[k] = 1; break; case 'J' : p.handPokerNum[k] = 11; break; case 'Q' : p.handPokerNum[k] = 12; break; case 'K' : p.handPokerNum[k] = 13; break; default : p.handPokerNum[k] =(int)(p.handPoker[k].charAt(1)) - 48; } } //deal cards 存在放棄的玩家,需要space對topcard進行“歸位” public void deal(int sStrat) { sStrat = seatStart; for(int i = 0; i < PLAYER_ALL; i++) { top = topcard - space; switch(topcard%5) { case 0: if(seat[sStrat%5].state) { seat[sStrat%5].handPoker[dealTimes] = sPoker[top]; seat[sStrat%5].handPokerColor[dealTimes] = seat[sStrat%5].handPoker[dealTimes].charAt(0); match(seat[sStrat%5], dealTimes); } else space ++; break; case 1: if(seat[(sStrat+1)%5].state) { seat[(sStrat+1)%5].handPoker[dealTimes] = sPoker[top]; seat[(sStrat+1)%5].handPokerColor[dealTimes] = seat[(sStrat+1)%5].handPoker[dealTimes].charAt(0); match(seat[(seatStart+1)%5], dealTimes); } else space ++; break; case 2: if(seat[(sStrat+2)%5].state) { seat[(sStrat+2)%5].handPoker[dealTimes] = sPoker[top]; seat[(sStrat+2)%5].handPokerColor[dealTimes] = seat[(sStrat+2)%5].handPoker[dealTimes].charAt(0); match(seat[(sStrat+2)%5], dealTimes); } else space ++; break; case 3: if(seat[(sStrat+3)%5].state) { seat[(sStrat+3)%5].handPoker[dealTimes] = sPoker[top]; seat[(sStrat+3)%5].handPokerColor[dealTimes] = seat[(sStrat+3)%5].handPoker[dealTimes].charAt(0); match(seat[(sStrat+3)%5], dealTimes); } else space ++; break; case 4: if(seat[(sStrat+4)%5].state) { seat[(sStrat+4)%5].handPoker[dealTimes] = sPoker[top]; seat[(sStrat+4)%5].handPokerColor[dealTimes] = seat[(sStrat+4)%5].handPoker[dealTimes].charAt(0); match(seat[(sStrat+4)%5], dealTimes); } else space ++; break; } topcard ++; } dealTimes++; } //STRAIGHT public boolean jStraight(Player p) { //Sort boolean flag = false; Arrays.sort(p.handPokerNum); for (int i = 0; i < p.handPokerNum.length-1; i++) { if(p.handPokerNum[i]+1 == p.handPokerNum[i+1]) flag = true; else { flag = false; break; } } return flag; } //FLUSH public boolean jFlush(Player p) { boolean flag = false; for (int i = 0; i < p.handPokerColor.length-1; i++) { if(p.handPokerColor[i] == p.handPokerColor[i+1]) flag = true; else { flag = false; break; } } return flag; } // FOUR, FULLHOUSE, THREE, TWO_PAIRS, ONE_PAIRS public int repetition(Player p) { int reFour = 0; int reThree = 0; int reTwo= 0; HashMap<Integer, Integer> pokers = new HashMap<Integer, Integer>(); for(int num : p.handPokerNum) { Integer key = pokers.get(num); pokers.put(num, key == null ? 1 : key+1); } Iterator<Integer> itr = pokers.keySet().iterator(); while(itr.hasNext()) { Object key = itr.next(); if(pokers.get(key) == 4) { reFour ++; break; } else if(pokers.get(key) == 3) reThree ++; else if(pokers.get(key) ==2) reTwo ++; } if(reFour == 1) return FOUR; if(reThree == 1 && reTwo == 1) return FULLHOUSE; if(reThree == 1 && reTwo == 0) return THREE; if(reTwo == 2) return TWO_PAIRS; if(reThree == 0 && reTwo ==1) return ONE_PAIRS; else return ZILCH; } public int type(Player p) { int TYPE = 0; if(p.state) { if(jStraight(p)) { if(jFlush(p)) { if(p.handPokerNum[0] == 1) TYPE = ROYAL_FLUSH; else TYPE = SRTAIGHT_FLUSH; } else TYPE = STRAIGHT; } else if(jFlush(p)) TYPE = FLUSH; else TYPE = repetition(p); return TYPE; } else return GIVE_UP; } //其他輔助函式 public char[] change(String str) { String s; s = str.replace(" ", ""); //刪除字串中的空格 char[] stringArr = s.toCharArray(); //字串轉換為陣列 return stringArr; } public int max(int data[]) { int m = 0; for (int i = 0; i < data.length; i++) { if(m < data[i]) m= data[i]; } return m; } public static void main(String[] args) { // TODO Auto-generated method stub Stud s = new Stud(); s.studInit(); Scanner in = new Scanner(System.in); System.out.println("=======5人梭哈遊戲======="); System.out.print("隨機分配座位... 回車開始遊戲"); while(in.nextLine() == null); for (int i = 0; i < PLAYER_ALL; i++) { System.out.print(" || "+(i+1)+"號座位: "+seat[i].pName+" || "); } System.out.println(); //以下不考慮輸入錯誤 System.out.print("確認從幾號座位開始發牌(輸入1~5):"); int sSt = 0; sSt = in.nextInt(); seatStart = sSt