黑马程序员技术交流社区
标题:
一起莱尼做洗牌发牌
[打印本页]
作者:
迦罗叶
时间:
2014-2-20 07:00
标题:
一起莱尼做洗牌发牌
使用打乱算法洗牌,发牌
提示:需要两个数组
数组1:定义一副牌
数组2:确定玩家,斗地主{"沈春阳","张柏芝","林青霞"}
* 洗牌
* 发牌:0,1,2 牌%
作者:
lei
时间:
2014-2-20 11:25
/*题目:使用打乱算法洗牌,发牌
提示:需要两个数组
数组1:定义一副牌
数组2:确定玩家,斗地主{"沈春阳","张柏芝","林青霞"}
洗牌
发牌:0,1,2 牌%
思路和步骤:1.首先应该生成一副扑克牌,扑克牌的规律是有2到10以及J,Q,K,A,小王和大王。可以将它们定义在一个字符串数组中。
2.接着是洗牌。洗牌是随机事件,可以想到随机数发生器Random。通过多次循环随机抽取定义的扑克牌数组中的元素
进行交换位置来达到洗牌效果。
3.最后是发牌。发牌可以通过定义4个动态数组即arraylist来分别对应3个玩家和最后的底牌。我们通过循环遍历的方式将洗好
的牌按规则添加到4个arraylist中去。再打印输出。
*/
import java.util.*;
class Test2 {
/*
生成一副扑克牌
*/
public static String[] poker()
{
String[] s1 = { "黑桃", "红桃", "梅花", "方片" };
String[] s2 = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
String[] s3 = { "小王", "大王" };
String[] s4 = new String[54];
s4[52] = s3[0];
s4[53] = s3[1];
for (int i = 0; i < 52; i++) {
s4[i] = s1[i % 4] + s2[i / 4];
}
return s4;
}
/*
洗牌
*/
public static String[] shuffle(String[] s2)
{
for (int i = 0; i < 100; i++)
{
String k;
Random ran = new Random();
int ran1 = ran.nextInt(54);
int ran2 = ran.nextInt(54);
//通过随机抽取两张牌的位置进行交换来进行洗牌。
k = s2[ran1];
s2[ran1] = s2[ran2];
s2[ran2] = k;
}
return s2;
}
/*
斗地主发牌,最后留三张。
*/
public static void deal(String[] s1)
{
ArrayList<String> wanjia1 = new ArrayList<String>();
ArrayList<String> wanjia2 = new ArrayList<String>();
ArrayList<String> wanjia3 = new ArrayList<String>();
ArrayList<String> dipai = new ArrayList<String>();
for (int i = 0; i < 54; i++)
{
int k = i % 3;
if(i>50)
dipai.add(s1[i]);
else if (k == 0)
wanjia1.add(s1[i]);
else if (k == 1)
wanjia2.add(s1[i]);
else
wanjia3.add(s1[i]);
}
System.out.println("沈春阳的牌:"+wanjia1+"\n"+"\n"+"张柏芝的牌:"+wanjia2+"\n"+"\n"+"林青霞的牌:"+wanjia3+"\n"+"\n"+"底牌:"+dipai);
}
/*
main函数调用执行进行洗牌和发牌功能。
*/
public static void main(String[] args)
{
String[] s1 =new String[54];
s1 = poker(); //生成一副牌。
shuffle(s1); //洗牌。
deal(s1); //发牌。
}
}
复制代码
作者:
lei
时间:
2014-2-20 11:26
这是运行结果
QQ图片20140220111842.jpg
(101.15 KB, 下载次数: 22)
下载附件
2014-2-20 11:26 上传
作者:
luoanjade
时间:
2014-2-20 19:46
有意思,我前两天刚写洗牌,发牌的程序,“斗地主”和“升级”(一副牌的)。在这里看到了。
顶一下!
楼上写的比较好,我是直接用Collections里面的shuffle()方法,没有自己写。
作者:
徐老爹
时间:
2014-2-20 21:09
import java.util.*;
class Demo04
{
public static void main(String[] args)
{
Random r =new Random();
String[] s ={"1","2","3","4","5","6","7","8","9","10","j","q","k","jorker","JORKER"};
//为了简化,只定义了15张扑克
for (int j=s.length-1;j>=0 ;j-- )
{
int index=r.nextInt(s.length);//使用随机函数将扑克牌进行打乱
String temp ="0";
temp=s[j];
s[j]=s[index];
s[index]=temp;
}
System.out.println(Arrays.toString(s));
String[] s1=new String [5]; //定义三个玩家数组。
String[] s2=new String [5];
String[] s3=new String [5];
int i =0;
int a=0;
int b=0;
int c=0;
//个人感觉此处应该能有所简化,但是想不出更好的方法了,希望能一起探讨
for (i=0;i<15 ;i++ )
{
if (i%3==0)
{
s1[a]=s[i];
a++;
}
if (i%3==1)
{
s2[b]=s[i];
b++;
}
if (i%3==2)
{
s3[c]=s[i];
c++;
}
}
System.out.println("s1="+Arrays.toString(s1));//分别打印三个玩家获得的手牌
System.out.println("s2="+Arrays.toString(s2));
System.out.println("s3="+Arrays.toString(s3));
}
}
楼主,因为我暂时只学到了数组的相关知识,后面容器的用法并不了解,所以用最基本的知识粗糙的解答此题,(例如定义的扑克只有15张,没有留底牌等),希望能一起探讨学习。
作者:
迦罗叶
时间:
2014-2-20 21:47
import java.util.*;
class Test02
{
public static void main(String[] args)
{
newPk();
}
/*思考:
使用打乱算法洗牌,发牌
提示:需要两个数组
数组1:定义一副牌
数组2:确定玩家,斗地主{"沈春阳","张柏芝","林青霞"}
* 洗牌
* 发牌:0,1,2 牌%3
*/
public static void newPk()
{
//定义一副牌,用数组
String[] pk = {"红桃A","黑桃A","方块A","梅花A","红桃2","黑桃2","方块2","梅花2",
"红桃3","黑桃3","方块3","梅花3","红桃4","黑桃4","方块4","梅花4",
"红桃5","黑桃5","方块5","梅花5","红桃6","黑桃6","方块6","梅花6",
"红桃7","黑桃7","方块7","梅花7","红桃8","黑桃8","方块8","梅花8",
"红桃9","黑桃9","方块9","梅花9","红桃10","黑桃10","方块10","梅花10",
"红桃J","黑桃J","方块J","梅花J","红桃Q","黑桃Q","方块Q","梅花Q",
"红桃K","黑桃K","方块K","梅花K","jorker","JORKER"};
//首先将牌随机洗乱,然后用一数组储存
String[] arr = new String[54];
boolean[] base = new boolean[54];
int a = 0;
do
{
Random r = new Random();
int temp = r.nextInt(arr.length);
if(!base[temp])
{
arr[a++] = pk[temp];
base[temp] = true;
}
}
while (a<pk.length);
//需要将洗好的牌按顺序发给3个人,我们用三个数组来储存
String[] name1 = new String[17];
String[] name2 = new String[17];
String[] name3 = new String[17];
int i=0,j=0,k=0;
for (int x = 0; x<51;x++ )
{
if(x%3==0)
{
name1[i++] = arr[x];
}
if(x%3==1)
{
name2[j++] = arr[x];
}
if(x%3==2)
{
name3[k++] = arr[x];
}
}
System.out.println(Arrays.toString(arr));//洗后的牌
System.out.println("--------------------------------------------------------");
System.out.println(Arrays.toString(name1));//第一个人的牌
System.out.println("--------------------------------------------------------");
System.out.println(Arrays.toString(name2));//第二个人的牌
System.out.println("--------------------------------------------------------");
System.out.println(Arrays.toString(name3));//第三个人的牌
//还需要定义一个数组来装最后三张牌,也是按顺序
System.out.println("--------------------------------------------------------");
String[] lastPk = new String[3];
lastPk[0] = arr[51];
lastPk[1] = arr[52];
lastPk[2] = arr[53];
System.out.println(Arrays.toString(lastPk));
}
}
复制代码
上面楼层的,我也是刚学到数组,但是我好像定义的数组太多了
作者:
皓栎
时间:
2014-2-21 20:27
lei 发表于 2014-2-20 11:25
思路清晰,给力。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2