使用java面向对象思想模拟实现三人一副牌斗地主
分析:
一、面向对象分析:完成斗地主要建几个类?
玩家类(玩家姓名,玩家类型[地主/非地主])
扑克牌类(花色,大小,面值)
二、流程分析:
1、买一副新牌
2、洗牌
3、发牌
4、抢地主(只实现指定地主,要抢地主增加规则,如随机比第一张牌,谁的牌大谁是地主,或者喊[1,2,3]抢,喊3直接是地主等)
5、出牌
6、结束
三、源码:
package com.zgb.poken;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class PlayPoker {
/**
* MethodName: main
* @Description: 三人斗地主
* @param args
* @return void
* @author yangsy
* @version:0.1
* @date 2016-12-3 下午2:07:13
*/
public static void main(String[] args) {
//第一步:去买一副牌
List<Poker> newPoker = newPoker();
//第二步:洗牌
cashPoker(newPoker);
//第三步:发牌
//定义三个角色
Person p1 = new Person();
p1.setRoleName("刘备");
Person p2 = new Person();
p2.setRoleName("关羽");
Person p3 = new Person();
p3.setRoleName("张飞");
//底牌
List<Poker> diPai = sendPoker(newPoker,p1,p2,p3);
//第四步:选地主
p1.setRoletType(Constant.DI_ZHU);
System.out.println("本局"+p1.getRoleName()+"是地主");
p2.setRoletType(Constant.NOT_DI_ZHU);
p3.setRoletType(Constant.NOT_DI_ZHU);
//把底牌给地主
List<Poker> pList = p1.getPokerList();//把地主的牌拿出来
// for (int i = 0; i < diPai.size(); i++) {
// pList.add(diPai.get(i));
// }
pList.addAll(diPai);
Collections.sort(pList);//重新排序
System.out.println();
//第五步:出牌
startPlay(p1, p2, p3);
}
public static void startPlay(Person p1,Person p2,Person p3){
System.out.println("********************************开始斗地主***********************");
System.out.println();
//谁是地主,先出牌
List<Person> personList = new ArrayList<Person>();
personList.add(p1);
personList.add(p2);
personList.add(p3);
Scanner scanner = new Scanner(System.in);
//是否结束
boolean isEnd = false;
Person person = null;//玩家
List<Poker> pokerList = null;//玩家的牌
Poker poker = null;//本次出的牌
int beforeNum = -1;//上家出的牌的大小
while(!isEnd){
for (int i = 0; i < personList.size(); i++) {
person = personList.get(i);
pokerList = person.getPokerList();
System.out.println(person.getRoleName()+"开始出牌,请输入1-"+pokerList.size());
//System.out.println(personList.get(i).getRoleName()+"的牌是:");
printPoker(pokerList);
int index = scanner.nextInt();
poker = pokerList.get(index-1);//本次出的牌
System.out.println();
//判断本次出的牌的大小是否大于上家出的牌
while(poker.getNum()<=beforeNum){
System.out.println("您本次出的牌小于上家的牌,请重新出牌");
index = scanner.nextInt();
poker = pokerList.get(index-1);//本次出的牌
}
//正常出牌
System.out.println(person.getRoleName()+"本次出的是:"+poker.getColor()+poker.getName());
beforeNum = poker.getNum();//记录本次出的牌的大小,用于给下家出牌时进行比较
pokerList.remove(index-1);//把本次出的牌从手里删掉
}
}
}
public static void printPoker(List<Poker> list){
for (int i = 0; i < list.size(); i++) {
System.out.print(i+1+list.get(i).getColor()+list.get(i).getName()+" ");
}
System.out.println();
}
/**
* MethodName: sendPoker
* @Description: 发牌,并返回3张底牌
* @param list
* @param p1
* @param p2
* @param p3
* @return List<Poker>
* @author yangsy
* @version:0.1
* @date 2016-12-3 下午3:10:58
*/
public static List<Poker> sendPoker(List<Poker> list,Person p1,Person p2,Person p3){
//第一个人分到的牌
List<Poker> pList1 = new ArrayList<Poker>();
//第二个人分到的牌
List<Poker> pList2 = new ArrayList<Poker>();
//第三个人分到的牌
List<Poker> pList3 = new ArrayList<Poker>();
//底牌
List<Poker> diPai = new ArrayList<Poker>();
for (int i = 0; i < list.size(); i++) {
if(i<list.size()-3){
pList1.add(list.get(i));
pList2.add(list.get(++i));
pList3.add(list.get(++i));
}else {
diPai.add(list.get(i));
}
}
Collections.sort(pList1);
Collections.sort(pList2);
Collections.sort(pList3);
p1.setPokerList(pList1);
p2.setPokerList(pList2);
p3.setPokerList(pList3);
return diPai;
}
/**
* MethodName: cashPoker
* @Description: 洗牌:随机打乱一副牌的顺序
* @param list
* @return List<Poker>
* @author yangsy
* @version:0.1
* @date 2016-12-3 下午2:34:36
*/
public static void cashPoker(List<Poker> list){
//利用集合工具类,随机打乱顺序
Collections.shuffle(list);
}
/**
* MethodName: newPoker
* @Description: 生成一副新牌
* @return List<Poker>
* @author yangsy
* @version:0.1
* @date 2016-12-3 下午2:16:21
*/
public static List<Poker> newPoker(){
List<Poker> list = null;
Poker poker = null;
String [] pokerName = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String [] pokerColor = {"黑桃","红桃","梅花","方块"};
list = new ArrayList<Poker>();
for (int i = 0; i < pokerColor.length; i++) {
for (int j = 0; j < pokerName.length; j++) {
poker = new Poker();
poker.setColor(pokerColor[i]);
poker.setName(pokerName[j]);
poker.setNum(j);
list.add(poker);
}
}
//特殊处理大小王
Poker xiaoWang = new Poker();
xiaoWang.setName("小王");
xiaoWang.setNum(14);
Poker daWang = new Poker();
daWang.setName("大王");
daWang.setNum(15);
list.add(xiaoWang);
list.add(daWang);
return list;
}
}
package com.zgb.poken;
import java.util.List;
//人-玩家
public class Person {
private String roleName;//角色名称
private Integer roletType;//角色类型 0-地主/1-非地主
private List<Poker> pokerList;//角色的牌
public String getRoleName() {
return roletType==Constant.DI_ZHU?roleName+"(地主)":roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Integer getRoletType() {
return roletType;
}
public void setRoletType(Integer roletType) {
this.roletType = roletType;
}
public List<Poker> getPokerList() {
return pokerList;
}
public void setPokerList(List<Poker> pokerList) {
this.pokerList = pokerList;
}
}
package com.zgb.poken;
//牌
public class Poker implements Comparable<Poker>{
private String color;
private String name;// A,2,3,4,5,6,7,8,9,10,J,Q,K,大王,小王
private int num;//牌的大小
public String getColor() {
return color==null?"":color;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public int compareTo(Poker o) {
return this.num - o.num;
}
}
package com.zgb.poken;
public class Constant {
/**
* 地主常量:0
*/
public static final int DI_ZHU = 0;
/**
* 非地主常量
*/
public static final int NOT_DI_ZHU = 1;
}