通过Random类、Collections类的方法实现斗地主的功能

1.要实现的功能:

       参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色;三名玩家,其中地主比其他玩家多3张牌) 

随机地主,洗牌,发牌(发牌按照常规方式A-B-C-A-B-C-A...,不允许一次性随机17张给某个玩家),玩家手中牌的展示(要求按点数实现排序)

2.编辑代码的思路与过程:

    根据斗地主的规则,要有纸牌和玩家,所以要建立玩家类(Player),扑克牌类(Poke)。玩家类包含的属性应该有:id,姓名(name)、扑克牌(ArrayList<Poke>),是否地主(boss);扑克牌类包含的属性应该有:花色(flower),点数(point),判断大小的索引(score),在测试类中编写方法并实现。

   首先建立玩家类(Player),扑克牌类(Poke),在编写方法添加扑克和玩家,接着是随机地主和发牌方法,最后是显示玩家手中的牌。

3.通过代码实现功能:

玩家类和扑克牌类就不显示了,我直接展示测试类的方法:

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

public class PokeGame {

	static List<Player> players;
	static ArrayList<Poke> list = new ArrayList<>();
	static String[] flower = {"方块","梅花","黑桃","红心"};
	static String[] point = {"3","4","5","6","7","8","9","10",
			"J","Q","K","A", "2"};
	static int bossIndex;
	static {
		// 初始化扑克
		for (int i = 0; i < flower.length; i++) {
			for (int j = 0; j < point.length; j++) {
				// 生成一张扑克对象
				Poke p = new Poke(flower[i], point[j], j);
				list.add(p);
			}
		}
		// 单独加大小王
		list.add(new Poke("小", "王", 13));
		list.add(new Poke("大", "王", 14));
		System.out.println(list);

		// 初始化玩家
		players = Arrays.asList(new Player(1, "刘备"), new Player(2, "关羽"), new Player(3, "张飞"));

	}

	/** 随机地主 */
	public void pushBoss() {
		Random r = new Random();
		int i = r.nextInt(players.size());
		// 设置被随机到的玩家为地主
		bossIndex = i;
		players.get(bossIndex).setBoss(true);
	}

	/** 发牌 */
	public void pushPoke() {
		Random r = new Random();
		//洗牌
		Collections.shuffle(list);
		int ind = 0;
		for (int i = 0; i < 51; i++) {
			int index = r.nextInt(list.size());
			if (ind < 3) {
				players.get(ind).getPokes().add(list.get(index));

			} else {
				ind = 0;
				players.get(ind).getPokes().add(list.get(index));
			}
			ind++;
			list.remove(index);
		}

		// 将最后三张牌发给地主
		players.get(bossIndex).getPokes().addAll(list);

	}
   //按牌的大小展示牌
	public ArrayList<Poke> show(Player p){
		Collections.sort(p.getPokes(),(a,b)->{
			return a.getSort() - b.getSort();
		});
		
		return p.getPokes();
	}
	

	public void start() {
		pushBoss();
		pushPoke();
		for (Player p : players) {
			System.out.println(p.getName() + ":" +show(p));
		}
		

	}

	public static void main(String[] args) {

		new PokeGame().start();

	}

}

 

Java实现斗地主游戏的发牌功能,通常会涉及数组、列表等数据结构以及随机数生成。以下是一个简化的步骤概述: 1. **创建牌组**:首先,你需要定义一副完整的斗地主牌组,包括54张牌,每种花色有红桃、黑桃、梅花、方块各13张,从A到K。 ```java public class Card { private Suit suit; private Rank rank; // ... 构造函数、getter和setter... } enum Suit { SPADE, HEART, DIAMOND, CLUB } enum Rank { ACE, TWO, THREE, ..., KING } ``` 2. **洗牌**:使用`Collections.shuffle()`方法对牌组进行随机排序,模拟真实世界中的洗牌过程。 ```java List<Card> deck = new ArrayList<>(Arrays.asList(Card.values())); Collections.shuffle(deck); ``` 3. **发牌**:将牌分配给三位玩家,通常是每人17张牌,剩下的三张作为底牌(如果需要)。可以创建三个列表分别代表每个玩家的牌堆。 ```java List<Card>[] playerHands = new List[3]; for (int i = 0; i < 17; i++) { int index = random.nextInt(deck.size()); playerHands[i % 3].add(deck.remove(index)); // 保证公平,每次都从剩余牌堆中取 } // 底牌处理 playerHands[3].addAll(deck.subList(0, 3)); ``` 4. **显示牌面**:最后,你可以选择是否打印出每位玩家的手牌,用于展示当前的游戏状态。 注意这只是一个基础的示例,实际的斗地主游戏可能会更复杂,涉及到各种逻辑判断和规则应用。同时,为了保持游戏的公平性和安全性,你还需要考虑并发控制和作弊防护等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值