⽤Java编写简单的扑克牌游戏
昨天我帮助⼀位朋友解决了这个问题,今天我即兴想写⼀篇详细的关于⽤Java编写扑克牌游戏的⽂章。 当然我这⾥只是实现⼀些简单的功能。
关于扑克牌游戏的特征,想必⼤家都有所接触过,有扑克牌,玩扑克牌游戏的玩家还有玩法。 扑克牌的特点是它有点数和花⾊,当然⼤⼩王除外,⼤⼩王没有花⾊。
玩扑克牌游戏的玩家的特点是他们都有⼀个游戏名称,还有就是在玩扑克牌游戏时,他们还有⼀个特点就是游戏中的⾝份,是地主还是农民,除此之外,他们⼿中还有扑克牌。
⾄于玩法就是⾸先得有3个⼈,然后就开始洗牌,发牌,抢地主,最后每个⼈⼿中有17张牌,最后底牌给地主,最后整理牌。
经过上⾯的分析,我们就知道要建3个类:扑克牌类(Card类),玩家类(Player类),游戏类(即玩法类Game类)
⾸先我们开始写扑克牌类(Card类):
在Card类中写上刚刚分析的属性:花⾊和点数。除此之外,我还定义了⼀个size属性,因为扑克牌要是
只有数字像0,1,2,3,4,5,6,7,8,9这样的,我们好排序,但是扑克牌中还有J,Q,K,A这样的,我们不好对它进⾏排序。所以我定义了⼀个size属性给牌设置⼤⼩⽅便整理牌
public class Card {
//花⾊
private String decor;
//点数
private String point;
//给牌设置⼤⼩(⽅便排序)
private int size;
在Card类中我们还要显⽰扑克牌,就是显⽰扑克牌的花⾊加点数,注意⼤⼩王没有花⾊的点数,因此我们在显⽰的时候可以判断⼀下。
@Override
public String toString() {
//做判断,如果是⼤⼩王则不要花⾊
if (Objects.isNull(decor) || Objects.equals(decor, "")) {
return point;
}
//不是⼤⼩王就要花⾊
return decor + "-" + point;
}
上⾯我们就完成了Card类,接下来我们就开始写玩家类(Player类)。
在Player类中我们也把玩家类的属性写上:姓名,是否是地主,⼿中的牌
public class Player {
/
/玩扑克游戏的⼈的名称
private String name;
//地主
private boolean boss;
//玩扑克游戏⼈⼿中的牌
private List<Card> playerPoker=new ArrayList<>();
在玩家信息的显⽰这⾥,我们可以通过getName()⽅法来获得玩家的姓名,但是,我们没有显⽰地主和农民的信息,要是不显⽰这个信息的话,游戏就出现⼀点问题,所以我在这⾥⽤getGameName()的⽅法显⽰地主和农民的信息。
//获得扑克游戏中的⾓⾊名称
public String getGameName() {
return boss?"地主":"农民";
}
上⾯我们就完成了Player类,接下来我们就开始写最重要的玩法类Game类。
在Game类中我们⾸先得有54张扑克牌,怎么样产⽣这些扑克牌呢?,那就是四种花⾊和13个点数随机结合,当然我这⾥的随机结合是指不重复的结合。我这⾥是使⽤两个for循环来做的,并且在结合的过程中我也为每⼀张扑克牌设置了⼤⼩3对应的是0,4对应的是1,5对应的是2,依次向后。最后,我单独加⼊了⼤⼩王,并设置了他们的⼤⼩。后⾯的排序可以根据size⼤⼩来排序。
public class Game {
List<Card> pokers = new ArrayList<>();
String[] decors = {"红⼼", "⽅块", "梅花", "⿊桃"};
String[] points = {"3", "4", "5", "6", "7", "8",
"9", "10", "J", "Q", "K", "A", "2"};
List<Player> players = new ArrayList<>();
/
/让花⾊和点数随机组合产⽣⼀张扑克牌
{
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < decors.length; j++) {
Card c = new Card(decors[j], points[i]);
//设置扑克牌的⼤⼩
c.setSize(i);
pokers.add(c);
}
}
//由于⼤⼩王没有花⾊单独加⼊
Card card1 = new Card(null, "Queen");
card1.setSize(13);
Card card2 = new Card(null, "King");
card2.setSize(14);
pokers.add(card1);
pokers.add(card2);
}
做完上⾯的操作,我们的游戏就可以开始了。⾸先游戏开始得有三个⼈吧,然后就开始洗牌,发牌,选地主等等操作。在这⾥我是随机了⼀个地主。
public void start(Player p1, Player p2, Player p3) {
//添加玩游戏的⼈
players.add(p1);
players.add(p2);
players.add(p3);
//洗牌
Collections.shuffle(pokers);
//发牌
dealCard();
//选地主
Collections.shuffle(players);
<(0).setBoss(true);
//给地主底牌
giveBossCard();
/
/整理牌
sortCard();
//显⽰
show();
}
发牌的具体代码:
public void dealCard() {
for (int i = 0; i < players.size(); i++) {
<(i).setPlayerPoker(dealStream(i));
}
}
public List<Card> dealStream(int n) {
List<Card> list = pokers.stream()
.skip((n) * 17)
.limit(17)
.List());
return list;
}
给地主底牌的代码:
public void giveBossCard() {
<(0).getPlayerPoker()
.addAll(pokers.subList(pokers.size() - 4, pokers.size()));
}
整理牌的代码:
public void sortCard() {
for (Player player : players) {
}
显⽰玩家⼿中牌的代码:
public void show() {
入门的java游戏小程序players.forEach(s ->
System.out.Name()+"["
+s.getGameName() +"]"+ s.getPlayerPoker()));
}
这⾥我是在Game类中写的主函数main:
public static void main(String[] args) {
Player p1 = new Player("coco");
Player p2 = new Player("tom");
Player p3 = new Player("jerry");
Game game1 = new Game();
game1.start(p1, p2, p3);
}
运⾏结果:
总结:
在这个编程过程中,扑克牌类(Card类)和玩家类(Player类)都是实体类⽐较简单好写,但是这两个类在最后的显⽰部分都要注意⼀下。玩法类(Game类)中的初始化扑克牌要注意⼤⼩王的初始化还有要注意给每张牌设置⼤⼩。玩法类(Game类)中的洗牌,发牌,选地主等的操作⽐较难,会运⽤Collections.shuffle()和subList()⽅法能帮助我们洗牌和发牌。当然选地主时也可以⽤Random随机数来随机。我觉得这⾥最难的还是发完扑克牌后的排序可以让扑克牌类(Card类)实现Comparable接⼝重写CompareTo(),也可以⽤匿名内部类的写法创建排序⽐较器(Comparator)对象重写compare()。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。