java 模拟斗地主分牌

斗地主分派java版

个人感觉java C的差不多都是算法的实现都差不多

java的用对象存每个人的牌
C的话开块内存存一下 结构体 链表

主要思路是 1-54 分别代表不同的牌
比如
1234 红桃1黑桃1 梅花1 方块1
5678 红桃2黑桃2 梅花2 方块2
9 10 11 12 红桃3黑桃3 梅花3 方块3
你处理的就是1-54这写数字
闲来无事 写个玩玩
废话不多说上代码。
这里写图片描述

package java_03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;

public class T3 {

	public static void main(String[] args) {
//		红桃 :heart黑桃 : spade梅花 : club方块 : diamond
		//1- 54 随机一个数
		int [] count = randomArray(1, 54, 54);
		Person p1 = new Person("张三");
		Person p2 = new Person("李四");
		Person p3 = new Person("王五");
//		System.out.println(count.length);

		for(int i = count.length-1;i>=3 ;i--){
		//把牌平均分给3个人
			int temp = i % 3 ;
			switch (temp) {
			case 0:
				p1.getList().add(count[i]);
				break;
			case 1:
				p2.getList().add(count[i]);			
				break;
			case 2:
				p3.getList().add(count[i]);
				break;
			default:
				break;
			}
		
		
		}
		System.out.println("豪华斗地主v0.1");
		System.out.println("----------------------");
		System.out.println("分牌数量");
		System.out.println("----------------------");
		System.out.println(p1.getList().size()+"-1");
		System.out.println(p2.getList().size()+"-2");
		System.out.println(p3.getList().size()+"-3");
		System.out.println("----------------------");
		
		
		
		System.out.println("分牌结果");
//		System.out.println("底牌:" + count[51]+","+count[52]+","+count[53]);
		System.out.println("底牌:" + getName(count[0])+","+getName(count[1])+","+getName(count[2]));
		
		System.out.println("----------------------");
		//没啥好说的,打印出三个人的牌
		//第1个人
		System.out.println(p1.getName());
		Iterator<Integer> i1 = p1.getList().iterator();
		while (i1.hasNext()) {
			int temp = i1.next();
			System.out.print(getName(temp)+",");
		}
		
		System.out.println();
		System.out.println();
		//第2个人
		System.out.println(p2.getName());
		Iterator<Integer> i2 = p2.getList().iterator();
		while(i2.hasNext()){
			int temp = i2.next();
			System.out.print(getName(temp)+",");
		}
		System.out.println();
		System.out.println();
		//第3个人
		System.out.println(p3.getName());
		Iterator<Integer> i3 = p3.getList().iterator();
		while(i3.hasNext()){
			int temp = i3.next();
			System.out.print(getName(temp)+",");
		}
		
	}
	//这个方法是获取这张牌是什么花色.比如梅花3 红桃3
	//原理其实很简单。就是54张牌分别对应不同的花色
	//1234 分别是红心3梅花3黑桃3方块3
	//5678 分别是红心4梅花4黑桃4方块4 依次类推
	//方便判断 牌的大小
	public static String getName(int temp){
		if(temp % 4 == 0){
			return 	"方块"+temp/4;
		}
		int res = temp/4;
		int count = temp - res * 4;
		if(res >=13){
			if(count == 2){
				return "小王";
			}else{
				return "大王";
			}
		}
		int i = res + 1;
		String s = "";
		switch (count) {
		case 1:
			//红桃 
			s += "红桃"+i;
			break;
		case 2:
			//黑桃
			s += "黑桃"+i;
			break;
		case 3:
			//梅花
			s += "梅花"+i;
			break;
		default:
			break;
		}
		return s;
	}
	//这儿方法是随机产生1-54 数字不重复模拟洗牌
	public static int[] randomArray(int min,int max,int n){  
	    int len = max-min+1;  
	      
	    if(max < min || n > len){  
	        return null;  
	    }  
	      
	    //初始化给定范围的待选数组  
	    int[] source = new int[len];  
	       for (int i = min; i < min+len; i++){  
	        source[i-min] = i;  
	       }  
	         
	       int[] result = new int[n];  
	       Random rd = new Random();  
	       int index = 0;  
	       for (int i = 0; i < result.length; i++) {  
	        //待选数组0到(len-2)随机一个下标  
	           index = Math.abs(rd.nextInt() % len--);  
	           //将随机到的数放入结果集  
	           result[i] = source[index];  
	           //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换  
	           source[index] = source[len];  
	       }  
	       return result;  
	}  

}
//用面向对象来存放每个人手中的牌
//你也可以对手中的牌进行排序只要对list进行排序就行了,
//由于博主比较懒没排序 请见谅
class Person{
	private String name;
	private  ArrayList<Integer> list;
	public Person(String name) {
		list = new ArrayList<Integer>();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public ArrayList<Integer> getList() {
		return list;
	}
	public void setList(ArrayList<Integer> list) {
		this.list = list;
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值