本文主要讲解扑克牌的简单组成,以及游戏的运行过程,使用控制台运行。
代码中注释讲解的比较清楚,就不在做额外解释。
一、定义扑克牌的面及对应大小
static {
String[] color = {"♠", "♥", "♣", "♦"};//花色
String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//数字
int count = 1;//定义牌的对应大小
for (String n : number) {
for (String c : color) {
cardBox.put(c + n, count);
}
count++;//递增
}
cardBox.put("joker", count);//开头小写是小王
cardBox.put("Joker", count);//开头大写是大王
}
二、打乱以及发牌
ArrayList<String> player1 = new ArrayList<>();//玩家一的牌
ArrayList<String> player2 = new ArrayList<>();//玩家二的牌
ArrayList<String> deck = new ArrayList<>();//牌堆
Collections.shuffle(list);//打乱牌堆
//发牌,给每个玩家轮流发一张牌
for (int i = 0; i < list.size(); i++) {
if (i % 2 == 0) {
player1.add(list.get(i));
} else {
player2.add(list.get(i));
}
}
//也可以直接截取前一半牌给玩家一,后一半牌给玩家二
for (int i = 0; i < list.size() / 2; i++) {
player1.add(list.get(i));
}
for (int i = list.size() / 2; i < list.size(); i++) {
player2.add(list.get(i));
}
三、游戏的运行
String str = player.remove(0);//获取该玩家牌堆最上面的牌
System.out.println(playerStr + ": " + str);//打印该玩家以及此张牌
deck.add(str);//加入牌堆
for (int i = 0; i < deck.size() - 1; i++) {//获取牌堆的每张牌
if (cardBox.get(str) == 9) {//如果是J
System.out.println("----------牌被" + playerStr + "钓走了----------");//一样则开启新一轮
while (!deck.isEmpty()) player.add(deck.remove(i));//把牌堆里所有的牌加入到该玩家手牌中
} else if (cardBox.get(str) == cardBox.get(deck.get(i))) {//比较是否和本回合玩家出的牌一样
System.out.println("----------" + playerStr + "碰牌----------");//一样则开启新一轮
while (deck.size() > i) player.add(deck.remove(i));//把牌堆里一样的牌到末尾的牌加入到该玩家手牌中
for (String s : deck) {//遍历剩余牌堆的牌
System.out.println(s);
}
}
}
四、获胜条件
if (player1.isEmpty()) {//判断玩家1的牌是否为空
System.out.println("player2获胜");
return true;
} else if (player2.isEmpty()) {//判断玩家2的牌是否为空
System.out.println("player1获胜");
return true;
}
return false;
五、代码总览
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class DGDYGame {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new DGDYGame();//开启一局丁钩钓鱼
}
}
static Map<String, Integer> cardBox = new HashMap<>();//牌盒,键为牌的花色和数字,值为对应大小
static {
String[] color = {"♠", "♥", "♣", "♦"};//花色
String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//数字
int count = 1;//定义牌的对应大小
for (String n : number) {
for (String c : color) {
cardBox.put(c + n, count);
}
count++;//递增
}
cardBox.put("joker", count);//开头小写是小王
cardBox.put("Joker", count);//开头大写是大王
}
public DGDYGame() {
ArrayList<String> list = new ArrayList<>();
cardBox.forEach((integer, s) -> list.add(integer));
GameStart(list);
}
public void GameStart(ArrayList<String> list) {
ArrayList<String> player1 = new ArrayList<>();//玩家一的牌
ArrayList<String> player2 = new ArrayList<>();//玩家二的牌
ArrayList<String> deck = new ArrayList<>();//牌堆
Collections.shuffle(list);//打乱牌堆
//发牌,给每个玩家轮流发一张牌
for (int i = 0; i < list.size(); i++) {
if (i % 2 == 0) {
player1.add(list.get(i));
} else {
player2.add(list.get(i));
}
}
//也可以直接截取前一半牌给玩家一,后一半牌给玩家二
// for (int i = 0; i < list.size() / 2; i++) {
// player1.add(list.get(i));
// }
// for (int i = list.size() / 2; i < list.size(); i++) {
// player2.add(list.get(i));
// }
//System.out.println("player1:" + player1);//打印玩家1的牌
//System.out.println("player2:" + player2);//打印玩家2的牌
while (!player1.isEmpty() || !player2.isEmpty()) {
round(player1, deck, "player1");//运行
if (extracted(player1, player2)) break;//判断
round(player2, deck, "player2");//运行
if (extracted(player1, player2)) break;//判断
}
}
private static boolean extracted(ArrayList<String> player1, ArrayList<String> player2) {
if (player1.isEmpty()) {//判断玩家1的牌是否为空
System.out.println("player2获胜");
return true;
} else if (player2.isEmpty()) {//判断玩家2的牌是否为空
System.out.println("player1获胜");
return true;
}
return false;
}
private void round(ArrayList<String> player, ArrayList<String> deck, String playerStr) {//回合
String str = player.remove(0);//获取该玩家牌堆最上面的牌
System.out.println(playerStr + ": " + str);//打印该玩家以及此张牌
deck.add(str);//加入牌堆
for (int i = 0; i < deck.size() - 1; i++) {//获取牌堆的每张牌
if (cardBox.get(str) == 9) {//如果是J
System.out.println("----------牌被" + playerStr + "钓走了----------");//一样则开启新一轮
while (!deck.isEmpty()) player.add(deck.remove(i));//把牌堆里所有的牌加入到该玩家手牌中
} else if (cardBox.get(str) == cardBox.get(deck.get(i))) {//比较是否和本回合玩家出的牌一样
System.out.println("----------" + playerStr + "碰牌----------");//一样则开启新一轮
while (deck.size() > i) player.add(deck.remove(i));//把牌堆里一样的牌到末尾的牌加入到该玩家手牌中
for (String s : deck) {//遍历剩余牌堆的牌
System.out.println(s);
}
}
}
try {
Thread.sleep(1000);//延时1秒,可以修改或删除
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
六、最终效果
由于中间过程较长,只放出开头及结尾,有兴趣的小伙伴可自行试试。
开始处:
结尾处: