昨天我幫助一位朋友解決了這個問題,今天我即興想寫一篇詳細的關于用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);
players.get(0).setBoss(true);
//給地主底牌
giveBossCard();
//整理牌
sortCard();
//顯示
show();
}
發牌的具體代碼:
public void dealCard() {
for (int i = 0; i < players.size(); i++) {
players.get(i).setPlayerPoker(dealStream(i));
}
}
public List<Card> dealStream(int n) {
List<Card> list = pokers.stream()
.skip((n) * 17)
.limit(17)
.collect(Collectors.toList());
return list;
}
給地主底牌的代碼:
public void giveBossCard() {
players.get(0).getPlayerPoker()
.addAll(pokers.subList(pokers.size() - 4, pokers.size()));
}
整理牌的代碼:
public void sortCard() {
for (Player player : players) {
player.getPlayerPoker().sort((s1, s2) -> s1.getSize() - s2.getSize());
}
}
顯示玩家手中牌的代碼:
public void show() {
players.forEach(s ->
System.out.println(s.getName()+"["
+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(),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291458.html
標籤:java
上一篇:【小白學java】D34》》》類加載(器)& 反射 & 正則運算式
下一篇:JVM(一)
