栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间:发布时间: 百科书网 趣学号

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

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

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

主要思路是:
用HashMap分别存储,其中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 deck = new HashMap();

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

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

	// 斗地主的三个人,ArrayList用于装上述的arr
	ArrayList Ruby = new ArrayList();
	ArrayList Weiss = new ArrayList();
	ArrayList Blake = new ArrayList();
	// 底牌
	ArrayList hand = new ArrayList();
	// 计算牌数
	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)

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号