小猫钓鱼纸牌游戏java_java实现纸牌游戏之小猫钓鱼算法

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。

输入

2 4 1 2 5 6

3 1 3 5 6 4

输出

小哼win

小哼当前手中的牌是 5 6 2 3 1 4 6 5 桌上的牌是 2 1 3 4

这道题目完全考察栈跟队列的应用,桌面上的牌是栈,个人手中的牌是队列。

附上JAVA实现的源码:

import java.util.LinkedList;

import java.util.Scanner;

import java.util.Stack;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

LinkedList a = new LinkedList();//A手中的牌

LinkedList b = new LinkedList();//B手中的牌

Stack stack = new Stack<>();//记录桌面上的牌

int[] book = new int[10];//用来标记哪些牌已经在桌上

int n,t,s;

for(int i = 0; i < 10; i++){

book[i] = 0;

}

System.out.println("输入手中牌的个数");

n = scanner.nextInt();

System.out.println("输入A君手中牌的大小");

for(int i = 1; i<=n; i++){

a.addLast(scanner.nextInt());

}

System.out.println("输入B君手中牌的大小");

for(int i = 1; i<=n; i++){

b.addLast(scanner.nextInt());

}

System.out.println("输入完毕开始游戏");

while (!a.isEmpty() && !b.isEmpty()) {//当有人手中没牌游戏结束

t = a.removeFirst();

if (book[t] == 0) {//A没有赢

stack.push(t);//桌面上加一张牌

book[t] = 1;//记录桌面上已经有这张牌了

}else {//A赢了

a.addLast(t);//将打出的牌到到末尾

while (!stack.peek().equals(t)) {//将桌面上的牌按顺序放到A的末尾

s = stack.pop();

a.addLast(s);

book[s] = 0;

}

}

//同上B取出牌

t = b.removeFirst();

if (book[t] == 0) {

stack.push(t);

book[t] = 1;

} else {

b.addLast(t);

while (!stack.peek().equals(t)) {

s = stack.pop();

b.addLast(s);

book[s]= 0;

}

}

}

if (!a.isEmpty()) {//A胜利

System.out.println("A君胜利!A手中的牌是");

while (!a.isEmpty()) {

System.out.print(a.removeFirst()+ " ");

}

System.out.println();

if (!stack.isEmpty()) {//桌面上有牌

System.out.println("桌面上的牌是");

for (Integer x : stack) {

System.out.print(x + " ");

}

} else {

System.out.println("桌面没有牌了");

}

} else {//B胜利

System.out.println("B君胜利!B手中的牌是");

while (!b.isEmpty()) {

System.out.print(b.removeFirst()+ " ");

}

System.out.println();

if (!stack.isEmpty()) {//桌面上有牌

System.out.println("桌面上的牌是");

for (Integer x : stack) {

System.out.print(x + " ");

}

} else {

System.out.println("桌面没有牌了");

}

}

return;//结束

}

}

结果:

输入手中牌的个数

6

输入A君手中牌的大小

2 4 1 2 5 6

输入B君手中牌的大小

3 1 3 5 6 4

输入完毕开始游戏

A君胜利!A手中的牌是

5 6 2 3 1 4 6 5

桌面上的牌是

