一副撲克牌(不含大小王) 52張
基本遊戲規則:
1、洗牌(打亂牌的順序)
2、給五名玩家,各發兩張牌 依次發牌
3、判斷最後 ♠A 在誰手裡 誰獲勝
升級玩法:
4、讓每名玩家,依次抽取他的下家一張隨機手牌。。。 然後再去找 ♠A
5、因為周潤發是賭神,所以他有變牌的能力: 他一旦手中沒有黑桃A,就可以把第一張牌和有黑桃A的玩家互換
(交換牌之前,有機會變一次;交換牌以後,有機會變一次)
話不多說,直接上程式碼:
首先我們新建兩個類 玩家類 和 手牌類,用來定義我們玩遊戲所需要的變數
玩家類:
class Player{
public String name; // 玩家姓名
public List<Card> cards = new ArrayList<>();
public Player(String name) {
this.name = name;
}
}
手牌類:
class Card {
public String suit; // 花色
public int rank; // 數值
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "{'" + suit + '\'' + ", " + rank + '}';
}
@Override
// 重寫equals 方法,用來比較兩個物件
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof Card)) return false;
Card card = (Card) o;
return rank == card.rank &&
Objects.equals(suit, card.suit);
}
}
接下來就到了我們玩遊戲的公共類中,在類中實現操作:
public class Game {
}
1、我們先把我們一塊玩遊戲的小夥伴範例出來:
List<Card> cards = new ArrayList<>(); // 範例化撲克牌
List<Player> players = new ArrayList<>(); // 範例化玩家
players.add(new Player("周潤發"));
players.add(new Player("劉德華"));
players.add(new Player("周星馳"));
players.add(new Player("作者喬"));
players.add(new Player("帥氣的你"));
2、玩家我們找齊了,現在我們得找一副撲克牌,即初始化撲克牌:
// 初始化撲克牌
private static void initializeCards(List<Card> cards) {
for(String suit : new String[] {"♠","♥","♦","♣"}) {
for(int rank = 1;rank <= 13;rank++) {
Card card = new Card(suit,rank);
// 把撲克牌放入牌組中
cards.add(card);
}
}
}
3、發了撲克牌以後,我們得把玩家的手牌給列印出來:
// 列印出每位玩家的 手牌
public static void printPlayerHandCardList(List<Player> players) {
for (Player player : players) {
System.out.printf(" %s 的手牌是: %s%n", player.name, player.cards);
}
}
4、現在我們都準備好了,遊戲馬上開始:
(1)洗牌:(洗完牌後我們不需要列印,這裡列印只是為了方便偵錯)
// 呼叫 Collections 下的 Shuffle(洗牌)方法
// 進行洗牌
Collections.shuffle(cards);
System.out.println("洗牌完成後的牌");
System.out.println(cards);
(2)發牌:
// 發牌
int n = 2; // 每名玩家發幾張牌
for(int i = 0; i < n ; i++) { // 一共發兩輪牌
for(Player player : players) { // 每名玩家依次抽牌
Card card = cards.remove(0); // 從牌組中,抽一張牌出來
player.cards.add(card); // 把這張牌放到當前玩家的手中
}
}
System.out.println("現在牌組中剩餘的牌: ");
System.out.println(cards);
(3)現在大家都拿到牌了,我們就得判斷是誰獲勝了,即 ♠A 在誰手裡
// 找出 ♠A
Card toFoundCard = new Card("♠",1); // toFoundCard 就當成我們的 ♠A
for (Player player : players) {
for (Card card : player.cards) {
// 比較每張牌和要找的那張牌是否是同一張牌
if(card.equals(toFoundCard)) {
System.out.println(player.name+ " 獲勝 !!!");
return;
}
}
}
System.out.println("這把大家打平了!!!");
}
System.out.println("交換牌之前: ");
printPlayerHandCardList(players);
你以為遊戲到這裡就結束了嘛。。。不,才剛剛開始
(4)我們現在在讓每位玩家依次隨機摸取下家的一張手牌
// 交換牌(每名玩家抽取下家的一張隨機手牌)
Random random = new Random(); // 生成一個亂數
for (int i = 0; i < players.size();i++) {
Player currentPlayer = players.get(i); // 當前物件的牌
Player nextPlayer = players.get(i != players.size() - 1 ? i+1 : 0);
int toDrawIndex = random.nextInt(nextPlayer.cards.size()); // 獲取下一個玩家的隨機一張牌
Card drawCard = nextPlayer.cards.remove(toDrawIndex); // 刪除被取出的牌在原玩家中的資訊
currentPlayer.cards.add(drawCard); // 將取出牌的資訊加到當前物件中
}
System.out.println("交換牌之後: ");
printPlayerHandCardList(players);
(5)周潤發可是我們心中的賭神哎,所以我們應該給發哥點超能力,允許我們的發哥可以換牌,將自己的第一張牌和玩家中持有♠A的玩家換牌。(其他玩家不知道,所以是超能力,偷換)
Player 周潤發 = players.get(0);
winFaGe (周潤發,toFoundCard,players);
// 周潤發 換牌發功
public static void winFaGe (Player 周潤發,Card toFoundCard,List<Player> players) {
if(!周潤發.cards.contains(toFoundCard)) { // 若發哥手中沒有 黑桃A
Card card = 周潤發.cards.get(0);
周潤發.cards.set(0,toFoundCard);
for(int i = 1; i < players.size(); i++) {
if(players.get(i).cards.contains(toFoundCard)) { // 找到拿黑桃A的那個玩家
/*players.get(i).cards.remove(toFoundCard); // 先把發哥手著的第一張牌移除
players.get(i).cards.add(card); // 將黑桃A放入發手中*/
int j = players.get(i).cards.indexOf(toFoundCard);
players.get(i).cards.set(j,card);
}
}
}
}
結果會有兩種情況:
①五個玩家中有人拿到 ♠A ,但是被髮哥給換走了,所以發哥獲勝
②五個玩家中沒人拿到 ♠A,所以大家打平了
最後我們給出全部的程式碼:
import java.util.*;
class Player{
public String name; // 玩家姓名
public List<Card> cards = new ArrayList<>();
public Player(String name) {
this.name = name;
}
}
class Card {
public String suit; // 花色
public int rank; // 面值
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "{'" + suit + '\'' + ", " + rank + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof Card)) return false;
Card card = (Card) o;
return rank == card.rank &&
Objects.equals(suit, card.suit);
}
}
public class ArrayListDemo {
public static void main(String[] args) {
List<Card> cards = new ArrayList<>();
List<Player> players = new ArrayList<>();
players.add(new Player("周潤發"));
players.add(new Player("劉德華"));
players.add(new Player("周星馳"));
players.add(new Player("作者喬"));
players.add(new Player("帥氣的你"));
// 初始化撲克牌
initializeCards(cards);
// 呼叫 Collections 下的 Shuffle(洗牌)方法
// 進行洗牌
Collections.shuffle(cards);
System.out.println("洗牌完成後的牌");
System.out.println(cards);
// 發牌
int n = 2; // 每名玩家發幾張牌
for(int i = 0; i < n ; i++) { // 一共發兩輪牌
for(Player player : players) { // 每名玩家依次抽牌
Card card = cards.remove(0); // 從牌組中,抽一張牌出來
player.cards.add(card); // 把這張牌放到當前玩家的手中
}
}
System.out.println("現在牌組中剩餘的牌: ");
System.out.println(cards);
System.out.println("交換牌之前: ");
printPlayerHandCardList(players);
Card toFoundCard = new Card("♠",1);
Player 周潤發 = players.get(0);
winFaGe(周潤發,toFoundCard,players);
System.out.println("發哥第一次發功之後的牌: ");
printPlayerHandCardList(players);
// 交換牌(每名玩家抽取下家的一張隨機手牌)
Random random = new Random(); // 生成一個亂數
for (int i = 0; i < players.size();i++) {
Player currentPlayer = players.get(i); // 當前物件的牌
Player nextPlayer = players.get(i != players.size() - 1 ? i+1 : 0);
int toDrawIndex = random.nextInt(nextPlayer.cards.size()); // 獲取下一個玩家的隨機一張牌
Card drawCard = nextPlayer.cards.remove(toDrawIndex); // 刪除被取出的牌在原玩家中的資訊
currentPlayer.cards.add(drawCard); // 將取出牌的資訊加到當前物件中
}
System.out.println("交換牌之後: ");
printPlayerHandCardList(players);
winFaGe (周潤發,toFoundCard,players);
System.out.println("發哥第二次成功之後: ");
printPlayerHandCardList(players);
// 找出 ♠A
for (Player player : players) {
// 比較每張牌和要找的那張牌是否是同一張牌
if(player.cards.indexOf(toFoundCard) != -1) {
System.out.println(player.name+ " 獲勝 !!!");
return;
}
}
System.out.println("這把大家打平了!!!");
}
// 列印出每位玩家的 手牌
public static void printPlayerHandCardList(List<Player> players) {
for (Player player : players) {
System.out.printf(" %s 的手牌是: %s%n", player.name, player.cards);
}
}
// 周潤發 換牌發功
public static void winFaGe (Player 周潤發,Card toFoundCard,List<Player> players) {
if(!周潤發.cards.contains(toFoundCard)) { // 若發哥手中沒有 黑桃A
Card card = 周潤發.cards.get(0);
周潤發.cards.set(0,toFoundCard); // 得到發哥的第一張手牌
for(int i = 1; i < players.size(); i++) {
if(players.get(i).cards.contains(toFoundCard)) { // 找到拿黑桃A的那個玩家
/*players.get(i).cards.remove(toFoundCard); // 先把發哥手著的第一張牌移除
players.get(i).cards.add(card); // 將黑桃A放入發手中*/
int j = players.get(i).cards.indexOf(toFoundCard);
players.get(i).cards.set(j,card);
}
}
}
}
// 初始化撲克牌
private static void initializeCards(List<Card> cards) {
for(String suit : new String[] {"♠","♥","♦","♣"}) {
for(int rank = 1;rank <= 13;rank++) {
Card card = new Card(suit,rank);
// 把撲克牌放入牌組中
cards.add(card);
}
}
}
}