Java基础-斗地主游戏

目录

案例要求:​

实现思路:

代码:

Main启动类:

Card实体类:

Room操作类:

总结:


案例要求:

实现思路:

1构造卡牌,细节:实体类另设一个int类型变量表示大小,后面为了实现斗地主牌降序或者升序排序

2打乱卡牌的顺序和发牌

3选定大小王

4实现对牌顺序

5展示玩家的卡牌即可

代码:

Main启动类:

java 复制代码
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        Room room = new Room();
        room.start();
    }
}

Card实体类:

java 复制代码
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card implements Comparable<Card> {
    private String number;
    private String color;
    private int size;

    @Override
    public String toString() {
        return number + color;
    }
    @Override
    public int compareTo(Card o) {
        return o.size-size;
    }
}

Room操作类:

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class Room {
    private List<Card> list=new ArrayList<>();
    {
        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++){
                list.add(new Card(numbers[i],colors[j],i));
            }
        }
        list.add(new Card("","\uD83C\uDCCF",13));
        list.add(new Card("","\uD83E\uDDD1",14));

    }
    Scanner sc = new Scanner(System.in);
    public void start(){
        System.out.println("洗牌前");
        System.out.println(list);
        System.out.println("洗牌后");
//        使用集合类工具打乱卡牌顺序
        Collections.shuffle(list);
        System.out.println(list);
//        发牌,三个玩家
        Map<String,List<Card>> players=new HashMap<>();
        List<Card> p1=new ArrayList<>();
        players.put("张三",p1);
        List<Card> p2=new ArrayList<>();
        players.put("李四",p2);
        List<Card> p3=new ArrayList<>();
        players.put("王五",p3);
        for(int i=0;i<list.size()-3;i++){
            if(i%3==0){
                p1.add(list.get(i));
            } else if (i%3==1) {
                p2.add(list.get(i));
            }else{
                p3.add(list.get(i));
            }
        }
        System.out.print("底牌是  ");
        for (int i = list.size()-3; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();
        System.out.print("玩家  ");
        for (String name : players.keySet()){
            System.out.print(name+" ");
        }
        System.out.print("请决定谁是地主(姓名)");
        String name=sc.next();
        for(Map.Entry<String,List<Card>> entry:players.entrySet()) {
            if (entry.getKey().equals(name)) {
                List<Card> cards = entry.getValue();
                cards.addAll(list.stream().skip(51).toList());
            }
        }
////TODO或者
//            if(entry.getKey().equals(name)){
//                entry.getValue().addAll(list.stream().skip(51).collect(Collectors.toList()));
//            }

//        对拍顺序
//        TODO法一
//            sortCards(p1);
//            sortCards(p2);
//            sortCards(p3);
//        TODO法二
        Collections.sort(p1);
        Collections.sort(p2);
        Collections.sort(p3);

//        看牌
/*  //TODO遍历方法一:
List<String> names=players.entrySet().stream().map(Map.Entry::getKey).toList();
        for(int i=0;i<names.size();i++){
            System.out.println(names.get(i)+"的牌是:");
            List<Card> cards=players.get(names.get(i));
            for(int j=0;j<cards.size();j++){
                System.out.print(cards.get(j)+"  ");
            }
            System.out.println();
        }*/

        for(Map.Entry entry:players.entrySet()){
            System.out.println(entry.getKey()+"的牌是:");
            List<Card> cards=(List<Card>) entry.getValue();
            for(Card card:cards){
                System.out.print(card+" ");
            }
            System.out.println();
        }
    }

    //TODO法一;哪用哪里构造比较器
//    private void sortCards(List<Card> p1) {
//        Collections.sort(p1, new Comparator<Card>() {
//            @Override
//            public int compare(Card o1, Card o2) {
//
//                return o1.getSize()-o2.getSize();
//            }
//        });
//    }

////    TODO简化版的
//    private void sortCards(List<Card> p1) {
//        Collections.sort(p1, (o1, o2) -> o1.getSize()-o2.getSize());
//    }
}

总结:

本文展示了一个Java实现的简单扑克牌游戏程序。程序主要包含三个类:Main启动类、Card实体类(使用Lombok简化代码)和Room操作类。程序实现了洗牌、发牌、选择地主、排序牌面和显示牌面等功能。通过Collections工具类实现洗牌和排序,使用HashMap存储玩家信息,并展示了多种遍历和排序的实现方式(包括Lambda表达式)。程序能正确处理54张牌(含大小王),支持3名玩家游戏,由用户指定地主并获得底牌。

相关推荐
谷宇.7 小时前
【Unity3D实例-功能-镜头】第三人称视觉
游戏·unity·unity3d·游戏开发·游戏编程·steam
白仑色8 小时前
JavaScript案例(乘法答题游戏)
开发语言·javascript·游戏
小白嘎嘎9 小时前
智能手表:小恐龙游戏
游戏·智能手表
亚马逊云开发者10 小时前
零代码生成 3D 游戏:基于 Amazon Q Developer CLI 和 Three.js 的实践
人工智能·游戏
深海潜水员1 天前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
伽蓝_游戏1 天前
Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)
游戏·ui·unity·架构·c#·游戏引擎·.net
小梦白1 天前
RPG增容3:尝试使用MVC结构搭建玩家升级UI(一)
游戏·ui·ue5·mvc
终端域名1 天前
元宇宙三维化会给游戏行业带来哪些改变?
游戏·元宇宙
小梦白2 天前
RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物属性(三)
游戏