斗地主----从定义牌到看牌的实现(丐中丐)

该博客介绍了一个简单的斗地主游戏的Java实现,包括装牌、洗牌、发牌、理牌和随机抢地主的逻辑。作者使用HashMap存储牌序,并通过ArrayList辅助排序。程序中有角色 RWBY 的设定,增加了趣味性。虽然目前缺少出牌逻辑,但已经实现了基本的游戏流程。
摘要由CSDN通过智能技术生成

斗地主,是一种在中国流行的纸牌游戏。游戏最少由3个玩家进行,用一副54张牌(连鬼牌),其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。

今天心血来潮写了个斗地主的丐中丐版,呃呃希望哪天可以把这个代码补全了 --__–

默认背景:RWBY齐聚中国,一起感受地方特色——斗地主 hhhhhh

主要思路是:
用HashMap分别存储<Integer,String>,其中Integer用来定义牌序逻辑,String用来存储扑克牌的值。(其中,之所以用HashMap不用ArrayList就是因为可以通过改变Key定义牌序逻辑,同时Key关联了Value,大大降低了自己定义Comparator的难度。)
【ps: 这里花色要成功输出,必须转成UTF-8编码。】
装牌时,进行自定义牌序,同时将0–53装入ArrayList中,方便后面洗牌时打乱;
理牌时,用sort方法进行升序排序,使之后HashMap中的牌面自大到小;
抢地主时,由于暂时没有三方交互,只能用随机数比较来尽可能维持公平;
看牌即直接输出即可。

具体细节如下:

斗地主的主函数

package cn.Acd_01;

import java.util.Random;
import java.util.Scanner;

public class DoudizhuDemo {
	public static void main(String[] args) {
		System.out.println("--------------欢迎来到斗地主--------------");
		System.out.println("请输入您的选项:(只输入数字再回车即可)");
		System.out.println("[选项1]     开始斗地主");
		System.out.println("[选项2]     退出斗地主");
		Scanner sc = new Scanner(System.in);
		while (true) {
			// 输入选项
			String str = sc.nextLine();
			switch (str) {
			case "1":
				Doudizhu ddz = new Doudizhu();
				ddz.pack(); // 装牌
				ddz.shuffle(); // 洗牌
				ddz.deal(); // 发牌
				ddz.sort(); // 理牌
				ddz.view(); // 看牌

				System.out.println("裁判Yang: 请按下回车键开始随机抢地主");
				new Scanner(System.in).nextLine();

				ddz.random_rob(); // 抢地主
				ddz.sort(); // 抢完地主理个牌
				ddz.view(); // 看牌
				/*
				 * 
				 * 无数行欠缺的代码 添加出牌逻辑 先鸽着,看什么时候能补上来 咕咕咕
				 * 
				 * 
				 * 
				 */
				System.out.println("还想要再打一把吗?");
				// 做得稀烂,显然没人想再打了,赶紧退出先
				break;

			case "2":
				// 狗都不玩
				System.out.println("--------------欢迎下次再玩!--------------");
				// status为0时,正常退出程序,结束当前正在运行中的java虚拟机
				System.exit(0);
				break;

			default:
				// 防止输入错误
				System.out.println("您的输入不符合规范,请重新输入:");
				System.out.println("请输入您的选项:(只输入数字再回车即可)");
				System.out.println("[选项1]     开始斗地主");
				System.out.println("[选项2]     退出斗地主");
			}
		}
	}
}


斗地主的方法类

package cn.Acd_01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Random;

// 斗地主的方法
public class Doudizhu {
	// 用HashMap来作为牌堆存牌,其中Integer部分用于定义排序逻辑
	HashMap<Integer, String> deck = new HashMap<Integer, String>();

	// 用ArrayList方便排序,替代HashMap的Integer
	ArrayList<Integer> arr = new ArrayList<Integer>();

