一个简单的扑克牌小程序

新手一枚,最近刚学了java的集合框架,就拿来用一用(水平有限,欢迎交流)

游戏规则是:取两人各自手中点数最大的牌进行比较,点数大的赢;若两人各自的点数相等,则按花色比较。


感觉主要是以下几个方面花了一些时间,

打乱扑克顺序的洗牌,通过自定义规则比较大小,一些集合与泛型的使用,通过try..catch捕获异常来限定登录ID为整数。


首先是Card类:

/**
 * 扑克牌类
 * @author admin
 *
 */

public class Card{

    //	花色:suit
	//点数:figure
	
	public String suit;
	public String figure;
	
	/**
	 * 形参构造器
	 * @param suit
	 * @param figure
	 */
	public Card(String suit,String figure){
		this.suit = suit;
		this.figure = figure;
	}


}


玩家Player类:

import java.util.ArrayList;
import java.util.List;

/**
 * 玩家类
 * @author admin
 *
 */
public class Player {

	public int id;
	public String name;
	
	//手牌为扑克牌的集合,泛型设定为Card
	public List<Card> cards;
	
	public Player(){
		this.cards = new ArrayList<Card>();
	}
  }


最后是test:

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



public class Test {

	
	public Scanner console;
	//用于存放所有扑克的集合
	public List<Card> AllCards;
	
	Player player1 = new Player();
    Player player2 = new Player();
	
    String[] suits = {"方块","梅花","红心","黑桃"};
	String[] figures = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
	
	public Test(){
		console = new Scanner(System.in);
		this.AllCards = new ArrayList<Card>();
	}
	
	
	/**
	 * 玩家登录
	 */
	void login(){
		System.out.println("这里是登录界面:");
	    //通过try——catch捕获异常,限制输入ID为整数
		while(true){
	    	try{
	    		System.out.println("请输入第一个玩家的ID(限为数字):");
	    		String testid = console.next();
	    		player1.id=Integer.parseInt(testid);
	    		break;
		    }catch(NumberFormatException e){
		    	System.out.println("请输入正确的ID!");
		     }
	    }
        System.out.println("请输入第一个玩家的昵称:");
        player1.name = console.next();
        
	    while(true){
	    	try{
	    		System.out.println("请输入第二个玩家的ID(限为数字):");
	    		String testid = console.next();
	    		player2.id=Integer.parseInt(testid);
	    		break;
		    }catch(NumberFormatException e){
		    	System.out.println("请输入正确的ID!");
		     }
	    }
        System.out.println("请输入第二个玩家的昵称:");
        player2.name = console.next();
	}
	
	
	
	/**
	 * 创建扑克牌
	 */
	void creatCards(){
		System.out.println("----------创建扑克牌-----------");
		for(int i=0;i<4;i++){
			for(int j=0;j<13;j++){				
				AllCards.add(new Card(suits[i],figures[j]));
			}
		}
		System.out.println("---------创建成功----------");
	}
	
	/**
	 * 两张扑克牌比较大小的方法(规则是:点数大的为大,点数相同比较花色,大小顺序为:黑桃>红心>梅花>方块),
	 * 返回1代表ob1>ob2,返回-1代表ob1<ob2。
	 */
	int compare(Card cd1,Card cd2){
		int figure1 = 0;
		int figure2 = 0;
		//利用数组的下标来比较大小,下标大的就大
		for(int i=0;i<13;i++){
			//先获取其在数组中的下标
			if(cd1.figure == figures[i]){
				figure1=i;
			}
			if(cd2.figure == figures[i]){
				figure2=i;
			}
		}
		//比较大小
		if(figure1>figure2){
			return 1;
		}else if(figure1==figure2){
			for(int i=0;i<4;i++){
				if(cd1.suit == suits[i]){
					figure1=i;
				}
				if(cd2.suit == suits[i]){
					figure2=i;
				}
			}
			if(figure1>figure2){
				return 1;
			}else return -1;
		}else{
			return -1;
		}

	}
	
	/**
	 * 遍历输出所有牌
	 */
	void forEach(){
		System.out.println("有以下扑克牌(通过for each访问):");
		int i =1;
		for(Object obj:AllCards){
			Card cr = (Card) obj;			
			System.out.print(cr.suit+":"+cr.figure+"   ");
			//每显示13个牌就换行
			if(i == 13 || i == 26 || i == 39){
				System.out.println();
			}
			i++;
		}
		System.out.println();
	}
	
	
	/**
	 * 洗牌
	 */
	void Shuffle(){
		System.out.println("-----------开始洗牌---------------");
		for(int i=0;i<52;i++){
			int x=(int)(Math.random()*52);
			Card temp = AllCards.get(x);
			AllCards.set(x,AllCards.get(i));
			AllCards.set(i,temp);						
		}
		System.out.println("-----------洗牌结束---------------");
		System.out.println("此时的牌顺序为:");
		forEach();
	}
	
	
	/**
	 * 发牌
	 */
	void deal(){
		System.out.println("-----------------开始发牌--------------------");
		player1.cards.add(AllCards.get(0));
		player2.cards.add(AllCards.get(1));
		player1.cards.add(AllCards.get(2));
		player2.cards.add(AllCards.get(3));
		System.out.println("玩家"+player1.name+"的手牌为:"+player1.cards.get(0).suit+":"+player1.cards.get(0).figure+
				"   和:"+player1.cards.get(1).suit+":"+player1.cards.get(1).figure);
		System.out.println("玩家"+player2.name+"的手牌为:"+player2.cards.get(0).suit+":"+player2.cards.get(0).figure+
				"   和:"+player2.cards.get(1).suit+":"+player2.cards.get(1).figure);
	}
	
