java实现斗地主游戏
作者:zzm0707 发布时间:2022-02-18 14:06:26
标签:java,斗地主,游戏
感想:
第一次写博客,感觉编辑器挺复杂厉害的,感觉自己的内容挺简单的。有什么问题请多多指教!
思路:
1、创建一个扑克牌的实体类Poker,设置了四个参数:花色、数字、牌值(判断大小)、是否地主牌,实现getset方法和构造方法;
2、创建一个玩家的实体类Player,设置了四个参数: 初始牌集合,排序后牌集合,牌值集合,是否地主,实现getset方法和构造方法;
3、洗牌:循环嵌套花色数组跟数字数组生成52个Poker,手动加入大小王Poker,放进map(int,Poker)里面,利用Collections.shuffle随机排序map的key,再根据key生成排序后的Poker集合
4、发牌:生成3个玩家对象,拿到洗牌后的集合,前51张牌为玩家牌,后3张为地主牌,在51张牌中随机一张为地主牌,遍历玩家牌分配个每一个Player,同时根据玩家牌的牌值生成集合grades存进Player对象中,将grades转为int数组并进行升序排序,根据grade取得新Poker集合分配给玩家。
Poker类:
package com.company;
public class Poker {
private String color;
private String number;
private int grade;
boolean isLandowners;
public boolean isLandowners() {
return isLandowners;
}
public void setLandowners(boolean landowners) {
isLandowners = landowners;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Poker() {
}
public Poker(String color, String number ,int grade,boolean isLandowners) {
this.color = color;
this.number = number;
this.grade=grade;
this.isLandowners=isLandowners;
}
public String toString() {
return this.getColor()+this.getNumber();
}
}
Player类:
package com.company;
import java.util.ArrayList;
import java.util.LinkedList;
public class Player {
private ArrayList<Poker> pokers;
private boolean isLandower;
private ArrayList<Poker> newPokers;
private LinkedList<Integer> grades;
public LinkedList<Integer> getGrades() {
return grades;
}
public void setGrades(LinkedList<Integer> grades) {
this.grades = grades;
}
public ArrayList<Poker> getNewPokers() {
return newPokers;
}
public void setNewPokers(ArrayList<Poker> newPokers) {
this.newPokers = newPokers;
}
public boolean isLandower() {
return isLandower;
}
public void setLandower(boolean landower) {
isLandower = landower;
}
public Player() {
}
public ArrayList<Poker> getPokers() {
return pokers;
}
public void setPokers(ArrayList<Poker> pokers) {
this.pokers = pokers;
}
}
洗牌:
/*洗牌*/
public static LinkedList<Poker> getPokerList() {
LinkedList<Poker> pokers = new LinkedList<Poker>();
LinkedList<Poker> newPokers = new LinkedList<Poker>();
ArrayList<Integer> arrayList = new ArrayList<>();
int[] arr;
/*生成54张扑克牌(Poker对象)*/
/*用嵌套循环生成从方块3到黑桃2的Poker对象,放进Poker的LinkedList保证顺序*/
String[] colors = {"♦", "♣", "♥", "♠"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < colors.length; j++) {
Poker p = new Poker(colors[j], numbers[i], (4 * i) + j + 1, false);
pokers.add(p);
}
}
/*添加大小王*/
pokers.add(new Poker("black", "☆", 53, false));
pokers.add(new Poker("red", "☆", 54, false));
/*将生成的54张扑克牌从1到54放进map*/
for (int z = 1; z <= pokers.size(); z++) {
map.put(z, pokers.get(z - 1));
}
/*遍历Map,将每个Poker对应的key放进 ArrayList<Integer> arrayList */
Set<Map.Entry<Integer, Poker>> set = map.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry<Integer, Poker> e = (Map.Entry<Integer, Poker>) it.next();
arrayList.add(e.getKey());
}
/*利用Collections.shuffle随机排序key*/
Collections.shuffle(arrayList);
/*将乱序后的key对于的Poker放进newPokers里面 */
for (Integer i : arrayList) {
newPokers.add(map.get(i));
}
return newPokers;
}
发牌:
/*发牌*/
/*根据玩家人数生成Player,默认num=3*/
private static void sentPoker(int num) {
/*获取洗牌后的LinkedList,保证顺序*/
LinkedList<Poker> Allpokers = getPokerList();
ArrayList<Poker> pokers = new ArrayList<>();
ArrayList<Poker> BottomPokers = new ArrayList<>();
/*生成玩家对象*/
for (int i = 0; i < num; i++) {
Player p = new Player();
players.add(p);
}
/*前50张牌为玩家牌,后三张为底牌*/
for (int p = 0; p < Allpokers.size(); p++) {
if (p <= 50) {
pokers.add(Allpokers.get(p));
} else {
BottomPokers.add(Allpokers.get(p));
}
}
/*玩家牌中随机一张为地主牌*/
Random rand = new Random();
int s = rand.nextInt(51);
pokers.get(s).setLandowners(true);
System.out.println("地主牌: " + pokers.get(s));
/*根据num生成Player对象*/
for (int j = 0; j < num; j++) {
/*玩家的牌值集合*/
LinkedList<Integer> grades = new LinkedList<>();
/*玩家的手牌集合*/
ArrayList<Poker> playerPokers = new ArrayList<Poker>();
/*根据玩家个数分配玩家牌*/
for (int z = j; z < pokers.size(); z = z + num) {
playerPokers.add(pokers.get(z));
grades.add(pokers.get(z).getGrade());
players.get(j).setPokers(playerPokers);
players.get(j).setGrades(grades);
}
/*根据玩家牌中的地主牌设置玩家是否地主*/
for (Poker p : players.get(j).getPokers()) {
if (p.isLandowners() == true) {
players.get(j).setLandower(true);
}
}
/*根据玩家的牌值集合生成数组*/
Integer[] gs = new Integer[players.get(j).getGrades().size()];
grades.toArray(gs);
/*排序数组,由低到高*/
Arrays.sort(gs);
/*排序后的玩家牌*/
ArrayList<Poker> newPokers = new ArrayList<>();
for (int g = 0; g < gs.length; g++) {
Poker p = map.get(gs[g]);
newPokers.add(p);
}
players.get(j).setNewPokers(newPokers);
System.out.println("玩家" + (j + 1) + ": " + players.get(j).getNewPokers() + " 是否地主:" + players.get(j).isLandower());
}
System.out.print("底牌为: ");
for (Poker p : BottomPokers) {
System.out.print(p + " ");
}
}
效果如下:
来源:https://blog.csdn.net/zzm0707/article/details/83540242
0
投稿
猜你喜欢
- 这篇文章主要介绍了Java import导入及访问控制权限修饰符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Java中自动生成构造方法详解每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法,如果类一但声明有构造方法,就不会产生了.证
- 前言前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Mybatis中有几种传参方式吗?没想到其他问题回答的很好,唯独这个问题一知半解
- 也许是本人不才,初识Maven时,被各种不明所以的教程搞得一头雾水,而在后来的使用中,我发现Maven大部分功能没有想象的那么困难。本片文章
- 直接上代码新建DecimalInputTextWatcher类继承TextWatcher (代码可直接复制使用) import androi
- 容器适配器我们可以看出,栈中没有空间配置器(内存池),而是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目
- 1. 前言不知道小伙伴对于日期字段,在项目中都是如何处理的,是单独给每个字段都自定义日期格式还是做全局格式设置?这个我之前啊,是
- 上篇教程回顾ServerSocket --监听客户端的连接,他的作用主要是建立一个连接-ServerSocket -建立连接,拿到一个Soc
- java的构造函数是一个非常重要的作用,首先java里的构造函数是可以重载的,而且因为也是可以继承在父类的构造函数,所以在子类里,首先必然是
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- 访问静态资源遇到的坑及解决开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的最终找出来问题,虽然每次调整路径都不对,最终查看多种方
- Java设计模式访问者模式模式概念访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的
- @Value注解读取yml中的map配置网上查了好多资料,都是.properties文件中读取,而且又是几个人抄来抄去,找了半天功夫不负有心
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- 一、通过程序看现象在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码。这段代码的逻辑很简单:主线程启动了两个子线程,一个
- 其实是可以通过@Constraint来限定自定义注解的方法。@Constraint(validatedBy = xxxx.class)下面是
- 一、堆栈内存堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由Java GC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,
- intellij idea是一款非常优秀的软件开发工具,它拥有这强大的插件体系,可以帮助开发者完成很多重量级的功能。今天,我们来学习一下如何
- 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发MyBa
- IDEA 报错:无效的源发行版问题描述从SVN拉项目代码到本地后用idea运行,发现几个报错,关键的一个是:无效的源发行版,考虑是JDK版本