要求
编写一个斗地主洗牌发牌的程序,要求按照斗地主的规则完成洗牌发牌的过程。 //先想办法把54张牌存入集合 总共有54张牌,牌面由花色和数字(包括 J、 Q、 K、A 字母)组成, //存入元素长度小于54 花色有♠、♥、♦和♣这4种,分别表示黑桃、红桃、方块和梅花,小☺表示小王,大☻表示大王。 //2-10*4 +大王+小王=54
将这54张牌打乱顺序,共有3位玩家参与游戏,每人轮流一次摸一张牌,剩余3张留为底牌。 程序结束,打印每人手中的纸牌和底牌。例如,打印“玩家1:[♥3,♦4⋯]玩家2:[♠3,♦3⋯]玩家3:[♦6,♠6⋯]底牌: [♣3,大☻, ♥9]”。 */
思路
一:写四个for循环来存储四种花色的各个牌
如果你不太熟悉java的话请先把这一步看懂
package JiaXinTest;
import java.util.*;
public class User {
public static void main(String[] args) {
// for (Integer h = 0; h < 5; h++) {
//
// h.toString();//如何把h变成花色呢‘?
// //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。
ArrayList<String> HuaSe = new ArrayList<String>();
HuaSe.add("♠");
HuaSe.add("♥");
HuaSe.add("♦");
HuaSe.add("♣");
for (String hua : HuaSe) {
System.out.println();
for (int i = 2; i < 11; i++) {
String.valueOf(i);
String hua1 = hua + i;//如何让变量名自己变呢?
// hua1 = hua + i;
System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
}
}
for (String hua2 : HuaSe) {
System.out.println();
String[] strings = new String[]{"A", "J", "Q", "K"};
for (String s : strings) {
String hua3 = hua2 + s;
System.out.print(hua3 + " ");
}
}
}
}
输出:
然后再在原有的基础上搞一个集合把这些元素依次存进去就行了。
已添加所有牌
package JiaXinTest;
import java.util.*;
public class User {
public static void main(String[] args) {
// for (Integer h = 0; h < 5; h++) {
//
// h.toString();//如何把h变成花色呢‘?
// //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。
ArrayList<String> HuaSe = new ArrayList<String>();
HuaSe.add("♠");
HuaSe.add("♥");
HuaSe.add("♦");
HuaSe.add("♣");
HashSet<String> pai = new HashSet<String>();
pai.add("☺");
pai.add("☻");
for (String hua : HuaSe) {
for (int i = 2; i < 11; i++) {
String.valueOf(i);
String hua1 = hua + i;//如何让变量名自己变呢?
// hua1 = hua + i;
// System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
pai.add(hua1);
}
}
for (String hua2 : HuaSe) {
String[] strings = new String[]{"A", "J", "Q", "K"};
for (String s : strings) {
String hua3 = hua2 + s;
// System.out.print(hua3 + " ");
pai.add(hua3);
}
}
for (String p : pai) {
System.out.print(p);
}
}
}
每人轮流一次摸一张牌,剩余3张留为底牌
没人轮流一次摸一张牌这个代码有点难写哦
创建三个对象(player),然后三个take方法?
就这个问题10点想到三点,上代码!
package JiaXinTest;
import java.util.*;
public class User {
static HashSet<String> pai = new HashSet<String>();//原有的牌54
public static void main(String[] args) {
// for (Integer h = 0; h < 5; h++) {
//
// h.toString();//如何把h变成花色呢‘?
// //其实没必要,用集合来存储四个花色,然后遍历这个集合就可以了。
ArrayList<String> HuaSe = new ArrayList<String>();
HuaSe.add("♠");
HuaSe.add("♥");
HuaSe.add("♦");
HuaSe.add("♣");
pai.add("☺");
pai.add("☻");
for (String hua : HuaSe) {
for (int i = 2; i < 11; i++) {
String.valueOf(i);
String hua1 = hua + i;//如何让变量名自己变呢?
// hua1 = hua + i;
// System.out.print(hua1 + " ");//不需要给每张牌取名字啊,我只要把每张牌存进去就可以了。
pai.add(hua1);
}
}
for (String hua2 : HuaSe) {
String[] strings = new String[]{"A", "J", "Q", "K"};
for (String s : strings) {
String hua3 = hua2 + s;
// System.out.print(hua3 + " ");
pai.add(hua3);
}
}
// int i = 0;
// ArrayList<String> player = new ArrayList<String>();
//
// player.add("P1");
// player.add("P2");
// player.add("P3");
HashSet<String> init = new HashSet<String>();//直接将外部传入的引用赋给玩家实例的属性,所有玩家都会共享同一个集合
Player p1 = new Player("p1", init);//注意构造方法一定不能直接赋值,要用addAll,直接赋值等于复制地址,没有为每个对象开辟新的集合
Player p2 = new Player("p2", init);//而当你使用addAll,那么就是创造了一个新的集合。
Player p3 = new Player("p3", init);
// System.out.println(p1);
// for (String p : pai) {
//
p1.take(p);
p2.take(p);
p3.take(p);这样取得都是同一张牌
// System.out.println(p1);
//
// p1.take(p);
if (pai.remove(p)){//为什么我把被p1拿走的牌删掉以后for就不能再执行了?//如果你要在集合遍历的时候删除元素就只能iterator
//
// System.out.println("p+1:"+ p + 1);//我想获取这个p的下一个元素应该怎么写?
//
//
}else {
p2.take(p);
p3.take(p);
//
}
// }
//================================================改用iterator吧,感觉for循环是行不通了。======================================================
Iterator<String> iterator = pai.iterator();
while (iterator.hasNext()) {
String p = iterator.next();
p1.take(p);
iterator.remove();//搞了半天原来是这里错了,应该用iterator.remove
String ptwo = iterator.next();
p2.take(ptwo);//这里的p应该是指p的下一个元素,我应该怎么做呢?//为什么这里就跳出了无法执行呢?
//为什么p2添加的,分配到的牌也是j呢?也就是说这里的iterator是一样的//我通过调试检查了,其实是分配到的牌是不一样的,那么为什么最后打印出来三个人的牌是一样的呢?
iterator.remove();
String pthree = (iterator.next());
p3.take(pthree);
iterator.remove();
//===============应该用hasnext来判断还有没有下一个,如果有下一个(赋值)的话就拿走这一个,因为已经删掉第一个了。
}
System.out.println("p1 " + p1.initPais);
System.out.println("p2 " + p2.initPais);
System.out.println("p3 " + p3.initPais);
}
}
player类
package JiaXinTest;
import java.util.ArrayList;
import java.util.HashSet;
public class Player {
// new ArrayList.var//为什么不可以?我希望每个对象都有一个集合,为什么不可以这样写?
//不可以用快捷键
HashSet<String> initPais = new HashSet<String>();
String name;
@Override
public String toString() {
return name;
}
public Player() {
}
public Player(String name, HashSet<String> initPais) {//我希望每个player对象都有一个HashSet应该怎么做?这里为什么会报错?应该怎么写才不会报错?//忘记给名字了
this.name = name;
this.initPais.addAll(initPais);//说实话这一步我不太懂,是把对象的、每个玩家的牌添加initPais,自己添加自己有啥用啊?这就是自己添加自己对吗?
}
public HashSet take(String p) {
if ((initPais.size()) < 17) {
this.initPais.add(p);//但是我感觉你这样做和我在有参的方法里this.initpais = initpais;没区别啊
}
return initPais;
}
}
还有如何留下三张做底牌的,交给大家来完成了,记得交作业哦~