参加游戏者以庄家所发牌给的点数和与 21 比较 超过 21 点的自然判输 小于 21 点,与计算机庄家比较点数,所有点数不同,谁与 21 点数差值小,为赢家 若相同,发一张牌,比较与 21 点差的绝对值,谁小谁赢 庄家发给下家牌,下家可要可不要。
A-10 为一种类型,以实际数值计算点数。 J\Q\K 为一种类型,点数为 1 点 发牌时拍的花色(4 种)等不能出现重复牌现象。 总发牌数: 52 张, 每种花色 13 张。
玩家1 --》牌(一维数组)
玩家2 --》牌(一维数组)
游戏规则
玩家
随机数 | 实际牌 | 代表数 |
---|---|---|
01–04 | A | 1 |
05–08 | 2 | 2 |
09–12 | 3 | 3 |
13–16 | 4 | 4 |
17–20 | 5 | 5 |
21–24 | 6 | 6 |
25–28 | 7 | 7 |
29–32 | 8 | 8 |
33–36 | 9 | 9 |
37–40 | 10 | 10 |
41–44 | J | 1 |
45–48 | Q | 1 |
49–52 | K | 1 |
随机数在1–>53之内取的,玩家手中显示牌为实际牌,在计算时用代表数
首先每人发两张牌(你一张我一张),根据牌的大小可选择【要牌】【不要牌】
每次发牌或者要牌后都要进行【牌代表的数的和是否小于或等于21点】的比较
超过21点,则爆掉,该玩家分数-1,另一玩家分数+1。
----》先给谁发?一张一张的发。⇦(我看着这里有点别扭)
方法一:
- 动态数组作为属性,发牌时如果从52张牌中随到的数在该动态数组中能找到。便重新随机查找
方法二:
- 所有牌作为一个数组存在1 2 3 4 5 …52 从当中随机抽取一个数分给玩家中的数组中
玩家类
import java.util.ArrayList;
/**
* 玩家类
* @author DELL
*
*/
public class Player {
private String name;//玩家名
private ArrayList<Integer> al = new ArrayList<Integer>();//牌
private int score;//玩家得分
//构造方法
public Player() {
super();
}
public Player(String name, int score) {
super();
this.name = name;
this.score = score;
}
//setter getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Integer> getArr() {
return al;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
规则类
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Random;
/**
* 游戏规则
* @author DELL
*/
public class Rules {
/**
* 开始游戏
*/
public void GameStart(){
//这是所有的牌
ArrayList<Integer> allBrand = new ArrayList<Integer>();
for(int i=1;i<53;i++){
allBrand.add(i);
}
Player player1=new Player();
Player player2=new Player();
System.out.println("**************************");
System.out.println("$ $");
System.out.println("$ 欢迎进入21点游戏 $");
System.out.println("$ $");
System.out.println("**************************");
Scanner sc=new Scanner(System.in);
System.out.println("\t请按任意键开始游戏...");
sc.nextLine();
player1.setName("玩家1");
player2.setName("玩家2");
//发牌
Licensing(allBrand,player1,player2);
//显示玩家手中的牌
showBrand(player1,player2);
//计算得分
Calculation( player1, player2);
//玩家一是否要牌
//玩家二是否要牌
needBrand(allBrand,player1,player2);
//全不要牌后开始比较
compare(player1, player2);
}
/**
*
* @param player1
* @param player2
* 比较
*/
public void compare(Player player1,Player player2){
if(player1.getScore()>player2.getScore()&&player1.getScore()<=21 ){
System.out.println("恭喜玩家1获得胜利");
}else if(player1.getScore()<player2.getScore()&&player2.getScore()<=21){
System.out.println("恭喜玩家2获得胜利");
}
}
/**
*
* @param allBrand
* @param player1
* @param player2
* 要牌
*/
public void needBrand(ArrayList<Integer> allBrand,Player player1,Player player2){
Random rd=new Random();
int choice;
int choice1;
do{
//player1
System.out.println("玩家1是否要牌?");
System.out.println("1.是\t2.否");
Scanner sc=new Scanner(System.in);
choice=sc.nextInt();
switch (choice) {
case 1:
int a=rd.nextInt(allBrand.size());
player1.getArr().add(allBrand.get(a));
allBrand.remove(a);
showBrand(player1,player2);
Calculation( player1, player2);
break;
case 2:
break;
default:
System.out.println("您输入的参数有误请重新输入...");
break;
}
//player2
System.out.println("玩家2是否要牌?");
System.out.println("1.是\t2.否");
choice1=sc.nextInt();
switch (choice1) {
case 1:
int b=rd.nextInt(allBrand.size());
player2.getArr().add(allBrand.get(b));
allBrand.remove(b);
//显示玩家手中的牌
showBrand(player1,player2);
//计算得分
Calculation( player1, player2);
break;
case 2:
break;
default:
System.out.println("您输入的参数有误请重新输入...");
break;
}
}while(choice==1||choice1==1);
}
/**
*
* @param player1
* @param player2
* 计算得分
*/
public void Calculation(Player player1,Player player2){
System.out.println();
int temp=0;
for(int i=0;i<player1.getArr().size();i++){
temp+=brandNumber(player1.getArr().get(i));
player1.setScore(temp);
}
temp=0;
System.out.println("玩家1的分数为:"+player1.getScore());
for(int i=0;i<player2.getArr().size();i++){
temp+=brandNumber(player2.getArr().get(i));
player2.setScore(temp);
}
System.out.println("玩家2的分数为:"+player2.getScore());
}
/**
*
* @param i
* @return牌代表的数字
*/
public int brandNumber(int i){
if(i<=4 &&i>0){
return 1;
}else if(i<=8){
return 2;
}else if(i<=12){
return 3;
}else if(i<=16){
return 4;
}else if(i<=20){
return 5;
}else if(i<=24){
return 6;
}else if(i<=28){
return 7;
}else if(i<=32){
return 8;
}else if(i<=36){
return 9;
}else if(i<=40){
return 10;
}else if(i<=44){
return 1;
}else if(i<=48){
return 1;
}else if(i<=52){
return 1;
}
return 0;
}
/**
*
* @param player1
* @param player2
* @see显示玩家手中的牌
*/
public void showBrand(Player player1,Player player2){
System.out.print("玩家1手中的牌为:");
for(int i=0;i<player1.getArr().size();i++){
BrandFace(player1.getArr().get(i), player1, player2);
System.out.print("\t");
}
System.out.println();
System.out.print("玩家2手中的牌为:");
for(int i=0;i<player2.getArr().size();i++){
BrandFace(player2.getArr().get(i), player1, player2);
System.out.print("\t");
}
}
/**
*
* @param i
* @param player1
* @param player2
* @see显示牌面
*/
public void BrandFace(int i,Player player1,Player player2){
if(i<=4 &&i>0){
System.out.print("A");
}else if(i<=8){
System.out.print("2");
}else if(i<=12){
System.out.print("3");
}else if(i<=16){
System.out.print("4");
}else if(i<=20){
System.out.print("5");
}else if(i<=24){
System.out.print("6");
}else if(i<=28){
System.out.print("7");
}else if(i<=32){
System.out.print("8");
}else if(i<=36){
System.out.print("9");
}else if(i<=40){
System.out.print("10");
}else if(i<=44){
System.out.print("J");
}else if(i<=48){
System.out.print("Q");
}else if(i<=52){
System.out.print("K");
}
}
/**
*
* @param allBrand
* @param player1
* @param player2
* 发牌
*/
public void Licensing(ArrayList<Integer> allBrand,Player player1,Player player2){
Random rd=new Random();
int first=rd.nextInt(allBrand.size());
player1.getArr().add(allBrand.get(first));
allBrand.remove(first);
int second=rd.nextInt(allBrand.size());
player1.getArr().add(allBrand.get(second));
allBrand.remove(second);
int third=rd.nextInt(allBrand.size());
player2.getArr().add(allBrand.get(third));
allBrand.remove(third);
int fourth=rd.nextInt(allBrand.size());
player2.getArr().add(allBrand.get(fourth));
allBrand.remove(fourth);
}
/**
* 尚未实现功能
*
* 石头剪刀布确定是不是玩家1先得到牌
*
*
public boolean First(){
Random rd=new Random();
1 石头 2 剪刀 3 布
int first;
int second;
do {
first=rd.nextInt(3)+1;
second=rd.nextInt(3)+1;
} while (first==second);
if(first==1){
if(second==2){
return true;
}
if(second==3){
return false;
}
}
if(first==2){
if (second==1) {
return false;
}
if (second==3) {
return true;
}
}
if (first==3) {
if (second==1) {
return true;
}
if (second==2) {
return false;
}
}
return false;
}
*
*/
}
测试类
这个测试类着实有点不能见人ε(┬┬﹏┬┬)3
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/**
* 测试类
* @author DELL
*
*/
public class Test {
public static void main(String[] args) {
Rules rules=new Rules();
rules.GameStart();
}
}
- 未实现根据锤头剪刀布决定先给谁发牌的功能
- 程序在运行时在某个人手中的牌点数爆掉了之后,仍需另一人选择是否出牌,而不是直接决定输赢
- 程序仍需优化,程序结构不明显,可读性相对来说不强
- 如果仍有错误望各位大神们指出来哦(✿◕‿◕✿)