Java扑克牌小游戏

时间:2022-12-13 16:27:18

 一、游戏规则如下:

1.创建一副扑克牌,包括2-10,J,Q,K,A.四种花色黑红梅方。无大小王

 2.创建两名玩家,有ID,姓名,手牌等属性,手牌为扑克牌的集合
3.洗牌。将之前创建的扑克牌打乱顺序

4.发牌。洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人两张

5.游戏,比较两名玩家手中的扑克牌,规则为:取两人各自手中点数最大的牌进行比较,点数大的赢;

 若两人各自的点数最大的牌相等,则再按花色比较。

二、思路

1.创建Player、Card、Game、CardDemo类

三、代码

package com.****.tim;
/*
*主类
*/
 public class CardDemo {
	public static void main(String[] args){
		Game game = new Game();

		game.cardCreat();
		game.playerCreat();
		game.cardShuffle();
		game.cardDeal();
		game.result();
	}
}
package com.****.tim;

import java.util.ArrayList;
import java.util.List;
/*
 * 玩家类
 */
public class Player {
	/*
	 * 属性
	 */
	private String name;
	private int id;

	//用于储存玩家手牌
	List<Card> cardList;


	/*
	 * 构造器初始化玩家
	 */
	public Player(String name,int id){
		this.setId(id);
		this.setName(name);
		cardList = new ArrayList<Card>();
	}
	
	@Override
	public String toString() {
		return "玩家" + id  + name;
	}
/*
 * 封装
 */
	protected String getName() {
		return name;
	}
	protected void setName(String name) {
		this.name = name;
	}
	protected int getId() {
		return id;
	}
	protected void setId(int id) {
		this.id = id;
	}

}
package com.****.tim;

/*
 * 扑克牌类
 */
public class Card {
	/*
	 * 属性
	 */
	private String color;
	private String number;
	/*
	 * 构造器中初始化card属性
	 */
	public Card(String number,String color){
		this.setColor(color);
		this.setNumber(number);
	}

	/*
	 * 重写toString方法,输出一副扑克牌信息
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return color + number;
	}

	protected String getColor() {
		return color;
	}

	protected void setColor(String color) {
		this.color = color;
	}

	protected String getNumber() {
		return number;
	}

	protected void setNumber(String number) {
		this.number = number;
	}
}

package com.****.tim;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Game{
	/*
	 * 全局变量
	 * 创建两个数组,用于存放扑克牌的花色和数字。
	 * 声明扑克牌和玩家对象List,创建一个Scanner对象
	 */
	String[] colors =  {"方块","梅花","红桃","黑桃"};
	String[] numbers = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
	List<Card> cardList;
	List<Player> playerList;
	Scanner console = new Scanner(System.in);
	/*
	 *在构造器中初始化玩家和扑克牌的List 
	 */
	public Game(){
		cardList = new ArrayList<Card>();
		playerList = new ArrayList<Player>();
	}
	/*
	 * 创建一副扑克牌的方法
	 */
	public void cardCreat(){
		//创建一个数组,用于盛装52张扑克牌
		Card[] cards = new Card[52];
		int k = 0;
		/*
		 * for循环产生52张扑克牌,并添加至cardList中,然后打印输出
		 */
		for(int i = 0;i < colors.length;i++){
			for(int j = 0;j < numbers.length;j ++){
				String color = colors[i];
				String number = numbers[j];
				cards[k] = new Card(number,color);
				k++;
			}
		}
		cardList.addAll(Arrays.asList(cards));
		System.out.println("-------------创建扑克牌成功!-------------");
		for(Card cds : cards){
			System.out.print(cds + " ");
		}
		System.out.println();
	}
	
