21點的基本知識
21點是世界上比較流行的撲克游戲項目
除掉大小王的一副撲克牌,共計52張牌
21點不區分花色,其中A----10均代表撲克牌本身的點數J Q K代表10點
區分庄家和閑家,其中閑家可以優先要牌 而庄家在與閑家點數一樣大的情況下,庄家贏,當有一方點數超過21點則另一方自動獲勝,庄家的點數如果正好是21點,那么庄家直接獲勝,其他情況以點數大的獲勝
流程設計:
人機對戰模式!
1由用戶輸入選擇作庄還是作閑,電腦自動成為另一方
2隨機為雙方發兩張牌
3詢問閑家是否要牌,一直到閑家不再要或者發生暴點為止
4詢問庄家要牌,一直到庄家不再要或者暴點或者正好21點為止
5比較游戲輸贏
6詢問是否繼續
7統計戰果
技術問題:
1. 發牌的時候隨機發取
2. 發牌出來還要判斷是否本張牌已經發過了!如果已經發過了,那么就要重新隨機發另外一張牌,要保證牌的唯一性
3. 當給電腦派牌的時候 要考慮AI的問題!讓電腦的邏輯稍微模擬人的思維
主類:
import java.util.Scanner;
public class CardTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int win = 0;
int lose = 0;
while (true) {
System.out.println("請問做庄家1/閑家2?");
int num = sc.nextInt();
if (num == 1) {
System.out.println("你選擇做庄家");
Ruler r = new Ruler();
int n=r.play();
if(n==0) {
//庄家贏
win++;
}
else
lose++;
} else if (num == 2) {
System.out.println("你選擇做閑家");
Player p = new Player();
int n= p.play();
if(n==1) {
//閑家贏
win++;
}
else
lose++;
} else {
System.out.println("輸入錯誤,重新輸入");
}
System.out.println("是否繼續Y/N");
if (sc.next().charAt(0) == 'Y')
continue;
else {
System.out.println("游戲結束");
System.out.println("贏:"+win);
System.out.println("輸:"+lose);
break;
}
}
}
}
import java.util.Random;
public class Card {
int index = 0; // 發牌索引下標
String[] card = { "紅桃A", "紅桃2", "紅桃3", "紅桃4", "紅桃5", "紅桃6", "紅桃7", "紅桃8",
"紅桃9", "紅桃10", "紅桃J", "紅桃Q", "紅桃K",
"黑桃A",
"黑桃2", "黑桃3", "黑桃4", "黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K",
"梅花A", "梅花2", "梅花3",
"梅花4", "梅花5", "梅花6", "梅花7", "梅花8", "梅花9", "梅花10", "梅花J", "梅花Q", "梅花K", "方片A", "方片2", "方片3", "方片4", "方片5",
"方片6", "方片7", "方片8", "方片9", "方片10", "方片J", "方片Q", "方片K", };
public void show() {
for (int i = 0; i < 52; i++) {
System.out.println(card[i]);
}
}
// 洗牌,打亂牌的順序
public void cutcards() {
int index=0;
Random rand = new Random();
for (int i = 0; i < 52; i++) {
int n = rand.nextInt(52);
String temp;
temp = card[n];
card[n] = card[51 - n];
card[51 - n] = temp;
}
}
// 發牌,按順序發牌,從下標0開始
public String deal() {
String c = card[index];
index++;
return c;
}
}
public class JudgeNum {
public int judgeString(String num) {
String word= num.substring(2);
if(word.equals("A")) {
return 1;
}
else if(num.substring(2).equals("J")||
num.substring(2).equals("Q")||
num.substring(2).equals("K")||
num.substring(2).equals("10")) {
return 10;
}
else {
int n=(int)num.substring(2).charAt(0)-48;
return n;
}
}
}
import java.util.Random;
import java.util.Scanner;
public class Player {
/*
* 選擇做閑家
先得牌
您選擇: 閑家
發牌時間:
閑家:紅桃K 方片3
庄家:黑桃6 梅花4
* 閑家要牌時間:
閑家是否要牌(Y/N)?
Y
發牌:黑桃A
* 閑家是否要牌(Y/N)?
Y 發牌:梅花5 閑家是否要牌(Y/N)?
N 閑家不再要牌:
閑家點數:19點
庄家要牌時間:
庄家要牌:梅花5
* 庄家要牌:黑桃4
庄家不再要牌:
庄家點數19點 庄贏
*
*
*
*/
Scanner sc= new Scanner(System.in);
public int play() {
int playernum=0;
int rulernum=0;
String player1;
String player2;
String ruler1;
String ruler2;
JudgeNum judge = new JudgeNum();
Card c = new Card();
c.cutcards();
player1 = c.deal();
player2 = c.deal();
System.out.println("發牌時間:");
System.out.println("閑家:" + player1 + " " + player2);
playernum=judge.judgeString(player1)+judge.judgeString(player2);
ruler1 = c.deal();
ruler2 = c.deal();
System.out.println("庄家:" + ruler1 + " " + ruler2);
rulernum=judge.judgeString(ruler1)+judge.judgeString(ruler2);
System.out.println("閑家點數:"+playernum);
System.out.println("庄家點數:"+rulernum);
System.out.println("閑家要牌時間: " );
//循環要牌階段
while(true) {
System.out.println("閑家是否要牌(Y/N)? " );
char w = sc.next().charAt(0);
if(w=='Y') {
System.out.println("閑家繼續要牌");
String player3=c.deal();
System.out.println("閑家: "+player3 );
playernum=playernum+judge.judgeString(player3);
System.out.println("閑家點數:"+playernum);
if(playernum>21)
{
System.out.println("閑家爆掉,庄家贏");
return 0;
}
}
else if(w=='N') {
System.out.println("閑家不再要牌,閑家點數:"+playernum);
break;
}
}
System.out.println("庄家要牌時間");
while(true) {
if(rulernum>=playernum) {
System.out.println("庄家不再要牌,庄家贏");
return 0;
}
else {
System.out.println("庄家要牌時間:");
String ruler3=c.deal();
System.out.println("庄家:"+ruler3);
rulernum=rulernum+judge.judgeString(ruler3);
if(rulernum>21) {
System.out.println("庄家點數"+rulernum);
System.out.println("庄家爆掉,閑家贏");
return 1;
}
else if(rulernum>=playernum) {
System.out.println("庄家點數:"+rulernum+" 閑家點數:"+playernum);
System.out.println("庄家贏");
return 0;
}
}
}
}
}
import java.util.Scanner;
public class Ruler {
// 選擇做庄家
/*
* 閑家先要牌
*
*/
Scanner sc = new Scanner(System.in);
public int play() {
int playernum = 0;
int rulernum = 0;
String player1;
String player2;
String ruler1;
String ruler2;
JudgeNum judge = new JudgeNum();
Card c = new Card();
c.cutcards();
player1 = c.deal();
player2 = c.deal();
System.out.println("發牌時間:");
System.out.println("閑家:" + player1 + " " + player2);
playernum = judge.judgeString(player1) + judge.judgeString(player2);
ruler1 = c.deal();
ruler2 = c.deal();
System.out.println("庄家:" + ruler1 + " " + ruler2);
rulernum = judge.judgeString(ruler1) + judge.judgeString(ruler2);
System.out.println("閑家點數:" + playernum);
System.out.println("庄家點數:" + rulernum);
System.out.println("閑家要牌時間:");
while (true) {
String player3;
if (playernum <rulernum) {
System.out.println("閑家要牌");
player3 = c.deal();
System.out.println("閑家:" + player3);
playernum = playernum + judge.judgeString(player3);
} else if (playernum > 21) {
System.out.println("閑家點數:" + playernum);
System.out.println("閑家爆掉,庄家贏");
return 0;
} else if (playernum >= 15) {
System.out.println("閑家不再要牌");
System.out.println("閑家點數" + playernum);
break;
}else {
System.out.println("閑家要牌");
String player4 = c.deal();
System.out.println("閑家:" + player4);
playernum=playernum+judge.judgeString(player4);
if (playernum > 21) {
System.out.println("閑家點數:" + playernum);
System.out.println("閑家爆掉,庄家贏");
return 0;
}
}
}
// 庄家要牌時間
System.out.println("庄家要牌時間:");
while (true) {
System.out.println("庄家是否要牌(Y/N)");
char w = sc.next().charAt(0);
if (w == 'Y') {
System.out.println("庄家繼續要牌");
String ruler3 = c.deal();
System.out.println("庄家: " + ruler3);
rulernum = rulernum + judge.judgeString(ruler3);
System.out.println("庄家點數:" + rulernum);
if (rulernum > 21) {
System.out.println("庄家爆掉,閑家贏");
return 1;
}
} else if (w == 'N') {
System.out.println("庄家不再要牌,庄家點數:" + rulernum);
break;
}
}
if (rulernum >= playernum) {
System.out.println("庄家贏");
return 0;
} else {
System.out.println("閑家贏");
return 1;
}
}
}