	/**
	 * 比较大小,选出获胜玩家
	 */
	void fight(){
		System.out.println("比较大小:");
		int e = 0;
		//找出玩家1手里最大的牌
		int o = compare(player1.cards.get(0),player1.cards.get(1));
		//找出玩家2手里最大的牌
		int w = compare(player2.cards.get(0),player2.cards.get(1));
		if(o == 1&&w == 1){
			//玩家1,2用第一张牌比较大小
			e = compare(player1.cards.get(0),player2.cards.get(0));
		}else if(o == -1&& w == 1){
			e = compare(player1.cards.get(1),player2.cards.get(0));
		}else if(o == -1&& w == -1){
			e = compare(player1.cards.get(1),player2.cards.get(1));
		}else{
			e = compare(player1.cards.get(0),player2.cards.get(1));
		}
		if(e>0){
			System.out.println("玩家"+player1.name+"获胜!!");
		}else{
			System.out.println("玩家"+player2.name+"获胜!!");
		}
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Test t = new Test();
		t.login();
		t.creatCards();
		t.forEach();
		t.Shuffle();
		t.deal();
		t.fight();
	}

}




  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单扑克牌比大小的程序: ```python # 定义扑克牌的花色和大小 suits = ['♠', '♥', '♦', '♣'] ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] # 定义牌的点数和花色的映射 values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14} class Card: def __init__(self, suit, rank): self.suit = suit self.rank = rank self.value = values[rank] def __str__(self): return f'{self.rank}{self.suit}' class Deck: def __init__(self): self.cards = [] for suit in suits: for rank in ranks: self.cards.append(Card(suit, rank)) def shuffle(self): random.shuffle(self.cards) def deal(self): return self.cards.pop() class Player: def __init__(self, name): self.name = name self.cards = [] def add_card(self, card): self.cards.append(card) def remove_card(self, card): self.cards.remove(card) def sort_cards(self): self.cards.sort(key=lambda card: card.value) def get_best_hand(self): if len(self.cards) < 5: return None # 获取所有可能的手牌组合 combinations = itertools.combinations(self.cards, 5) # 找出最好的手牌 best_hand = None for combination in combinations: hand = Hand(combination) if best_hand is None or hand > best_hand: best_hand = hand return best_hand def __str__(self): return f'{self.name}的手牌是: {", ".join(str(card) for card in self.cards)}' class Hand: def __init__(self, cards): self.cards = cards self.cards.sort(key=lambda card: card.value) # 判断手牌类型 self.is_straight_flush = self._is_straight_flush() self.is_four_of_a_kind = self._is_four_of_a_kind() self.is_full_house = self._is_full_house() self.is_flush = self._is_flush() self.is_straight = self._is_straight() self.is_three_of_a_kind = self._is_three_of_a_kind() self.is_two_pairs = self._is_two_pairs() self.is_one_pair = self._is_one_pair() self.is_high_card = self._is_high_card() def __gt__(self, other): if self.is_straight_flush: if other.is_straight_flush: return self.cards[-1].value > other.cards[-1].value else: return True elif self.is_four_of_a_kind: if other.is_straight_flush or other.is_four_of_a_kind: return False else: return self.cards[2].value > other.cards[ ### 回答2: 扑克牌比大小的程序可以通过以下步骤实现: 1. 创建一副扑克牌的列表,其中包括所有的牌(共52张),如红桃A、黑桃2、方块3等。 2. 定义每张牌的点数和花色,例如可以使用数字表示点数(A为1,J为11,Q为12,K为13),使用字符串表示花色(红桃、黑桃、方块、梅花)。 3. 为了比较大小,可以设置每个点数对应的权重,例如A为14,2为2,J为11,Q为12,K为13。 4. 编写比较大小的函数,比较两张牌的大小。首先比较权重,如果权重相同,则比较花色的顺序,例如红桃>黑桃>方块>梅花。 5. 根据需要,可以对扑克牌进行洗牌,可以将牌的顺序打乱。 6. 使用随机数生成程序给两位玩家分发扑克牌(每位玩家分发5张牌),可以使用索引值从扑克牌列表中抽取对应的牌。 7. 根据比较大小的函数,比较两位玩家手中的牌的大小,确定谁是胜利者。 这个程序可以在控制台上运行,展示每个玩家的牌和比较结果。可以通过循环游戏多局,计算每个玩家的胜利次数,最终得出胜率较高的玩家。 该程序可以通过不同的编程语言实现,如Python、Java等,具体实现方式会有所不同。以上是一个基本的实现思路,可以根据实际需要进一步完善和扩展。 ### 回答3: 编写一个扑克牌比大小的程序可以实现以下功能: 1. 首先,我们需要定义一副扑克牌的花色和点数。一副扑克牌的花色可以包括梅花、方块、红心和黑桃,点数可以包括A、2、3、4、5、6、7、8、9、10、J、Q和K。 2. 接下来,我们可以将这些扑克牌定义为一个数组。例如,可以使用一个长度为52的数组来存储整副扑克牌。 3. 然后,我们可以使用随机数生成器从扑克牌数组中随机选择两张牌作为玩家手牌。 4. 程序需要判断两张牌的点数大小。其中,A的点数比2大,2比3大,以此类推,J比Q大,Q比K大。如果两张牌的点数相同,则根据花色判断大小,黑桃>红心>方块>梅花。 5. 最后,程序需要输出比较结果,并告诉玩家哪张牌更大。 通过以上步骤,我们可以完成一个简单扑克牌比大小的程序。为了增加趣味性,可以加入循环,让玩家可以多次比较并显示比较结果。同时,可以根据需要扩展程序的功能,如添加玩家赌注、判断各种牌型等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值