	/*
	 *创建两名玩家的方法
	 */
	public void playerCreat(){
        /*
         * 创建两名玩家,并将其添加至playerList中,并打印输出
         */
        
        for(int i = 0;i < 2;i ++){
            System.out.println("请输入玩家" + (i+1) + "ID:");
            int id;
            while(true){
                try{
                    id = scanInt();
                    break;
                }catch(Exception e){
                    System.out.println(e.getMessage());
                    continue;
                }
            }
            System.out.println("请输入玩家" + (i+1) + "姓名:");
            String name = console.next();
            Player player = new Player(name,id);
            if(!playerList.contains(player)){
                playerList.add(player);
            }
            System.out.println("创建玩家成功:");
            for(Player players : playerList){
                System.out.println(players);
            }
        }
        console.close();
    }
/*
*出现异常的方法
*/
     public int scanInt() throws Exception{ 
         try{ 
             int in = console.nextInt(); 
             return in; 
         }catch(Exception e){ 
             console = new Scanner(System.in); 
             throw new Exception("输入异常,请输入整数类型的ID"); 
         } 
    }
	/*
	 * 洗牌
	 */
	public void cardShuffle(){
		System.out.println("-------------开始洗牌-------------");
		Collections.shuffle(cardList);
	}
	/*
	 * 发牌
	 */
	public void cardDeal(){
		/*
		 * if判断保证玩家的List不为空
		 */
		if(playerList != null){
			System.out.println("-------------开始发牌-------------");
			int j = 0;
			/*
			 * for循环给玩家的cardSet属性赋值,也就是产生两位玩家两张手牌,循环打印输出两位玩家的手牌
			 */
			for(int i = 0; i < 2;i ++){
				playerList.get(0).cardList.add(cardList.get(j));
				System.out.println("玩家" + playerList.get(0).getName() + "拿牌:" 
						+ cardList.get(j).getColor() + cardList.get(j).getNumber());
				j++;
				playerList.get(1).cardList.add(cardList.get(j));
				System.out.println("玩家" + playerList.get(1).getName() + "拿牌:" 
						+ cardList.get(j).getColor() + cardList.get(j).getNumber());
				j++;
			}
			for(int i = 0;i < 2; i++){
				System.out.println("玩家" + playerList.get(i).getName() + "的手牌为");
				for(Card pc : playerList.get(i).cardList){
					System.out.println(pc);
				}
			}
		}
	}
	/*
	 * 比较两张牌的大小的方法,传入两个参数x,y,类型为Crad型
	 */
	public int compare(Card x,Card y){
		int value1 = 0,value2 = 0;//两张牌的面值0-12
		int color1 = 0,color2 = 0;//两张牌的花色0-3
		/*
		 * 依次取得两张手牌的面值和花色,进行比较。并返回int值
		 * 返回1则x大,返回2则y大
		 */
		for(int i = 0;i < 13;i ++){
			if(x.getNumber().equals(numbers[i])) 
				value1 = i;
		}
		for(int i = 0;i < 4;i ++){
			if(x.getColor().equals(colors[i])) 
				color1 = i;
		}
		for(int i = 0;i < 13;i ++){
			if(y.getNumber().equals(numbers[i])) 
				value2 = i;
		}
		for(int i = 0;i < 4;i ++){
			if(y.getColor().equals(colors[i])) 
				color2 = i;
		}
		if(value1 > value2){
			return 1;
		}else if(value1 < value2){
			return 2;
		}else{
			if(color1 > color2){
				return 1;
			}else{
				return 2;
			}
		}
	}
	/*
	 * 判断结果
	 */
	public void result(){
		int result = 0;
		Card card1,card2;//用于存放两张手牌
		Card max1,max2;//用于存放两玩家最大手牌
		//判断玩家一最大手牌
		card1 = playerList.get(0).cardList.get(0);
		card2 = playerList.get(0).cardList.get(1);
		result = compare(card1,card2);
		if(result == 1){
			System.out.println("玩家一最大的手牌是" + card1.getColor() + card1.getNumber());
			max1 = card1;
		}else{
			System.out.println("玩家一最大的手牌是" + card2.getColor() + card2.getNumber());
			max1 = card2;
		}
		//判断玩家二最大手牌
		card1 = playerList.get(1).cardList.get(0);
		card2 = playerList.get(1).cardList.get(1);
		result = compare(card1,card2);
		if(result == 1){
			System.out.println("玩家一最大的手牌是" + card1.getColor() + card1.getNumber());
			max2 = card1;
		}else{
			System.out.println("玩家一最大的手牌是" + card2.getColor() + card2.getNumber());
			max2 = card2;
		}
		//判断两玩家最大手牌的大小
		result = compare(max1,max2);
		if(result == 1)
			System.out.println("玩家" + playerList.get(0).getName() + "胜");
		if(result == 2)
			System.out.println("玩家" + playerList.get(1).getName() + "胜");
	}
}