前段时间,面试某知名公司的时候,被问到洗牌技术。当时,没有好的思路,结果,悲剧....
现整理思路如下:
假设洗54张牌,数组pokers存放每张牌的名字,pokersId存放牌的id,洗牌的过程使pokersId随机化。随机思路为产生两个随机数(合适范围),交互这两个位置的牌Id.重复该过程一定次数,原则上至少等于牌的张数。
package cn.edu.hust.cs.j2se.test;
import java.util.Date;
import java.util.Random;
public class ShakePoker {
public static void shake(int[] pokers, int times) {
System.out.println("shaking....");
int pos1 = 0;
int pos2 = 0;
int tmp = 0;
int max = pokers.length;
if (times < pokers.length) {
times = pokers.length;
}
Random rand = new Random(new Date().getTime());
for (int i = 0; i < times; i++) {
//产生随机数
pos1 = rand.nextInt(max) % pokers.length;
pos2 = rand.nextInt(max) % pokers.length;
//交换id
tmp = pokers[pos1];
pokers[pos1] = pokers[pos2];
pokers[pos2] = tmp;
}
}
public static void main(String[] args) {
int[] pokersId = new int[54];
String[] pokers = new String[54];
//红桃♥heart方块♦diamond 黑桃♠spade 梅花♣club
String[] groupName = {"♥","♦","♠","♣"};
String[] pokerName = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
//初始化数据
for(int i=0;i<groupName.length;i++){
for(int j=0;j<pokerName.length;j++){
pokers[i*pokerName.length + j] = groupName[i] + pokerName[j];
}
}
pokers[52] = "JOKER";//大王
pokers[53] = "joker";//小王
int max = pokersId.length;
for (int i = 0; i < pokersId.length; i++) {
pokersId[i] = i;
}
shake(pokersId, max);
System.out.println("after shake....");
for (int i = 0; i < pokersId.length; i++) {
System.out.print(pokers[pokersId[i]] + " ");
if(((i+1)%13)==0){
System.out.println();
}
}
}
}
测试结果大致为
shaking....
after shake....
♠2 ♦8 ♦9 ♥9 ♥5 JOKER ♠Q ♣5 ♠K ♠1 ♥2 ♥K ♣7
♥J ♦6 ♠J ♦4 ♥Q ♦3 ♦10 ♣2 ♣3 ♥3 ♥4 ♥1 ♦K
♥6 ♦7 ♥7 ♣K ♠5 ♠6 ♥8 ♠8 ♠3 ♣6 ♥10 ♣4 ♠7
♣1 ♦Q ♦5 ♠10 ♠9 ♦1 ♣J ♣10 ♠4 ♦J ♣9 joker ♦2
♣Q ♣8
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java编程语言来模拟扑克牌的洗牌和发牌过程。这个过程涉及到了数组、随机数生成、以及基本的算法设计。首先,我们需要理解扑克牌的基本规则和结构。 扑克牌通常包含52张牌,分为四...
总的来说,实现一个Java扑克牌游戏涉及到多个步骤,包括定义扑克牌和牌组的类,制定游戏规则,以及构建游戏循环。这个过程可以帮助初学者巩固Java基础知识,理解面向对象编程,同时还能接触到算法和游戏设计思维。...
本篇主要介绍如何利用Java语言实现一种模拟人工洗牌的功能。在程序设计中,洗牌算法通常用来随机化一组元素的顺序,使得每次运行程序时都能得到不同的结果,这对于游戏开发、随机抽样等场景非常有用。 #### 二、...
例如,洗牌可以通过Fisher-Yates(Knuth)洗牌算法实现,确保随机性;发牌则需要考虑公平性和效率。 4. **事件驱动编程**:如果是图形用户界面(GUI)版的游戏,开发者可能会使用Java Swing或JavaFX库来构建。事件...
通过以上步骤,我们成功地在Java中实现了扑克牌的创建、洗牌、分组和排序。这不仅是对基础编程技能的训练,也是对Java集合框架、面向对象设计以及算法理解的巩固。通过实践这样的问题,开发者可以更好地掌握数据结构...
在 Java 程序中,`Card` 类主要用于表示扑克牌,并且包含了洗牌 (`washCard`) 和发牌 (`sendCard`) 的功能。 #### 1.1 **属性** - `int[] poker`: 存储所有扑克牌的数组,长度为 104,包含了两副扑克牌。 - `Random...
Java中的洗牌通常通过 Fisher-Yates(也称为 Knuth)洗牌算法 实现。该算法通过遍历数组并随机交换当前元素与未遍历元素之一的位置来达到打乱顺序的目的。`java.util.Random`类可以用来生成随机索引。 - 首先,创建...
在这个场景中,我们将讨论如何使用Java编程语言来实现扑克牌的创建、洗牌和发牌功能。我们将深入理解栈数据结构在其中的应用,以及如何通过面向对象编程设计来实现这些功能。 首先,`Card`文件名可能表示一个名为`...
此程序用C完成了对52张扑克牌的洗牌和发牌,程序内容比较简单易学
主要用到了数组的思想去生成纸牌,用随即产生的数来洗牌,然后发牌!
- **洗牌功能的实现**:最初设计的洗牌功能无法满足需求,最终通过将整个牌组初始化的方式简化了这一过程。 - **类和方法的整合**:在项目开发过程中,如何有效地整合已定义的类和方法成为一个难点。这反映了对面向...
在介绍Java模拟扑克牌洗牌生成52张扑克牌的过程中,涉及了多个重要的Java编程概念和知识点,主要包括: 1. Java数组的使用:在创建扑克牌时,首先定义了两个字符串数组face和number,分别代表扑克牌的花色和数字。...
在Java编程语言中,"java洗牌游戏"通常是指创建一个程序来模拟扑克牌的洗牌过程。这个项目非常适合初学者学习,因为它涉及到基础的数组操作、随机数生成以及简单的图形用户界面(GUI)设计。下面我们将深入探讨相关...
同时,还需要一个`Deck`类来存储所有牌,并提供洗牌、发牌等操作。 2. **对象和类**:Java的面向对象特性在这里尤为重要。`Player`类可以用来表示玩家,包含了玩家的分数、手牌等相关属性和方法。 3. **随机数生成...
在Java编程语言中,"洗牌"是一种常见的算法,它常用于模拟扑克牌游戏或者其他需要随机排列元素的场景。这个过程通常涉及到数组或集合的随机排序。在这个问题中,我们关注的是如何使用`java.util.Random`类来实现这一...
这包括洗牌(shuffling)和发牌(dealing)。在这个类中,我们可以使用ArrayList或者LinkedList来存储Card对象,并实现相应的操作方法。 ```java import java.util.ArrayList; import java.util.Collections; ...
我们需要一个初始化方法来填充牌堆栈,以及一个方法来洗牌(通过随机打乱数组顺序实现): ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class PokerDeck {...
这是一个自动洗牌的jar程序,可以自行输入卡牌来随机抽取
实现的功能:一副扑克牌(去掉大、小王),随机洗牌后,从上到下,顺序地发给四名玩家,每人发四张,比较四个人手中最大的那张牌的大小,谁的牌大,谁是赢家。13张牌在比大小的时候遵循挖坑的规则。(从小到大依次是...
- 使用`getPoker()`方法获取初始扑克牌数组,并通过随机算法对其进行洗牌。 - 最后,遍历整个数组,将牌分配给四个玩家,并打印出每个玩家手中的牌。 - **`getColor`方法**: - 此方法接收一个整数参数`i`,并...