斗地主,是一种在中国流行的纸牌游戏。游戏最少由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)