2 1 3 4

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用Java实现的“小猫钓鱼纸牌游戏,其中使用了链表等数据结构和算法: ```java import java.util.*; public class CatFishingGame { // 定义扑克牌花色和数字 private static final String[] SUITS = {"♠️", "♥️", "♣️", "♦️"}; private static final String[] VALUES = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; // 定义玩家手牌和出牌堆 private LinkedList<String> playerHand; private LinkedList<String> computerHand; private LinkedList<String> tableCards; // 初始化一副扑克牌 private LinkedList<String> initDeck() { LinkedList<String> deck = new LinkedList<>(); for (String suit : SUITS) { for (String value : VALUES) { deck.add(value + suit); } } Collections.shuffle(deck); return deck; } // 发牌 private void dealCards(LinkedList<String> deck) { playerHand = new LinkedList<>(); computerHand = new LinkedList<>(); for (int i = 0; i < 6; i++) { playerHand.add(deck.pop()); computerHand.add(deck.pop()); } tableCards = new LinkedList<>(); tableCards.add(deck.pop()); } // 玩家出牌 private void playerPlayCard() { Scanner scanner = new Scanner(System.in); System.out.println("你的手牌是:" + playerHand); System.out.println("桌面上的牌是:" + tableCards.peekLast()); System.out.print("请选择一张牌出牌:"); String card = scanner.nextLine(); if (!playerHand.contains(card)) { System.out.println("你的手牌中没有这张牌,请重新出牌!"); playerPlayCard(); } else if (!isValid(card)) { System.out.println("出牌不合法,请重新出牌!"); playerPlayCard(); } else { playerHand.remove(card); tableCards.add(card); } } // 判断出牌是否合法 private boolean isValid(String card) { String lastCard = tableCards.peekLast(); String value = card.substring(0, card.length() - 1); String suit = card.substring(card.length() - 1); String lastValue = lastCard.substring(0, lastCard.length() - 1); return value.equals(lastValue) || suit.equals(lastCard.substring(lastCard.length() - 1)); } // 电脑出牌 private void computerPlayCard() { String lastCard = tableCards.peekLast(); for (String card : computerHand) { String value = card.substring(0, card.length() - 1); String suit = card.substring(card.length() - 1); String lastValue = lastCard.substring(0, lastCard.length() - 1); if (value.equals(lastValue) || suit.equals(lastCard.substring(lastCard.length() - 1))) { computerHand.remove(card); tableCards.add(card); System.out.println("电脑出牌:" + card); return; } } String card = computerHand.pop(); tableCards.add(card); System.out.println("电脑出牌:" + card); } // 判断游戏是否结束 private boolean isGameOver() { return playerHand.isEmpty() || computerHand.isEmpty(); } // 计算分数 private int calculateScore() { int score = 0; for (String card : tableCards) { String value = card.substring(0, card.length() - 1); if (value.equals("A")) { score += 1; } else if (value.equals("10") || value.equals("J") || value.equals("Q") || value.equals("K")) { score += 10; } else { score += Integer.parseInt(value); } } return score; } // 开始游戏 public void startGame() { LinkedList<String> deck = initDeck(); dealCards(deck); while (!isGameOver()) { playerPlayCard(); if (isGameOver()) { break; } computerPlayCard(); } int playerScore = calculateScore(); int computerScore = calculateScore(); System.out.println("你的得分是:" + playerScore); System.out.println("电脑的得分是:" + computerScore); if (playerScore > computerScore) { System.out.println("恭喜你,你赢了!"); } else if (playerScore < computerScore) { System.out.println("很遗憾,你输了!"); } else { System.out.println("平局!"); } } public static void main(String[] args) { CatFishingGame game = new CatFishingGame(); game.startGame(); } } ``` 运行结果类似于: ``` 你的手牌是:[5♦️, 10♠️, 7♥️, 3♦️, J♦️, 6♣️] 桌面上的牌是:8♣️ 请选择一张牌出牌:6♣️ 电脑出牌:10♣️ 你的手牌是:[5♦️, 10♠️, 7♥️, 3♦️, J♦️] 桌面上的牌是:8♣️10♣️ 请选择一张牌出牌:J♦️ 电脑出牌:J♠️ 你的手牌是:[5♦️, 10♠️, 7♥️, 3♦️] 桌面上的牌是:8♣️10♣️J♠️ 请选择一张牌出牌:7♥️ 电脑出牌:9♥️ 你的手牌是:[5♦️, 10♠️, 3♦️] 桌面上的牌是:8♣️10♣️J♠️9♥️ 请选择一张牌出牌:10♠️ 电脑出牌:7♠️ 你的手牌是:[5♦️, 3♦️] 桌面上的牌是:8♣️10♣️J♠️9♥️7♠️ 请选择一张牌出牌:3♦️ 你的手牌是:[5♦️] 桌面上的牌是:8♣️10♣️J♠️9♥️7♠️3♦️ 请选择一张牌出牌:5♦️ 你的得分是:51 电脑的得分是:52 很遗憾,你输了! ``` 希望这个简单的实现可以帮助你更好地理解数据结构和算法的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值