1. 程式人生 > 其它 >Java實現簡易21點比大小遊戲。(玩家VS電腦)

Java實現簡易21點比大小遊戲。(玩家VS電腦)

技術標籤:java實現小功能java

一、遊戲背景

參賽人數:2人
準備用具:一副撲克
規則:
撲克牌A,2,3,4,5,6,7,8,9,10,J,Q,K分別代表數字1,2,3,4,5,6,7,8,9,10,11,12,13.
每人輪流取撲克牌,目的是湊成“和”為21點,誰先湊成21誰就勝利。如果沒有人湊到21點,就規定最接近21點且小於21點的一方為勝者,每人均可要數次牌,需要注意的是,如果點數和超出21點,就是爆掉了(輸了)

二、功能實現

本次遊戲的實現一共分為三各類。 分別為:Play(玩家類) 、Poker:(撲克類) 以及RunGame(主遊戲介面類)。

Play(玩家類) :

import
java.util.Arrays; public class Play { private String name; private Poker[] pokers; public Play() {} public Play(String name) { super(); this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Poker[] getPokers
() { return pokers; } public void setPoker(Poker[] pokers) { this.pokers=pokers; } @Override public String toString() { String info="[暗牌,"; for (int i = 0; i < pokers.length; i++) { info+=pokers[i].toString(); if(i!=pokers.length-1) { info+=","; }
} return this.name+"\n"+ info+"]"; } public String getInfo() { return this.name+":\n"+ Arrays.toString(this.pokers); } /** * 計算點數 */ public int getPointers() { int pointers=0; int countA=0; for(Poker poker:pokers) { //判斷是否為A if(poker.getNumber()==1) { pointers+=11; countA++; }else if(poker.getNumber()>10) { pointers+=10; }else { pointers+=poker.getNumber(); } } //判斷總點數是否大於21,如果是則減去含有A個數的10 if(pointers>21) { pointers-=countA*10; } return pointers; } /** * 收牌 */ void getPoker(Poker poker) { if(this.pokers==null) { this.pokers=new Poker[1]; }else { //新建陣列 Poker[] newArray=new Poker[pokers.length+1]; //將原有牌賦予新陣列 for (int i = 0; i < pokers.length; i++) { newArray[i]=pokers[i]; } //讓撲克陣列,指向新陣列 pokers=newArray; } //將新牌賦予最後一個數組位置 pokers[pokers.length-1]=poker; } }

Poker:(撲克類)

public class Poker implements Comparable {
	    //花色四種:0-3
	    private int type;
	    //點數:1-13
	    private int number;

	    public Poker() {}

	    public Poker(int type, int number) {
	        this.type = 0;
	        this.number = 1;
	        if (type < 0 || type > 3 || this.number < 1 || this.number > 13) {
	            return;
	        }
	        this.type = type;
	        this.number = number;
	    }

	    public int getType() {
			return type;
		}

		public void setType(int type) {
			this.type = type;
		}

		public int getNumber() {
			return number;
		}

		public void setNumber(int number) {
			this.number = number;
		}

		@Override
	    public String toString() {
	        String[] types = {"♠", "♥", "♣", "♦"};
	        String[] pointers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
	        return types[this.type] + pointers[this.number-1];
	    }

		@Override
		public int compareTo(Object o) {
			if(o==null) {
				return -1;
			}
			if(!(o instanceof Poker)) {
				return -1;
			}
			if(Math.random()>=0.5) {
				return 1;
			}
			return -1;
		}
		
	}

RunGame(主遊戲介面類)

import java.util.Arrays;
import javax.swing.JOptionPane;


public class RunGame {
	//玩家
	private static Play mine;
	//電腦
	private static Play computer;
	//撲克
	private static Poker[] pokers;
	// 當前可以發牌的位置
	private static int pokersIndex = 0;
	// 計算機要牌的上限
	private static int LIMIT_POINTER = 10;

	public static void main(String[] args) {
		// 初始化遊戲
		initGame();
		// 顯示介面
		viewGame();
	}

	/**
	 * 顯示介面
	 */
	private static void viewGame() {
		boolean flage=true;
		while(flage) {
			   String info="---------------21點遊戲-----------------\n"+
						computer+"\n"+mine.getInfo()+"\n"+"1\t要牌\t2.停牌";
				
				String input=JOptionPane.showInputDialog(info);
				if(input==null||input.trim().isEmpty()) {
					JOptionPane.showMessageDialog(null, "請正確輸入");
					continue;
				}
				switch(input.trim().charAt(0)){
				case '1':
					//自己要牌
					mine.getPoker(pokers[pokersIndex++]);
					//電腦要牌
					if(computer.getPointers()<LIMIT_POINTER) {
						computer.getPoker(pokers[pokersIndex++]);
					}
					break;
				case '2':
					//電腦判斷是否需要牌
					while(computer.getPointers()<LIMIT_POINTER) {
						computer.getPoker(pokers[pokersIndex++]);
					}
					//判斷輸贏
					boolean isWin=true;
					if(computer.getPointers()==21) {
						//判斷誰是 black jack 誰贏,如果都是 black jack 則電腦贏。
						isWin=false;
					}else if(mine.getPointers()>21) {
						isWin=false;
					}else if(computer.getPointers() < 21) {
						isWin=mine.getPointers()>computer.getPointers();
					}
					//比較點數,提示結果
					info="---------你"+(isWin?"贏了":"輸了")+"--------------------\n"+
							computer.getInfo()+" :"+computer.getPointers()+"\n"+
							mine.getInfo()+" :"+mine.getPointers()+"點";
					JOptionPane.showMessageDialog(null, info);
					//結束遊戲
					flage=false;
					break;
				default:
					JOptionPane.showMessageDialog(null, "請正確輸入");
					continue;
				}
			}	
	}

	/**
	 * 初始化遊戲
	 */
	private static void initGame() {
		// 構建一副撲克並且洗牌
		initPokers();
		// 輸入玩家姓名
		String playerName = JOptionPane.showInputDialog("請輸入你的名字");
		if (playerName == null || playerName.trim().isEmpty()) {
			playerName = "匿名";
		}
		mine = new Play(playerName);
		// 建立電腦玩家
		computer = new Play("高進");

		// 初始化,每人發兩張牌
		computer.getPoker(pokers[pokersIndex++]);
		mine.getPoker(pokers[pokersIndex++]);
		computer.getPoker(pokers[pokersIndex++]);
		mine.getPoker(pokers[pokersIndex++]);
	}

	/**
	 * 構建一副撲克並且洗牌
	 */
	private static void initPokers() {
		 pokers = new Poker[52];
		// 迴圈花色
		for (int i = 0; i < 4; i++) {
			// 迴圈點數
			for (int j = 1; j < 14; j++) {
				int index = i * 13 + j - 1;
				pokers[index] = new Poker(i, j);
			}
		}
		// 洗牌
		/*for (int i = 0; i < 36; i++) {
			int posi1 = (int) (Math.random() * 52);
			int posi2 = (int) (Math.random() * 52);
			swap(pokers, posi1, posi2);
		}*/	
		//利用Comparable介面實現洗牌
		Arrays.sort(pokers);
	}

	private static void swap(Poker[] pokers, int posi1, int posi2) {
		Poker temp = pokers[posi1];
		pokers[posi1] = pokers[posi2];
		pokers[posi2] = temp;
	}

}

三、效果展示

1.首先需要輸入玩家的名字,如果不輸入就會以“匿名”的身份進行遊戲。
在這裡插入圖片描述
2.玩家選擇是否繼續要牌,如果要則輸入1,如果停牌則輸入2。這裡如果玩家選擇停牌的話,電腦會進行判斷是否繼續要牌
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

四、總結

本次實現的21點小遊戲,主要使用Swing元件以及面向物件的思想,遊戲本身涉及的技術點不是很多,但是通過這一點一滴小的練習,可以提高自己對以後更深層次學習的興趣,也是對動手能力的鍛鍊,繼續加油,然後禿見成效!!
在這裡插入圖片描述