好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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实现的源码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

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<integer> a = new linkedlist<integer>(); //a手中的牌

  linkedlist<integer> b = new linkedlist<integer>(); //b手中的牌

  stack<integer> 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

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

原文链接:https://blog.csdn.net/qq_24046745/article/details/52723671

查看更多关于java实现纸牌游戏之小猫钓鱼算法的详细内容...

  阅读:14次