1. 程式人生 > >java實現簡單的21點小遊戲(第一版)

java實現簡單的21點小遊戲(第一版)

距離上一次部落格更新已經有了快半個月的時間,由於實習期間的公司業務,所以一直無暇顧及部落格的更新。今天終於忙裡偷閒,為廣大博友帶來一個半月前寫的小遊戲。希望大家多多支援 如有不足請多多留言!

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類:

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;
	}
}
Card類包含了撲克牌的各種屬性,包括牌的值,花色,值的MASK,花色的MASK 以及 是否顯示。同時還包含各項屬性的getter和setter。

第二個類是遊戲主類,包含了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使用),以及視覺化處理。

如需轉載,請註明出處,謝謝合作!