Java程序:21点游戏,控制台界面开发

游戏分析:

游戏规则:

      参加游戏者以庄家所发牌给的点数和与 21 比较 超过 21 点的自然判输 小于 21 点,与计算机庄家比较点数,所有点数不同,谁与 21 点数差值小,为赢家 若相同,发一张牌,比较与 21 点差的绝对值,谁小谁赢 庄家发给下家牌,下家可要可不要。

计算机发牌要求 :

      A-10 为一种类型,以实际数值计算点数。 J\Q\K 为一种类型,点数为 1 点 发牌时拍的花色(4 种)等不能出现重复牌现象。 总发牌数: 52 张, 每种花色 13 张。

游戏开发说明:
对象:

          玩家1 --》牌(一维数组)
          玩家2 --》牌(一维数组)

类:

          游戏规则
          玩家

游戏流程:(牌一共52张)
发牌 (先给谁发【剪刀石头布】)
随机数实际牌代表数
01–04A1
05–0822
09–1233
13–1644
17–2055
21–2466
25–2877
29–3288
33–3699
37–401010
41–44J1
45–48Q1
49–52K1

        随机数在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();
	}
}
不足之处:
  1. 未实现根据锤头剪刀布决定先给谁发牌的功能
  2. 程序在运行时在某个人手中的牌点数爆掉了之后,仍需另一人选择是否出牌,而不是直接决定输赢
  3. 程序仍需优化,程序结构不明显,可读性相对来说不强
  4. 如果仍有错误望各位大神们指出来哦(✿◕‿◕✿)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值