当前位置: 首页 > news >正文

SCAU 发牌程序(java)

发牌程序

思路

  1. 用数字代表扑克牌,例如 0-黑桃A 12-黑桃K 13-红心A
  2. pokeNum-扑克牌副数 , playerNum-人数
  3. 先初始化一个 52*扑克牌副数 的一维数组cards来存放扑克牌,让数组每个元素的值等于它的下标index(现在我们拥有了一个存放了0~51的数组,每个数字对应一张扑克牌)。
  4. 然后洗牌,即将cards里面的元素打乱,这里使用学JavaScript的时候看到的一个随机排列数组的算法 Fisher-Yates shuffle。详述见下文。
  5. 最后分牌,只需要尽量平均地将已经打乱的数组分为 playerNum 组即可(即前几个数组元素代表的牌给第一个人,中间的给第二个人……)。

初始化 initCards()

public void initCards() {
		for(int i = 0 ; i < 52 * pokeNum ; i++) {
			cards[i] = i;
		}

洗牌 cardShuffle()

Fisher-Yates shuffle
核心思想:逆向遍历数组,并将每个元素与其前面的随机的一个元素互换位置。
从后往前遍历数组元素,假设当前元素下标为i(0<i<扑克牌的总数-1)(因为扑克牌是从0开始表示的) ,则用Random对象随机生成一个(0~i)的数 j,然后将当前数组元素cards[i] 与下标为j的元素 cards[j] 交换。

public void cardShuffle() {
		Random rand = new Random();
		for(int i = 52 * pokeNum - 1 ; i >= 1 ; i--) {
			//生成随机数
			int index = rand.nextInt(i);
			//交换
			int temp = cards[index];
			cards[index] = cards[i];
			cards[i] = temp;
		}
}

分牌 dealCards()

平均分配

参考:https://www.cnblogs.com/sinpo828/p/14264518.html
感觉很神奇:D

用数组存储每一种花色的牌

对于每一个人,初始化一个二维数组int [][] c,用来存放各种花色的牌的数字

通过 cards[i] % 52 / 13 得到花色type(取值为0、1、2、3)
将花色作为行的索引,用另一个数组存储该花色目前牌的数目j[type],存储相应的牌: c[type][ j[type]++ ]=cards[i]

输出

可以用type作为字符串数组的下标获取相应花色的字符串。
通过 cards[i] % 52 % 13 可以得到牌面的值,获取对应字符串方式同上。

/* 类中变量
private String huaSe[] = {"黑桃","红心","草花","方块"};
	private String cardValue[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
*/
public void dealCards() {
		for (int i = 0 ; i < playerNum ; i++)
	    {
			int [][]c = new int [4][pokeNum*13];
			int []j = new int [4];
	        int min = pokeNum * 52 * i / playerNum;
	        int max = (pokeNum * 52 * (i + 1)) / playerNum;
	       
	        for (int k = min; k < max; k++) {
	        	int type = cards[k] % 52 / 13;
	        	c[type][j[type]++] = cards[k];
	        	//System.out.println("c["+type+"]["+(j[type]-1)+"]="+c[type][j[type]-1]+" ");
	        }
	        System.out.println("第" + (i + 1) + "个人:");
	        for(int p = 0 ; p < 4 ; p++) {
	            System.out.print(huaSe[p] + ":");
	            for(int q = 0 ; q < j[p] ; q++) {
	            	System.out.print(cardValue[(c[p][q] % 52) % 13] + " ");
	            }
	            System.out.println();
	        }
	   
	    }
	}

代码

/**
  * @author CSDN-孜然の夏天
  * @id 202025310407
  * @date 2021年9月24日
  */

import java.util.Random;
import java.util.Scanner;

public class PokerGame{
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("输入扑克牌幅数:");
		int pokeNum = input.nextInt();
		System.out.print("输入人数:");
		int playerNum = input.nextInt();
	
		Cards c = new Cards(pokeNum,playerNum);
		//初始化牌组
		c.initCards();
		//洗牌
		c.cardShuffle();
		//分牌
		System.out.println("输出如下:");
		c.dealCards();
	}
}
class Cards{
	private int []cards;
	public int pokeNum;
	public int playerNum;
	private String huaSe[] = {"黑桃","红心","草花","方块"};
	private String cardValue[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
	public Cards(int pokeNum , int playerNum){
		this.pokeNum = pokeNum;
		this.playerNum = playerNum;
		cards = new int[(52 * pokeNum) + 1];
	}
	public void initCards() {
		for(int i = 0 ; i < 52 * pokeNum ; i++) {
			cards[i] = i;
		}
		/*for(int i = 0;i<52*pokeNum;i++) {
			System.out.println(i+":"+cards[i]+"  数字:"+(cards[i]%52)+"  牌面:"+cardValue[(cards[i]%52)%13]+" 花色:"+(cards[i]%52)/13);}
		*/
	}
	public void cardShuffle() {
		Random rand = new Random();
		for(int i = 52 * pokeNum - 1 ; i >= 1 ; i--) {
			int index = rand.nextInt(i);
			int temp = cards[index];
			cards[index] = cards[i];
			cards[i] = temp;
		}
		/*for(int i = 0;i<52*pokeNum;i++) {
			System.out.println(i+":"+cards[i]+"  数字:"+(cards[i]%52)+"  牌面:"+cardValue[(cards[i]%52)%13]+" 所属玩家:"+(i/perNum+1)+" 花色:"+(cards[i]%52)/13);}
	
		*/
	}
	public void dealCards() {
		for (int i = 0 ; i < playerNum ; i++)
	    {
			int [][]c = new int [4][pokeNum*13];
			int []j = new int [4];
	        int min = pokeNum * 52 * i / playerNum;
	        int max = (pokeNum * 52 * (i + 1)) / playerNum;
	       
	        for (int k = min; k < max; k++) {
	        	int type = cards[k] % 52 / 13;
	        	c[type][j[type]++] = cards[k];
	        	//System.out.println("c["+type+"]["+(j[type]-1)+"]="+c[type][j[type]-1]+" ");
	        }
	        System.out.println("第" + (i + 1) + "个人:");
	        for(int p = 0 ; p < 4 ; p++) {
	            System.out.print(huaSe[p] + ":");
	            for(int q = 0 ; q < j[p] ; q++) {
	            	System.out.print(cardValue[(c[p][q] % 52) % 13] + " ");
	            }
	            System.out.println();
	        }
	   
	    }
	}
}



相关文章:

  • CSS flex布局 flex-grow不为1 items始终均匀分配剩余空间问题
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [Symbol.toPrimitive](hint) hint 什么时候为 default?
  • JavaScript 对象遍历方法及其遍历顺序的总结
  • vue 实现根据窗口大小自适应图片预览
  • 《计算机网络 自顶向下方法》笔记 - 第二章 应用层
  • 使用 BrowserRouter 报错 invaild hook call 解决方案
  • python中assert关键字的作用
  • CSS3 :nth-child(n)用法
  • CSS3中的transition属性详解
  • HTML中导航栏title前面小图标的实现
  • mysql区分大小写
  • SpringMvc中/和/*的区别
  • varchar 和 varchar2的区别
  • IntelliJ IDEA 各种搜索功能
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 0基础学习移动端适配
  • ECS应用管理最佳实践
  • es6要点
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JAVA 学习IO流
  • Laravel核心解读--Facades
  • linux学习笔记
  • Mybatis初体验
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Promise初体验
  • React16时代,该用什么姿势写 React ?
  • 代理模式
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​io --- 处理流的核心工具​
  • !$boo在php中什么意思,php前戏
  • #LLM入门|Prompt#3.3_存储_Memory
  • #Lua:Lua调用C++生成的DLL库
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (补)B+树一些思想
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (简单) HDU 2612 Find a way,BFS。
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET gRPC 和RESTful简单对比
  • .NET 发展历程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [Android Pro] AndroidX重构和映射
  • [Android] Android ActivityManager