java實現簡單的21點小遊戲(第一版)
阿新 • • 發佈:2018-12-22
距離上一次部落格更新已經有了快半個月的時間,由於實習期間的公司業務,所以一直無暇顧及部落格的更新。今天終於忙裡偷閒,為廣大博友帶來一個半月前寫的小遊戲。希望大家多多支援 如有不足請多多留言!
21點遊戲(BlackJack)
遊戲規則:玩家和電腦初始各自獲得2張撲克牌,累加撲克牌點數(A代表1點,2-10代表2-10點,J,Q,K 代表 10點)。
玩家和電腦均能繼續要牌,累計點數不超過21點且累加值大的乙方獲勝。
下圖是遊戲執行畫面:
遊戲開始時,系統自動發牌,玩家和電腦各2張,玩家看不到電腦的第一張牌。
開始後玩家能得到一個電腦當前2張牌累加值的範圍,並且可以利用這個值來判斷是否需要增加自己的手牌。
輸入指令K表示開牌, A表示加牌,R表示重新開始遊戲,Q表示退出遊戲。
下面演示開牌後的結果:
玩家獲得了勝利,接著我們輸入R指令開始開始一局新的遊戲:
這次我們選擇加一張牌然後開牌:
可惜由於加牌後,玩家的累加值超過21點,電腦獲勝!
以上只是遊戲的基本操作,博友可以根據以下提供的程式碼自行測試
廢話不多少,開始上程式碼:
21點遊戲分為2個類,一個是Card類:
Card類包含了撲克牌的各種屬性,包括牌的值,花色,值的MASK,花色的MASK 以及 是否顯示。同時還包含各項屬性的getter和setter。public class Card { private String mask; private int value; private int icon; private String iconMask; private boolean isShow; public Card(String mask, int value, int icon, String iconMask,boolean isShow){ this.mask = mask; this.value = value; this.icon = icon; this.iconMask = iconMask; this.isShow = isShow; } public boolean isShow() { return isShow; } public void setShow(boolean isShow) { this.isShow = isShow; } public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } public String getIconMask() { return iconMask; } public void setIconMask(String iconMask) { this.iconMask = iconMask; } public String getMask() { return mask; } public void setMask(String mask) { this.mask = mask; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } }
第二個類是遊戲主類,包含了MAIN 函式以及一些遊戲邏輯(初始化發牌,加牌 ,正常發牌,輸出列印等):
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class BlackJack { private static ArrayList<Card> cards = new ArrayList<Card>(); private static ArrayList<Card> cardsComputer = new ArrayList<Card>(); private static ArrayList<Card> cardsPlayer = new ArrayList<Card>(); public static void main(String[] args){ System.out.println("21點遊戲"); System.out.println("****************"); System.out.println("A表示1點,2-10表示2-10點,J、Q、K表示10點"); reset(); System.exit(0); } public static int sendCardInit(int id){ int counter = 1; int point = 0; if(id == 1){ point = sendCard(id,counter)+sendCard(id,counter+1); System.out.println("玩家的總點數: "+point); }else{ int x = sendCard(id,counter); counter = counter +1; int y = sendCard(id,counter); point = x+y; System.out.println("電腦可能的點數: "+(point-x+1)+"~"+(point-x+10)); //System.out.println(point); } return point; } public static int sendCard(int id,int counter){ //printCards(); int sum = 0; Card curr = cards.get(0); if(id == 0){ if(counter == 1){ System.out.println("第"+counter+"張牌: *"); sum = sum +curr.getValue(); //System.out.println(sum); //System.out.println(curr.getIconMask()+curr.getMask()); }else{ sum = sum +curr.getValue(); System.out.print("第"+counter+"張牌: "); System.out.println(curr.getIconMask()+curr.getMask()); } cardsComputer.add(cards.get(0)); }else{ sum = sum +curr.getValue(); System.out.print("第"+counter+"張牌: "); System.out.println(curr.getIconMask()+curr.getMask()); cardsPlayer.add(cards.get(0)); } cards.remove(0); return sum; } public static int extraCard(int id, int counter,int point){ int sum = point; System.out.print("第"+(counter+2)+"張牌: "); System.out.println(cards.get(0).getIconMask()+cards.get(0).getMask()); sum = sum +cards.get(0).getValue(); if(id == 0){ cardsComputer.add(cards.get(0)); }else{ cardsPlayer.add(cards.get(0)); } cards.remove(0); return sum; } public static void printCards(){ for(int i=0; i<cards.size();i++){ System.out.print(cards.get(i).getIconMask()+cards.get(i).getMask()+" ;"); } } public static void init(){ initMethod(1); initMethod(2); initMethod(3); initMethod(4); } public static void initMethod(int icon){ int index = 0; String iconMask= ""; //初始化花色、字標 if(icon == 1){ index = 0; iconMask = "♥"; }else if(icon == 2){ index = 13; iconMask = "♦"; }else if(icon == 3){ index = 26; iconMask = "♠"; }else if(icon == 4){ index = 39; iconMask = "♣"; } for(int i = index;i < index+13;i++){ if(i == index+0){ Card c = new Card("A",i-index+1,icon,iconMask,true); cards.add(c); }else if(i >index && i <10+index){ Card c =new Card(String.valueOf(i+1-index),i-index+1,icon,iconMask,true); cards.add(c); }else if(i >=10+index && i <13+index){ if(i == 10+index){ Card c =new Card("J",10,icon,iconMask,true); cards.add(c); }else if(i == 11+index){ Card c =new Card("Q",10,icon,iconMask,true); cards.add(c); }else if(i == 12+index){ Card c =new Card("K",10,icon,iconMask,true); cards.add(c); } } } } public static void printComputer(){ System.out.println("電腦的牌: "); for(int j =0; j< cardsComputer.size();j++){ System.out.print("第"+(j+1)+"張牌: "); System.out.println(cardsComputer.get(j).getIconMask()+cardsComputer.get(j).getMask()); } } public static void printPlayer(){ System.out.println("玩家的牌: "); for(int j =0; j< cardsPlayer.size();j++){ System.out.print("第"+(j+1)+"張牌: "); System.out.println(cardsPlayer.get(j).getIconMask()+cardsPlayer.get(j).getMask()); } } public static void reset(){ init(); Collections.shuffle(cards); System.out.println("電腦的牌: "); int computer = sendCardInit(0); System.out.println("----------------"); System.out.println("玩家的牌: "); int player = sendCardInit(1); System.out.println("----------------"); System.out.println("請輸入指令:"); System.out.println("輸入K表示開牌;輸入A表示加牌;輸入R表示重置;輸入Q表示退出"); Scanner s = new Scanner(System.in); while(true){ String command = s.nextLine(); if(command.equals("K")||command.equals("k")){ if(player>21){ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("真遺憾,您輸了,電腦獲勝!"); } if(computer<16){ System.out.println("電腦加牌"); for(int j =0; j< cardsComputer.size();j++){ System.out.print("第"+(j+1)+"張牌: "); System.out.println(cardsComputer.get(j).getIconMask()+cardsComputer.get(j).getMask()); } } int extraCounter = 0; while(computer<16){ computer = extraCard(0,extraCounter+1,computer); extraCounter = extraCounter+1; } if(computer > 21){ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("真厲害,您贏了,玩家獲勝!"); }else if(computer > player){ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("真遺憾,您輸了,電腦獲勝!"); }else if(computer < player){ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("真厲害,您贏了,玩家獲勝!"); }else{ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("平局,無人獲勝!"); } }else if(command.equals("A")||command.equals("a")){ System.out.println("玩家加牌"); for(int j =0; j< cardsPlayer.size();j++){ System.out.print("第"+(j+1)+"張牌: "); System.out.println(cardsPlayer.get(j).getIconMask()+cardsPlayer.get(j).getMask()); } player =extraCard(1,cardsPlayer.size()-2+1,player); System.out.println("玩家的總點數: "+player); if(player>21){ System.out.println("****************"); printComputer(); System.out.println("電腦的最終點數: " + computer); System.out.println("----------------"); printPlayer(); System.out.println("玩家的最終點數: " + player); System.out.println("真遺憾,您輸了,電腦獲勝!"); } }else if(command.equals("R")||command.equals("r")){ System.out.println("21點遊戲"); System.out.println("****************"); System.out.println("A表示1點,2-10表示2-10點,J、Q、K表示10點"); cards.clear(); cardsComputer.clear(); cardsPlayer.clear(); init(); Collections.shuffle(cards); System.out.println("電腦的牌: "); computer = sendCardInit(0); System.out.println("----------------"); System.out.println("玩家的牌: "); player = sendCardInit(1); System.out.println("----------------"); print(); }else if(command.equals("Q")||command.equals("q")){ System.err.println("成功退出遊戲"); break; }else{ System.err.println("無效輸入!輸入K表示開牌;輸入A表示加牌;輸入R表示重置;輸入Q表示退出"); } } s.close(); } public static void print(){ System.out.println("請輸入指令:"); System.out.println("輸入K表示開牌;輸入A表示加牌;輸入R表示重置;輸入Q表示退出"); } }
未來發展:
這只是21一點遊戲的第一個版本,基本後臺邏輯已經完成,下一步就是考慮完善遊戲,包括A牌的多值計算(A可以當1也可以當11使用),以及視覺化處理。
如需轉載,請註明出處,謝謝合作!