完整代码在最后面.
运行截图
首先,21点游戏的游戏需要,:
玩家和庄家两个数组(若是多个玩家则增加数组,并把原玩家代码进行复制粘贴,再修改一点点就好),并且游戏开局,先发庄家一张牌,玩家两张牌,10,J,Q,K全部看做10,但是依旧要输出JQK.
开头以及庄家拿牌代码段:
int[] banker=new int[10];//庄家
int[] player=new int[10];//玩家
banker[0]=(int) (Math.random()*12+1);//1~K为1~13点
switch (banker[0]) {//把JQK的点输出文字
case 11:
System.out.println("庄家拿到的牌为:J");
break;
case 12:
System.out.println("庄家拿到的牌为:Q");
break;
case 13:
System.out.println("庄家拿到的牌为:K");
break;
default:
System.out.println("庄家拿到的牌为:" + banker[0]);
}
if(banker[0]>10){//数组只记录JQK本身的值为10
banker[0]=10;
}
玩家拿牌代码段:
for (int j = 0; j < 2; j++) {
player[j]=(int) (Math.random()*12+1);//玩家获取两张牌
switch (player[j]) {//同理前面
case 11:
System.out.println("玩家拿到的牌为:J");
break;
case 12:
System.out.println("玩家拿到的牌为:Q");
break;
case 13:
System.out.println("玩家拿到的牌为:K");
break;
default:
System.out.println("玩家拿到的牌为:" + player[j]);
}
if (player[j] > 10) {//JQK转为数组里面的10
player[j] = 10;
}
}
设置一个选择值choose,来判断玩家是否选择拿牌.
并且a记录玩家数组从数组第三个元素开始记录,
以及final判断玩家拿牌过程中是否直接爆掉或者直接21点,免去后续的代码运行,
Can判断前面是否因为1加10后爆掉的给个机会减10,后面的不再需要,两个一也只加了一次10
int choose;//判断玩家是否拿牌
int a=2,Final=0;//a是数组下标,Final判断是否已经爆掉或者21点
int I=player[0]+player[1];//总点数
int Can=1;//参数是否因为1已经减过一次10
do {//用do...while是最好的,因为要直接先问玩家是否拿牌,而for和while循环要先判断一个条件
Scanner scanner = new Scanner(System.in);
System.out.println("玩家是否继续拿牌");
choose = scanner.nextInt();//判断玩家是否拿牌
if(choose==1) {//判断玩家是否拿牌
player[a] = (int) (Math.random() * 12 + 1);
switch (player[a]) {
case 11:
System.out.println("玩家拿到的牌为:J");
break;
case 12:
System.out.println("玩家拿到的牌为:Q");
break;
case 13:
System.out.println("玩家拿到的牌为:K");
break;
default:
System.out.println("玩家拿到的牌为:" + player[a]);
}
if (player[a] > 10) {
player[a] = 10;
}
I += player[a];
}
if (I == 21 || (player[a] == 1 && I == 11)||(player[0]==1&&player[1]==10)||
(player[0]==10&&player[1]==1)) {
//判断是否已经21点,比如第一和第二张牌是1和10就不拿牌到这里判断(或许能移到前面)
System.out.println("玩家获胜");
Final = 1;//Final判断是否已经爆掉或者21点
I=21;
break;
} else if (I > 21) {
for (int i = 0; i < banker[i]&&Can==1; i++) {
//判断大于21的时候数组里面是否有1
if(banker[i]==1){
I-=10;
Can=0;//如果有就总值减10,修改Can参数
break;
}
}
if (Can == 1) {
Final = 1;//Final判断是否已经爆掉或者21点
System.out.println("庄家获胜");
break;
}
} else if (Can==1&&(player[0]==1 || player[1]==1 ||player[a] == 1 )&& I < 11)
//不可能一开始就爆了,所以在后面判断新获得的牌是否为1且总值小于11
{
I += 10;
}
a++;
}while (choose == 1 && a < 10);//不拿牌就不继续下去
System.out.println("玩家的点数和为:"+I);
设置庄家的总值,并且依照玩家一样设置参数,和玩家的主题代码差不多
int O=banker[0];//O是庄家的总值
int M=0;//一个参数M
int can=1;//参数can判断是否减过1次10
for(int j=1;O<=I&&Final==0&&can==1;j++) {//如果前面已经出了结果则不再运行
banker[j] = (int) (Math.random() * 12 + 1);
switch (banker[j]) {
case 11:
System.out.println("庄家拿到的牌为:J");
break;
case 12:
System.out.println("庄家拿到的牌为:Q");
break;
case 13:
System.out.println("庄家拿到的牌为:K");
break;
default:
System.out.println("庄家拿到的牌为:" + banker[j]);
}
if (banker[j] > 10) {
banker[j] = 10;
}
O += banker[j];
if (can==1&&(banker[0]==1 || banker[1]==1 ||banker[j] == 1 )&& O < 11) {
//can没被改过才允许加10
O += 10;
}
if(O>21){
for (int i = 0; i < banker.length&&can==1; i++) {//遍历是否有1,且没修改can
if(banker[i]==1){
O-=10;
can=0;
break;
}
}
}
if (O>21&&can == 1) {
//如果can没有被修改且大于21则玩家获胜,这个时候已经减过10了,庄家也爆了
System.out.println("庄家的点数为:"+O);
System.out.println("玩家获胜");
M=1;
}
}
if(Final==0&&M==0) {
//如果最后没有Final过且M也没有修改过庄家获胜,这个时候就是庄家的点大于玩家的点且不爆
System.out.println("庄家的点数为:"+O);
System.out.println("庄家获胜");
}
总代码:
package Test.game21dian;
import java.util.Arrays;
import java.util.Scanner;
public class game21 {
public static void main(String[] args) {
int[] banker=new int[10];
int[] player=new int[10];
banker[0]=(int) (Math.random()*12+1);
switch (banker[0]) {
case 11:
System.out.println("庄家拿到的牌为:J");
break;
case 12:
System.out.println("庄家拿到的牌为:Q");
break;
case 13:
System.out.println("庄家拿到的牌为:K");
break;
default:
System.out.println("庄家拿到的牌为:" + banker[0]);
}
if(banker[0]>10){
banker[0]=10;
}
for (int j = 0; j < 2; j++) {
player[j]=(int) (Math.random()*12+1);
switch (player[j]) {
case 11:
System.out.println("玩家拿到的牌为:J");
break;
case 12:
System.out.println("玩家拿到的牌为:Q");
break;
case 13:
System.out.println("玩家拿到的牌为:K");
break;
default:
System.out.println("玩家拿到的牌为:" + player[j]);
}
if (player[j] > 10) {
player[j] = 10;
}
}
int choose;
int a=2,Final=0;
int I=player[0]+player[1];
int Can=1;
do {
Scanner scanner = new Scanner(System.in);
System.out.println("玩家是否继续拿牌");
choose = scanner.nextInt();
if(choose==1) {
player[a] = (int) (Math.random() * 12 + 1);
switch (player[a]) {
case 11:
System.out.println("玩家拿到的牌为:J");
break;
case 12:
System.out.println("玩家拿到的牌为:Q");
break;
case 13:
System.out.println("玩家拿到的牌为:K");
break;
default:
System.out.println("玩家拿到的牌为:" + player[a]);
}
if (player[a] > 10) {
player[a] = 10;
}
I += player[a];
}
if (I == 21 || (player[a] == 1 && I == 11)||(player[0]==1&&player[1]==10)||(player[0]==10&&player[1]==1)) {
System.out.println("玩家获胜");
Final = 1;
I=21;
break;
} else if (I > 21) {
for (int i = 0; i < banker[i]&&Can==1; i++) {
if(banker[i]==1){
I-=10;
Can=0;
break;
}
}
if (Can == 1) {
Final = 1;
System.out.println("庄家获胜");
break;
}
} else if (Can==1&&(player[0]==1 || player[1]==1 ||player[a] == 1 )&& I < 11) {
I += 10;
}
a++;
}while (choose == 1 && a < 10);
System.out.println("玩家的点数和为:"+I);
int O=banker[0];
int M=0;
int can=1;
for(int j=1;O<=I&&Final==0&&can==1;j++) {
banker[j] = (int) (Math.random() * 12 + 1);
switch (banker[j]) {
case 11:
System.out.println("庄家拿到的牌为:J");
break;
case 12:
System.out.println("庄家拿到的牌为:Q");
break;
case 13:
System.out.println("庄家拿到的牌为:K");
break;
default:
System.out.println("庄家拿到的牌为:" + banker[j]);
}
if (banker[j] > 10) {
banker[j] = 10;
}
O += banker[j];
if (can==1&&(banker[0]==1 || banker[1]==1 ||banker[j] == 1 )&& O < 11) {
O += 10;
}
if(O>21){
for (int i = 0; i < banker.length && can==1; i++) {
if(banker[i]==1){
O-=10;
can=0;
break;
}
}
}
if (O>21&&can == 1) {
System.out.println("庄家的点数为:"+O);
System.out.println("玩家获胜");
M=1;
}
}
if(Final==0&&M==0) {
System.out.println("庄家的点数为:"+O);
System.out.println("庄家获胜");
}
}
}