Java實現簡易21點比大小遊戲。(玩家VS電腦)
阿新 • • 發佈:2021-01-31
一、遊戲背景
參賽人數: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元件以及面向物件的思想,遊戲本身涉及的技術點不是很多,但是通過這一點一滴小的練習,可以提高自己對以後更深層次學習的興趣,也是對動手能力的鍛鍊,繼續加油,然後禿見成效!!