第二章第3节纸牌游戏——小猫钓鱼

一、前言

1.游戏规则

将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(小哼和小哈手中牌的牌面只有1~9)

2.规则分析

  • 小哼和小哈有两种操作,分别是出牌和赢牌,这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。
  • 桌子就是一个栈,每打出一张牌放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
  • 枚举桌上的每一张牌,如果某人打出的牌与桌子上的某张牌相同,即可将两张牌以及中间所夹的牌全部取走。
  • 综上所述,我们需要两个队列、一个栈来模拟整个游戏。

二、源码

# 第 3 节 纸牌游戏——小猫钓鱼
class Queue:
    def __init__(self):
        self.data = [None] * 1000
        self.head = 0
        self.tail = 0
        self.name = None


class Stack:
    """top 用来存储栈顶,数组 data 用来存储栈中的元素,大小设置为 10。因为只有 9"""

    def __init__(self):
        self.data = [None] * 10
        self.top = 0


def init(s: str, name: str) -> Queue:
    """初始化-发牌"""
    q = Queue()
    q.head = 1
    q.tail = 1
    q.name = name

    for v in list(s):
        # print(v)
        q.data[q.tail] = v
        q.tail += 1
    # print(q.data)
    # print(q.tail)
    return q


def play(s: Stack, q: Queue):
    """出牌函数"""
    # print(q.name + '出牌时,桌面上的牌:' + str(s.data))
    # print(q.name + '手中的牌:' + get_card(q))

    # 小哼先亮出一张牌
    t = q.data[q.head]
    # 枚举桌上的每一张牌与 t 进行比对
    flag = 0
    if s.top > 0:
        temp = s.top
        while temp > 0:
            if s.data[temp] == t:
                flag = 1
                break
            temp -= 1
    # 如果 flag 的值为 0 就表明小哼没能赢得桌上的牌,将打出的牌留在桌上。
    if flag == 0:
        q.head += 1
        s.top += 1
        s.data[s.top] = t
    # 如果 flag 的值为 1 就表明小哼可以赢得桌上的牌,需要将赢得的牌依次放入小哼的手中。
    if flag == 1:
        q.head += 1  # 小哼已经打出一张牌,所以要把打出的牌出队
        q.data[q.tail] = t  # 因为此轮可以赢牌,所以紧接着把刚才打出的牌又放到手中牌的末尾
        q.tail += 1
        # 把桌上可以赢得的牌(从当前桌面最顶部一张牌开始取,直至取到与打出的牌相同为止)依次放到手中牌的末尾
        while s.data[s.top] != t:
            q.data[q.tail] = s.data[s.top]
            s.data[s.top] = None
            q.tail += 1
            s.top -= 1
        # 取走最后一张相等的牌
        q.data[q.tail] = s.data[s.top]
        q.tail += 1
        s.data[s.top] = None
        s.top -= 1


def get_card(q: Queue) -> str:
    rs = ''
    temp = q.head
    while temp < q.tail:
        rs += q.data[temp]
        temp += 1
    return rs


def get_table_card(s: Stack) -> str:
    rs = ''
    temp = 0
    while temp < len(s.data):
        if s.data[temp]:
            rs += s.data[temp]
        temp += 1
    return rs


def print_result(q: Queue, s: Stack):
    if q.head != q.tail:
        print(q.name + '胜利')
        rs = get_card(q)
        print('手中的牌是:' + rs)
        print('桌面上的牌是:' + get_table_card(s))


def game(q1: Queue, q2: Queue, s: Stack):
    # print("游戏开始")
    while (q1.head < q1.tail) and (q2.head < q2.tail):
        # 当任意一人手中的牌全部出完时,游戏结束,对手获胜。
        if q2.head < q2.tail:
            play(s, q1)
        if q1.head < q1.tail:
            play(s, q2)
            # 输出比赛结果
    print_result(q1, s)
    print_result(q2, s)


if __name__ == '__main__':
    # s1 = '241256'
    # s2 = '313564'
    s1 = input("输入小哼手中的牌:")
    s2 = input("输入小哈手中的牌:")
    qu1 = init(s1, "小哼")
    qu2 = init(s2, '小哈')
    # print(get_card(qu1))
    # print(get_card(qu2))
    # 桌面上的牌
    stack = Stack()
    # 开始出牌
    game(qu1, qu2, stack)

三、运行结果

猜你喜欢

转载自blog.csdn.net/cs373616511/article/details/115597686