[真格邦]JAVA实战-三人斗地主

使用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;
	
	
	
	
	
}



  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值