斗地主发牌
- 有三个游戏玩家,从控制台输入三个玩家的姓名。
- 玩家手中能拿牌,牌有点数和花色。
- 一共54张牌,随机分配每人17张牌,剩余3张底牌。
- 每人手中的牌需要从小到大排序(点数相同,按照花色#黑红梅方)
- 大王>小王>2>A>K>Q>J>10>9>8>7>6>5>4>3
- 选择一个人叫地主,得到3张底牌,并展示新的手牌
效果如下:
将每次的叫过地主后的手牌信息,写入到一个文件中。文件中的格式如下(前面的行号是编辑器自带的不用管):
代码如下
花色枚举(也可以设计成类)
/**
* @Author 昊
* @Create 2020/4/29 21:20
* @Description
*/
public enum Suit {
//四种花色分别对应四种不同的值,用花色对应的值来比较他们之间的大小
Spade("♠",4),
Heart("♥",3),
Club("♣",2),
Diamod("♦",1);
private String str;
private int level;
Suit(String str,int level){
this.str=str;
this.level=level;
}
public int getLevel() {
return level;
}
public String getStr() {
return str;
}
}
点数枚举(也可以设计成类)
/**
* @Author 昊
* @Create 2020/4/29 21:20
* @Description
*/
public enum Point {
//一个点数对应一个值,用值来比较他们的大小关系
P3("3", 1),
P4("4", 2),
P5("5", 3),
P6("6", 4),
P7("7", 5),
P8("8", 6),
P9("9", 7),
P10("10", 8),
PJ("J", 9),
PQ("Q", 10),
PK("K", 11),
PA("A", 12),
P2("2", 13),
JOKER_LOWER("♛", 14),
JOKER_HIGHER("♚", 15);
private String str;
private int level;
Point(String str,int level){
this.str=str;
this.level=level;
}
public String getStr() {
return str;
}
public int getLevel() {
return level;
}
}
扑克牌类
/**
* @Author 昊
* @Create 2020/4/29 21:28
* @Description
*/
public class Poker implements Comparable<Poker>{
//Poker的两个数学点数和花色
private Point point;
private Suit suit;
public Poker(Suit suit,Point point ) {
this.point = point;
this.suit = suit;
}
public Point getPoint() {
return point;
}
public Suit getSuit() {
return suit;
}
@Override
public String toString() {
//大小王没有花色,suit为null,如果不处理会出现空指针异常
return (this.suit ==null ? "":this.suit.getStr())+ point.getStr() ;
}
//由于要排序,需要实现Comparable接口并重写compareTo方法,并按指定方式进行比较
@Override
public int compareTo(Poker poker) {
//先比较点数
//如果点数相同比较花色
if(this.point.getLevel()==poker.point.getLevel()){
return this.suit.getLevel()-poker.suit.getLevel();
}else {
return this.point.getLevel()-poker.point.getLevel();
}
}
}
玩家类
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @Author 昊
* @Create 2020/4/29 21:09
* @Description
*/
public class User{
//玩家拥有姓名和一个存储Poker的集合
private String name;
private List<Poker> pokerList;
public User(String name){
this.name=name;
pokerList=new ArrayList<>();
}
public String getName() {
return name;
}
@Override
public String toString() {
return name + ":" + pokerList;
}
public void addPoker(Poker poker){
//将每次取到的牌添加到自己的集合中
pokerList.add(poker);
//发完牌就排序
if(pokerList.size()==17||pokerList.size()==20){
Collections.sort(pokerList);
}
}
}
扑克牌管理类
/**
* @Author 昊
* @Create 2020/4/29 21:36
* @Description 用于产生牌堆,并负责洗牌和发牌
*/
public class PokerManager {
//用于存储一副牌
private List<Poker> list;
public PokerManager(){
//因为要对数据进行频繁的删除操作所以使用LinkedList,而不是ArrayList
list=new LinkedList<>();
//获取点数的所有的枚举值
Point[] values = Point.values();
for (Point value : values) {
//先添加A-K
if(value.getLevel()<14){
list.add(new Poker(Suit.Spade,value));
list.add(new Poker(Suit.Heart,value));
list.add(new Poker(Suit.Club,value));
list.add(new Poker(Suit.Diamod,value));
}
}
//添加大小王
list.add(new Poker(null,Point.JOKER_HIGHER));
list.add(new Poker(null,Point.JOKER_LOWER));
//洗牌
Collections.shuffle(list);
}
//从牌堆中取出一张牌
public Poker getPoker(){
//每次删除首牌
return list.remove(0);
}
}
测试类
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
/**
* @Author 昊
* @Create 2020/4/29 21:09
* @Description
*/
public class Program {
public static void main(String[] args) {
//准备玩家
Scanner s=new Scanner(System.in);
System.out.println("欢迎来到JJ斗地主");
System.out.println("请输入三个玩家的姓名:");
User[] users=new User[3];
for (int i = 0; i < 3; i++) {
users[i]=new User(s.next());
}
//准别牌堆
PokerManager pokerManager=new PokerManager();
//发牌
deal(pokerManager,users);
//展示手牌
show(users);
//叫地主
User lord=getLord(users);
//将地主牌添加到地主玩家手中
//显示地主的三张地主牌
StringBuilder sb=new StringBuilder("地主牌:");
for (int i = 0; i < 3; i++) {
//获取地主牌
Poker p=pokerManager.getPoker();
sb.append(p).append(", ");
//添加到地主手中
lord.addPoker(p);
}
//去掉地主牌最后的都好跟空格
sb.delete(sb.length()-2,sb.length());
//展示地主的三张地主牌
System.out.println(sb);
//展示最终效果
show(users);
//存入指定文件
save(users);
}
//发牌
private static void deal(PokerManager pokerManager,User[]users){
//先发前51张牌,留三张做地主牌
for (int i = 0; i < 51; i++) {
//每次发一张,三次一轮回
users[i%3].addPoker(pokerManager.getPoker());
}
}
//展示手牌
private static void show(User[] users){
for (User user : users) {
System.out.println(user);
}
}
//叫地主
private static User getLord(User[] users){
Scanner s=new Scanner(System.in);
while(true){
System.out.println("谁叫地主?");
String name=s.next();
for (User user : users) {
if(user.getName().equalsIgnoreCase(name.trim())){
return user;
}
}
}
}
//将控制台的数据写入指定文件中
private static void save(User[]users){
try(PrintStream printStream=new PrintStream(new FileOutputStream("file\\dizhu",true))){
printStream.println("-----------------------------------------------------------------");
for (User user : users) {
printStream.println(user);
}
}catch (IOException e){
e.printStackTrace();
}
}
}