	// 定义牌的内容
	String[] colors = { "♠", "♣", "♥", "♦" };
	String[] numbers = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };

	// 斗地主的三个人,ArrayList用于装上述的arr
	ArrayList<Integer> Ruby = new ArrayList<Integer>();
	ArrayList<Integer> Weiss = new ArrayList<Integer>();
	ArrayList<Integer> Blake = new ArrayList<Integer>();
	// 底牌
	ArrayList<Integer> hand = new ArrayList<Integer>();
	// 计算牌数
	int count = 0;

	// 装牌阶段
	public void pack() {
		// 先装大小王,大写为大王,小写为小王
		deck.put(count++, "JOKER");
		deck.put(count++, "joker");
		// 装入定义的52张牌
		for (String num : numbers) {
			for (String color : colors) {
				deck.put(count++, color.concat(num));
			}
		}
		// 按顺序把0-53装入arr中
		for (int i = 0; i <= count - 1; i++) {
			arr.add(i);
		}
	}

	// 洗牌阶段
	public void shuffle() {
		// 延时两秒
		System.out.println("裁判Yang: 正在洗牌中......");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 打乱arr顺序
		Collections.shuffle(arr);
	}

	// 发牌阶段
	public void deal() {
		// 继续延时两秒...
		System.out.println("裁判Yang: 正在发牌中......");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// 先发出三张底牌,再每人发够17张
		for (int i = arr.size() - 1; i >= 0; i--) {
			if (i > arr.size() - 4) {
				hand.add(arr.get(i));
			} else if (i % 3 == 2) {
				Ruby.add(arr.get(i));
			} else if (i % 3 == 1) {
				Weiss.add(arr.get(i));
			} else if (i % 3 == 0) {
				Blake.add(arr.get(i));
			}
		}
	}

	// 理牌阶段
	public void sort() {
		// 将发到的牌按定义逻辑排好
		Collections.sort(Ruby);
		Collections.sort(Weiss);
		Collections.sort(Blake);
	}

	// 随机抢地主阶段
	public void random_rob() {
		// 继续延时两秒......
		System.out.println("开始随机抢地主......");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		// 通过比较随机数大小来抢地主
		// 数字大的抢地主
		// 把数字定义大点,降低大小相同的概率
		// 好吧其实是我懒得写循环QAQ
		Random r = new Random();
		int Ruby_Random = r.nextInt(1000000);
		int Weiss_Random = r.nextInt(1000000);
		int Blake_Random = r.nextInt(1000000);

		// 比较找出地主
		String dizhu = Ruby_Random > Weiss_Random ? (Blake_Random > Ruby_Random ? "Blake" : "Ruby")
				: (Blake_Random > Weiss_Random ? "Blake" : "Weiss");
		System.out.println("裁判Yang: 恭喜" + dizhu + "抢到了地主");
		System.out.println("");
		System.out.println("本局的地主为:" + dizhu);
		// System.out.println("");

		// 把底牌发给地主之暴力版
		if (Ruby_Random > Weiss_Random && Ruby_Random > Blake_Random) {
			for (Integer card : hand) {
				Ruby.add(card);
			}
		} else if (Weiss_Random > Ruby_Random && Weiss_Random > Blake_Random) {
			for (Integer card : hand) {
				Weiss.add(card);
			}
		} else if (Blake_Random > Ruby_Random && Blake_Random > Weiss_Random) {
			for (Integer card : hand) {
				Blake.add(card);
			}
		}

	}

	// 上帝视角看牌阶段
	public void view() {
		// 将各人的牌分别输出
		System.out.print("[一号选手Ruby ]:");
		for (Integer card_num : Ruby) {
			String card = deck.get(card_num);
			System.out.print(card + " ");
		}
		System.out.println("");

		System.out.print("[二号选手Weiss]:");
		for (Integer card_num : Weiss) {
			String card = deck.get(card_num);
			System.out.print(card + " ");
		}
		System.out.println("");

		System.out.print("[三号选手Blake]:");
		for (Integer card_num : Blake) {
			String card = deck.get(card_num);
			System.out.print(card + " ");
		}
		System.out.println("");

	}
}

具体实现如下:
在这里插入图片描述

如有出错 希望有大佬帮忙指正。
“感谢黄老师对我的细心指点”
以上。
(真的稀烂呜呜呜,下次再更新点新东西吧QAQ)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值